`
啸笑天
  • 浏览: 3462188 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

Java IO读写大文件的几种方式及测试

    博客分类:
  • java
 
阅读更多

读取文件大小:1.45G 
第一种,OldIO: (注意文件和系统编码)

 

public static void oldIOReadFile() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("G://lily_947.txt"));
		PrintWriter pw = new PrintWriter("G://oldIO.tmp");
		char[] c = new char[100*1024*1024];
		while(br.read(c) != -1){
			pw.print(c);
		}
		pw.close();
		br.close();
	}
 

耗时70.79s 


第二种,newIO: 

Java代码   收藏代码
  1. public static void newIOReadFile() throws IOException{  
  2.         FileChannel read = new RandomAccessFile("G://lily_947.txt","r").getChannel();  
  3.         FileChannel writer = new RandomAccessFile("G://newIO.tmp","rw").getChannel();  
  4.         ByteBuffer bb = ByteBuffer.allocate(200*1024*1024);  
  5.         while(read.read(bb)!=-1){  
  6.             bb.flip();  
  7.             writer.write(bb);  
  8.             bb.clear();  
  9.         }  
  10.         read.close();  
  11.         writer.close();  
  12.           
  13.     }  


耗时47.24s 


第三种,RandomAccessFile: 

Java代码   收藏代码
  1. public static void randomReadFile() throws IOException{  
  2.         RandomAccessFile read = new RandomAccessFile("G://lily_947.txt","r");  
  3.         RandomAccessFile writer = new RandomAccessFile("G://random.tmp","rw");  
  4.         byte[] b = new byte[200*1024*1024];  
  5.         while(read.read(b)!=-1){  
  6.             writer.write(b);  
  7.         }  
  8.         writer.close();  
  9.         read.close();  
  10.     }  


耗时46.65 

第四种,MappedByteBuffer: 

Java代码   收藏代码
  1. public static void mappedBuffer() throws IOException{  
  2.         FileChannel read = new FileInputStream("G://lily_947.txt").getChannel();  
  3.         FileChannel writer = new RandomAccessFile("G://buffer.tmp","rw").getChannel();  
  4.         long i = 0;  
  5.         long size = read.size()/30;  
  6.         ByteBuffer bb,cc = null;  
  7.         while(i<read.size()&&(read.size()-i)>size){  
  8.             bb = read.map(FileChannel.MapMode.READ_ONLY, i, size);  
  9.             cc = writer.map(FileChannel.MapMode.READ_WRITE, i, size);  
  10.             cc.put(bb);  
  11.             i+=size;  
  12.             bb.clear();  
  13.             cc.clear();  
  14.         }  
  15.         bb = read.map(FileChannel.MapMode.READ_ONLY, i, read.size()-i);  
  16.         cc.put(bb);  
  17.         bb.clear();  
  18.         cc.clear();  
  19.         read.close();  
  20.         writer.close();  
  21.           
  22.     }  


耗时:36 

前三种读法对应的资源占用图如下: 



 

 

 
相对于最后一种内存直接映射方式前面的测试其实无意义,基本秒杀。。。。。 
对于很大的文件直接分块映射时内存会不够,这是因为MappedByteBuffer未被释放造成的,sun未提供直接回收MappedByteBuffer区域的方法,这个时候有两种方法解决,第一种比较愚笨的: 

Java代码   收藏代码
  1.           System.gc();   
  2.          System.runFinalization();   
  3.          try {  
  4.     Thread.sleep(3000);  
  5. catch (InterruptedException e) {  
  6.       
  7.     e.printStackTrace();  
  8. }  


第二种网上找来的,利用反射调用clean方法: 

Java代码   收藏代码
  1. public static void unmap(final MappedByteBuffer buffer) {  
  2.         if (buffer == null) {  
  3.             return;  
  4.         }  
  5.         AccessController.doPrivileged(new PrivilegedAction<Object>() {  
  6.             public Object run() {  
  7.                 try {  
  8.                     Method getCleanerMethod = buffer.getClass().getMethod("cleaner"new Class[0]);  
  9.                     if (getCleanerMethod != null) {  
  10.                         getCleanerMethod.setAccessible(true);  
  11.                         Object cleaner = getCleanerMethod.invoke(buffer, new Object[0]);  
  12.                         Method cleanMethod = cleaner.getClass().getMethod("clean"new Class[0]);  
  13.                         if (cleanMethod != null) {  
  14.                             cleanMethod.invoke(cleaner, new Object[0]);  
  15.                         }  
  16.                     }  
  17.                 } catch (Exception e) {  
  18.                     e.printStackTrace();  
  19.                 }  
  20.                 return null;  
  21.             }  
  22.    
  23.         });  
  24.     }  


以上两种方法感觉都别扭,还有就是可以自己分割成物理文件再循环调用,这个也不太美观。 
速度也会减慢好多。

 

感谢:http://aronlulu.iteye.com/blog/1018370#comments

  • 大小: 14.4 KB
  • 大小: 14.2 KB
  • 大小: 12.9 KB
分享到:
评论

相关推荐

    Java IO流几种经典使用方式

    ### Java IO流几种经典使用方式 #### 一、输入输出流(Input/Output Stream) 在Java中,`java.io`包提供了处理输入/输出操作的基本类,主要包括`InputStream`和`OutputStream`。 ##### 1. 字节流(Byte Stream) **...

    使用Java实现对dbf文件的简单读写

    使用 Java 实现对 dbf 文件的简单读写需要使用以下几个类: 1. DBFWriter:用于 dbf 文件的写操作,提供了写入 dbf 文件的方法。 2. JDBField:用于表示 dbf 文件中的字段信息,包括字段名、字段类型、字段长度等。...

    java io 与java nio区别

    - **Java IO**:采用流(Stream)的方式进行数据读写,数据以字节流或字符流的形式进行传输。 - **Java NIO**:采用缓冲区(Buffer)的方式进行数据读写。所有的数据都会先加载到缓冲区中,再通过通道(Channel)进行读写...

    java io.pdf

    7. **NIO(New IO)**:从Java 1.4开始引入,NIO提供了一种非阻塞的I/O模型,适合高并发和大容量数据传输场景。关键组件包括选择器(Selector)、通道(Channel)和缓冲区(Buffer)。 8. **文件系统操作**:Java还提供了...

    java-IO操作-(读写、追加、删除、移动、复制、修改).doc

    文件读取操作是 java IO 操作的基础,主要有以下几种方式: 1. 按字节读取文件内容:以字节为单位读取文件内容,常用于读取二进制文件。 2. 按字符读取文件内容:以字符为单位读取文件内容,常用于读取文本、数字等...

    Java,彻底明白Java语言中的IO系统

    Java IO系统提供了以下几种转换流: - `InputStreamReader`:将字节流转换为字符流。 - `OutputStreamWriter`:将字符流转换为字节流。 #### 6. 过滤器流 过滤器流是在原有流的基础上添加额外功能的流,它可以对...

    javaIO详细讲解+详细案例

    ### Java IO 流详解 #### 一、Java IO 流概念及作用 Java IO(Input/Output)流是Java编程语言中的一个重要组成部分,主要用于...无论是简单的文件读写还是复杂的网络通信,Java IO流都能提供灵活且高效的解决方案。

    java全栈工程师-java io

    ### 常见几种IO操作 #### 1. 文件IO - **FileInputStream/FileOutputStream**:用于处理文件的字节流读写。 - **FileReader/FileWriter**:用于处理文件的字符流读写。 - **BufferedReader/BufferedWriter**:提供...

    Java IO

    Java IO的基本概念之一是流,它是一种数据传输的方式。Java中的流被抽象成一系列连续的数据元素,这些数据元素可以是字节或字符。流分为两种基本类型:输入流和输出流。输入流是从外部源读取数据到程序,而输出流则...

    java_IO操作_(读写、追加、删除、移动、复制、修改)

    Java提供了多种方式来读取文件内容,主要分为以下几种: - **按字节读取**:适用于读取二进制文件,如图片、音频或视频文件。使用`FileInputStream`类,通过`read()`方法一次读取一个字节,或一次读取多个字节到...

    Java基础篇:IO流.pdf

    Java中的IO流主要分为输入流和输出流两大类,每类又可以根据数据处理方式的不同细分为多种具体实现。本知识点将深入探讨Java IO流的相关细节,包括节点流与处理流的概念,以及文件流、标准输入输出流、缓冲流、转换...

    JAVA读写文件小实例

    首先,我们需要理解Java中的几个关键类,如`java.io.File`、`java.io.FileReader`、`java.io.FileWriter`、`java.io.BufferedReader`和`java.io.BufferedWriter`,它们在文件操作中起着核心作用。 `File`类是Java中...

    java读写文件的集中方式

    本文将详细介绍几种常见的Java文件读写方式,包括按行读取和写入、随机读取以及按字节读取。 1. **按行读取和写入** 在Java中,我们可以使用`BufferedReader`和`PrintWriter`类来实现按行读取和写入文件。`...

    Java流(文件读写操作)

    ### Java流(文件读写操作) #### 一、流的分类 Java中处理文件和数据时,使用流的概念来进行操作。根据不同的标准,流可以分为几种类型。 ##### 1. 按数据流动方向 - **输入流**:主要用于从数据源读取数据。输入...

    Java IO, NIO and NIO.2

    Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...

    java io案例

    Java IO(输入/输出)是Java编程语言中的一个重要部分,用于处理各种数据流,包括从文件、网络、设备等读取数据以及向这些地方写入数据。本案例将深入探讨Java IO流的基本概念、主要类库及其在实际编程中的应用。 ...

    基于java的读写文本文件的示例代码.zip

    - **PrintWriter**:`java.io.PrintWriter`提供了一种方便的方式来写入文本,支持自动换行。 ```java File file = new File("path_to_output_file"); PrintWriter writer = new PrintWriter(file); writer....

    java基础 IO流

    java基础中的IO流是Java提供的一套用于文件读写操作的流式API,它包括字节流和字符流两种基本类型。字节流主要用在处理二进制数据,而字符流则是处理文本数据。 首先,文档中提到了`File`类,它是IO流操作中用于...

Global site tag (gtag.js) - Google Analytics