`

java需要关注的知识点--新I0(NIO)之大文件读取

nio 
阅读更多
在读取大文件的时候,采用管道方式进行分流,使用byteBuffer把文件分成一段段的进行读写。
生成大文件 :
public class ProductionFile {
	private static void productFile() throws FileNotFoundException {
		File file = new File("D://larger.txt");
		PrintWriter pw = new PrintWriter(file);
		try{
			for (int i = 0;i<1024;i++) {
				for (int j = 0;j <1024;j++){
					for(int k = 0;k<1024;i++){
					pw.write(i+":" +j);
					}
					pw.flush();
				}
				pw.flush();
			}
		}finally{
			pw.close();
		}
	}
	public static void main(String[] args) {
		try {
			productFile();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}


读文件:
public class LargeMappedFiles {
	static int length = 0x300000;
	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException {
		File file = new File("D://larger.txt");
		FileChannel fileChannel = new RandomAccessFile(file, "rw")
				.getChannel();
		/**
		 * map(FileChannel.MapMode mode,long position, long size) mode -
		 * 根据是按只读、读取/写入或专用(写入时拷贝)来映射文件,分别为 FileChannel.MapMode 类中所定义的
		 * READ_ONLY、READ_WRITE 或 PRIVATE 之一 position - 文件中的位置,映射区域从此位置开始;必须为非负数
		 * size - 要映射的区域大小;必须为非负数且不大于 Integer.MAX_VALUE
		 * 所以若想读取文件后半部分内容,如例子所写;若想读取文本后1
		 * /8内容,需要这样写map(FileChannel.MapMode.READ_ONLY,
		 * f.length()*7/8,f.length()/8)
		 * 想读取文件所有内容,需要这样写map(FileChannel.MapMode.READ_ONLY, 0,f.length())
		 */
		MappedByteBuffer inputBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length()/40);
		long start = System.currentTimeMillis();
		byte[] dst = new byte[length];
		System.out.println("File size:" + inputBuffer.capacity());
		for( int offSet = 0; offSet<inputBuffer.capacity(); offSet += length) {
			if(inputBuffer.capacity() - offSet > length) {
				for (int i = 0 ; i < length ; i++) {
					dst[i] = inputBuffer.get(offSet + i	);
					if (i == 10)
						 System.out.println("i:" + i+ " Value-->"+new String(dst,0, 40)+ "   " );

					
				}
			}else {
				for (int i = 0 ; i< inputBuffer.capacity() - offSet; i++) {
					byte b = inputBuffer.get(offSet + i	);
				}
			}
		}
		long end = System.currentTimeMillis();
		 System.out.println("Value-->"+new String(dst, 9990, 10000)+ "   " );
		System.out.println(end -start );
//		System.out.println(bb.get(count-10));
		
	}

}

采用NI0可以加快文件的读取速度!
public class MappedIO {
	private static int numOfInts = 4000000;
	private static int numberOfUbuffInts = 200000;
	private abstract static class Tester{
		private String name;
		public Tester(String name) {
			this.name = name;
		}
		public void runTest() {
			System.out.print(name + ":");
			try{
				long start = System.nanoTime();
				test();
				double duration = System.nanoTime() - start;
				System.out.format("%.2f\n",duration/1.0e9);
			}catch(IOException e){
				throw new RuntimeException(e);
			}
		}
		public abstract void test() throws IOException;
	}
	private static Tester[] tests = {
		new Tester("Stream Write") {
			public void test() throws IOException {
			DataOutputStream dos = new DataOutputStream(
					new BufferedOutputStream(new FileOutputStream(new File(
							"temp.temp"))));
			for(int i = 0 ;i<numOfInts ;i++){
				dos.writeInt(i);
			}
			dos.close();
			}
			
		},
		new Tester("Mapped Write") {

			public void test() throws IOException {
				FileChannel fc = new RandomAccessFile("temp.temp", "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 Reader") {
			public void test() throws IOException {
				DataInputStream dis = new DataInputStream(new BufferedInputStream(
						new FileInputStream(new File("temp.temp"))));
				for (int i = 0; i<numOfInts; i++) {
					dis.readInt();
				}
				dis.close();
			}
		} ,
		new Tester("Mapped Reader") {
			public void test() throws IOException {
				FileChannel fc = new RandomAccessFile("temp.temp","rw").getChannel();
				IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
				while(ib.hasRemaining()) {
					ib.get();
				}
				fc.close();
			}
		},
		new Tester("Stream Writer Reader") {
			public void test() throws IOException {
				RandomAccessFile raf = new RandomAccessFile(new File("temp.temp"),"rw");
				raf.writeInt(1);
				for(int i = 0; i<numberOfUbuffInts; i++){
					raf.seek(raf.length()-4);
					raf.writeInt(raf.readInt());
				}
				raf.close();
			}
			
		},
		new Tester("Mapped Writer/Reader") {
			public void test() throws IOException {
				FileChannel fc = new RandomAccessFile(new File("temp.temp"), "rw").getChannel();
				IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
				ib.put(0);
				for(int i=1;i<numberOfUbuffInts;i++) {
					ib.put(ib.get(i-1));
				}
				fc.close();
			}
			
		}
	};
	
	
	public static void main(String args[]) throws IOException {
		for (Tester test:tests) {
			test.runTest();
		}
	}
}

分享到:
评论

相关推荐

    Java多线程读取大文件

     接下来介绍一下实现思路以及相关的知识点。  内容  一、对文件分区  为了充分利用多线程读取,需要把文件划分成多个区域,供每个线程读取。那么需要有一个算法来计算出每个线程读取的开始位置和结束位置。...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包9

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包101

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包5

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    安卓java读取网页源码-init-Public-Project:init-公共项目

    安卓java读取网页源码 :fuel_pump:说明 好记性不如烂笔头,变秃才能变强。 该仓库作为我的收集导航页面,文章来源于自己博客或者互联网,记录了我在开发过程的点滴,希望这些内容可以指导我司其他人的后续开发,少走...

    Java资源包01

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包7

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Java面试高频知识点总结

    NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统 IO 基于字节流和字符流进行操作,而 NIO 基于 Channel 和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道...

Global site tag (gtag.js) - Google Analytics