`
啸笑天
  • 浏览: 3436425 次
  • 性别: 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上百实例源码以及开源项目

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    Java之IO流学习总结

    “存在及合理”我们看看这些字节流中不太对称的几个类吧! LineNumberInputStream 主要完成从流中读取数据时,会得到相应的行号,至于什么时候分行、在哪里分行是由改类主动确定的,并不是在原始中有这样一个行号。...

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

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    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开源包10

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

    java开源包1

    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开源包7

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

    Java资源包01

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

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    5.2 相关知识 5.2.1 序列化的概念 5.2.2 序列化应用 5.2.3 序列化的几种方式 5.2.4 对象实现机制 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第3页。 5.2.1 序列化的概念 将在内存中的各种...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

Global site tag (gtag.js) - Google Analytics