`
imaginecup
  • 浏览: 87592 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java编程思想 IO11 源码 内存映射访问与性能

阅读更多
package com.io;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class LargeMappedFiles {

	/**
	 * 内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件
	 */
	static int length=0x8FFFFFF;//128MB
	public static void main(String[] args) throws IOException {
		//public abstract class MappedByteBufferextends ByteBuffer直接字节缓冲区,其内容是文件的内存映射区域。
		//映射的字节缓冲区是通过 FileChannel.map 方法创建的。此类用特定于内存映射文件区域的操作扩展 ByteBuffer 类。 
		MappedByteBuffer out=new RandomAccessFile("test.dat","rw").getChannel().
		 map(FileChannel.MapMode.READ_WRITE,0,length);
		//必须指定映射文件的初始位置和映射区域的长度
		for(int i=0;i<length;i++){
			out.put((byte)'x');
		}
		System.out.println("Finish writing");
		for(int i=length/2;i<length/2+6;i++){
			System.out.println((char)out.get(i));
		}
		
	}

}

 

package com.io;


import java.io.*;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel;

public class MappedIO {

	/**
	 * 测试内存映射文件的访问速度
	 */
	private static int numofints=4000000;
	private static int numofubuffints=200000;
	private abstract static class Tester{
		private String name;
		public Tester(String name){
			this.name=name;
		}
		//runTest()被用做是一种模板方法,为匿名内部子类中定义的test()的各种实现创建了测试框架
		public void runTest() {
			System.out.println(name+": ");
			long start=System.nanoTime();
			try {
				test();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			long duration=System.nanoTime()-start;
			System.out.format("%.2f\n", duration/1.0e9);
		}
		public abstract void test() throws IOException;
	}
	private static Tester[] tests={
		new Tester("Stream Writer"){
			public void test()throws IOException{
				DataOutputStream dos=new DataOutputStream(
						new BufferedOutputStream(new FileOutputStream(
								new File("temp.tmp"))));
				for(int i=0;i<numofints;i++){
					dos.writeInt(i);
				}
				dos.close();
					
			}
		},new Tester("Mapped Writer"){
			public void test()throws IOException{
				FileChannel fc=new RandomAccessFile("temp.tmp","rw").getChannel();
				IntBuffer ib=fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();//将此通道的文件区域直接映射到内存中。 
				for(int i=0;i<numofints;i++){
					ib.put(i);
				}
				fc.close();
					
			}
		},new Tester("Stream Read"){
			public void test()throws IOException{
				DataInputStream dis=new DataInputStream(
						new BufferedInputStream(new FileInputStream(
						"temp.tmp")));
				for(int i=0;i<numofints;i++){
					dis.readInt();
				}
				dis.close();	
			}
		},
		new Tester("Mapped Read"){
			public void test()throws IOException{
				FileChannel fc=new FileInputStream(new File("temp.tmp")).getChannel();
				IntBuffer ib=fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()).asIntBuffer();
				while(ib.hasRemaining()){
					ib.get();
				}
				fc.close();
					
			}
		},
		new Tester("Stream Read/Write"){
			public void test()throws IOException{
				RandomAccessFile raf=new RandomAccessFile(new File("temp.tmp"),"rw");
				raf.writeInt(1);
				for(int i=0;i<numofubuffints;i++){
					raf.seek(raf.length()-4);
					raf.writeInt(raf.readInt());
				}
				raf.close();
					
			}
		},
		new Tester("Mapped Read/Write"){
			public void test()throws IOException{
				FileChannel fc=new RandomAccessFile(new File("temp.tmp"),"rw").getChannel();
				IntBuffer ib=fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
				ib.put(0);
				for(int i=1;i<numofubuffints;i++){
					ib.put(ib.get(i-1));
				}
				fc.close();
			}
		}
	};
	public static void main(String[] args) throws IOException {
		for(Tester test:tests){
			
			test.runTest();
		}
/*测试结果如下:Stream Writer: 
1.29
Mapped Writer: 
0.07
Stream Read: 
1.16
Mapped Read: 
0.07
Stream Read/Write: 
38.49
Mapped Read/Write: 
0.01
*/

	}

}

 

0
1
分享到:
评论

相关推荐

    框架源码 API JAVA

    7. **数据持久化**:ORM(对象关系映射)框架如Hibernate,通过源码我们可以学习如何将Java对象与数据库表进行映射,实现数据库操作。 8. **网络编程**:对于涉及网络通信的框架,如Netty,源码分析可以揭示TCP/IP...

    孙卫琴《Java面向对象编程》配套PPT及书中源码

    《Java面向对象编程》是孙卫琴先生撰写的一本深入探讨Java编程的著作,尤其注重面向对象的思想和实践。这本书的配套PPT和源码,为读者提供了丰富的学习资源,帮助理解和掌握Java语言的核心概念。 PPT部分,通常包含...

    Java人事管理系统源码 HR人事管理系统源码.rar

    1. **Java编程基础**:作为系统的基础,开发者需要熟悉Java语言的基本语法、面向对象编程思想,以及常用的Java集合框架如ArrayList、HashMap等。同时,对于多线程、异常处理、IO流等核心概念也需要有深入理解。 2. ...

    Java学习网站汇总

    - 书籍:《Thinking in Java》是经典的Java学习书籍,深入讲解了Java编程思想。 12. **开发工具和框架**: - Spring框架:Java企业级应用开发的主流框架,包括Spring Boot、Spring MVC等。 - Hibernate和MyBatis...

    Java项目开源源码.zip

    Java项目开源源码.zip是一个包含Java编程语言的开源项目源代码的压缩文件。这个压缩包可能是一个完整的软件项目,供开发者学习、参考或参与贡献。它涵盖了从设计、实现到测试的全过程,对于想要深入理解Java开发或者...

    Java程序设计源代码

    在这些源代码中,你可以深入了解Java语言的基本结构、语法和编程思想。下面,我们将深入探讨Java编程的一些核心知识点。 1. **Java基础语法**:Java是一种面向对象的编程语言,其基础语法包括数据类型(如整型、...

    Java毕业设计源码-基于Javajava班级管理系统(+系统)(IT计算机专业Java源代码资料).zip

    1. **Java基础**:项目的基石是扎实的Java语言基础,包括面向对象编程思想、类与对象、封装、继承、多态、接口等核心概念。此外,还需要掌握异常处理、集合框架(如ArrayList、LinkedList、HashMap等)以及IO流等...

    android编程典型实例与项目开发源码

    《Android编程典型实例与项目开发源码》是吴亚峰编著的一本深入浅出的Android开发教程,书中涵盖了从基础到进阶的各种实例和项目。通过对这些源码的学习,开发者可以快速掌握Android应用程序设计的核心技能。以下是...

    commons-io-2.2-src.zip

    总结,Apache Commons IO 2.2源代码为我们提供了一个丰富的学习资源,通过深入研究,不仅可以提升对Java IO的理解,还能学习到优秀的编程技巧和设计思想。在Eclipse环境中导入源码,可以方便地进行调试和学习,...

    各种jar包的源码

    通过阅读这些库的源码,开发者不仅可以提升自身的技术水平,还能学习到优秀的设计思想和编程实践。在实际项目中,这有助于编写出更高效、更稳定的代码。同时,源码研究也能帮助开发者解决遇到的问题,因为他们可以...

    XML与Java 对象的数据转换 Smooks

    &lt;title&gt;Java编程思想 布鲁斯·艾克 &lt;publisher&gt;Addison-Wesley ``` 对应一个简单的`Book` Java类: ```java public class Book { private String title; private String author; private String publisher; ...

    JavaSource.zip

    这些源码对于开发者来说是宝贵的教育资源,通过阅读和分析,可以深入了解Java语言的设计思想,学习如何利用新特性提高代码质量,同时也能掌握各个版本之间的差异。无论是初学者还是经验丰富的开发者,都能从中...

    java毕业设计&课设-智能用电.zip

    下面我们将深入探讨该项目涉及的Java编程知识点、设计思想以及可能的技术实现。 1. **Java基础**:项目的基础是扎实的Java语言能力,包括面向对象编程(OOP)概念,如类、对象、封装、继承、多态等。同时,项目中...

    Java常用开源框架总结.docx

    源码层面上,深入研究其设计思想和实现细节,可以提升编程技能和对 Java 核心概念的理解。 在实际开发中,选择合适的 Apache Commons 组件可以大大简化任务,提高代码质量。了解每个组件的特性和用途,结合项目需求...

    java 语言基础总结

    Java语言基础总结 Java是一种广泛使用的面向对象的...Java语言基础的学习不仅仅是掌握语法,更重要的是理解面向对象的思想,并能够熟练运用设计模式来解决实际问题。不断实践和学习,才能真正掌握这门强大的编程语言。

    guava1.9-jar和源码 附在线API地址

    Guava对Java集合框架进行了扩展,提供了一些高效且功能丰富的类,如Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet和ImmutableMap等。这些集合不仅线程安全,而且在处理特定场景时性能更优,...

    java导出源码-JavaMindMap:结合个人对Java基础知识、框架、源码的认识,整理出相应的思维导图便于理解

    JavaMindMap是一个开源项目,旨在帮助开发者通过思维导图的方式来理解和学习Java基础知识、框架以及源码。这个项目的核心思想是将复杂的编程...通过该项目,你可以深入了解Java编程的各个方面,提升自己的编程技能。

    工资管理系统java源码-what2watch:每个软件开发专业人员都应该观看的视频列表。由拉脱维亚软件Craft.io社区策划

    工资管理系统java源码 :warning: 该项目已被弃用 (有效的工作组织) (黑客,娱乐) (大重写,增量重构) (职业发展) (软件架构、模块化模式、Java) (软件架构、权衡、复杂性) (软件架构、cqrs、事件溯源)...

    新奥家电连锁网络系统.zip

    包括面向对象的编程思想(类、对象、继承、多态、封装)、异常处理、集合框架(List、Set、Map等)、IO流、多线程、反射等核心概念。 2. **Spring框架**:新奥家电连锁网络系统可能采用了Spring框架进行业务逻辑的...

    JavaEE.doc

    - **Java编码惯例**:学习并遵循Java编程的最佳实践,如命名规则、代码结构等。 - **递归处理**:理解递归的概念,学会编写递归函数解决复杂问题。 - **常用算法**:了解并能够实现排序、查找等基本算法。 - **...

Global site tag (gtag.js) - Google Analytics