`

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 nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    Large-File-Processing-master_javanio_java大文件处理_

    本项目“Large-File-Processing-master_javanio_java大文件处理_”显然专注于通过Java NIO实现大文件处理,下面我们将详细探讨相关的知识点。 1. **Java NIO基础**:NIO的核心组件包括通道(Channels)、缓冲区...

    Java读取大文件的处理

    Java读取大文件的处理是Java编程中的一项重要技术,特别是在处理大文件时需要注意性能和响应速度。下面我们将对Java读取大文件的处理技术进行详细的介绍。 标题解释 Java读取大文件的处理是指使用Java语言来读取大...

    Java-NIO-Programming-Cookbook(含源码)

    理解Java NIO中的`ByteBuffer`涉及以下关键知识点: 1. **通道(Channels)**:通道是数据的来源或目的地,如文件通道、套接字通道等。它们可以与缓冲区交互,读取或写入数据。 2. **选择器(Selectors)**:选择...

    Java-NIO2教程

    ### Java-NIO2教程知识点详解 #### I/O发展简史 - **JDK1.0-1.3**: 在此期间,Java的I/O模型主要依赖于传统的阻塞I/O方式,这种模式下,应用程序在等待I/O操作完成时无法执行其他任务,导致效率低下。此外,当时的...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    总结一下,这个压缩包中的文件涵盖了以下Java NIO关键知识点: 1. 通道(Channel):如FileChannel,用于连接到I/O源和目的地。 2. 缓冲区(Buffer):如ByteBuffer和FloatBuffer,作为数据的临时存储区域,支持...

    java读取文件内容

    根据给定文件的信息,我们可以总结出以下几个关键的Java知识点: ### 1. 文件操作 #### 1.1 文件读取 在Java中,文件读取是通过`java.io`包中的类来实现的。本例中用到了`BufferedReader`和`FileReader`。 - **...

    Java读取文件并对其排序后重新写入文件

    在Java编程中,读取文件、对数据进行排序并重新写入文件是常见的操作,尤其在数据处理和分析场景中。下面将详细讲解这个过程,包括相关知识点和具体实现。 首先,我们需要导入Java的`java.io`包,该包包含了处理...

    java-NIO-demo

    Java NIO(Non-blocking Input/Output)是一种在Java中处理I/O操作的新方式,相比于传统的BIO( Blocking I/O),NIO提供了更高效的数据传输能力,尤其在处理大量并发连接时。NIO的核心概念包括通道(Channels)、...

    Java IO, NIO and NIO.2

    Java NIO(New Input/Output)是Java在JDK 1.4中引入的新I/O机制,旨在提高I/O操作的性能。NIO基于缓冲区(Buffers)、通道(Channels)、选择器(Selectors)等概念。 缓冲区是NIO中一个核心概念,它是一个对象,...

    主题JAVANIO简介知识点.pdf

    ### 主题JAVANIO简介知识点 #### 一、基本概念与Java标准IO回顾 **基本概念** 在计算机科学中,I/O(Input/Output,输入/输出)是指主存和外部设备(如硬盘、终端、网络等)之间拷贝数据的过程。I/O操作是操作...

    Java-NIO-系列教程

    ### Java NIO 系列教程知识点详解 #### 一、Java NIO 概述 Java NIO (New IO) 是 Java SE 1.4 版本引入的一种新的输入/输出方式,它提供了一种替代传统的 Java IO 包的方式。Java NIO 主要包括三个核心组成部分:*...

    java NIO详细教程

    ### Java NIO 详细教程知识点解析 #### 一、Java NIO 概述 Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java ...

Global site tag (gtag.js) - Google Analytics