之前有好几次碰到文件操作方面的问题,大都因为时间太赶而没有好好花时间去仔细的研究研究,每次都是在百度或者博客或者论坛里面参照着大牛们写的步骤照搬过来,之后再次碰到又忘记了,刚好今天比较清闲,于是就在网上找了找Java常用的file文件操作方面的资料。之后加以一番整理,现分享给大家。
直接上源码吧。
package com.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; /** * file operate * @author ruanpeng * @time 2014-11-11上午9:14:29 */ public class OperateFileDemo { private DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS"); private Date start_time = null;//开始时间 private Date end_time = null;//结束时间 public static void main(String[] args) { OperateFileDemo demo = new OperateFileDemo(); demo.operateFile1(); demo.operateFile2(); demo.operateFile3(); demo.fileCopy1(); demo.fileCopy2(); } /** * the first method of reading file */ public void operateFile1(){ start_time = new Date(); File f = new File("E:"+File.separator+"test.txt");//File.separator——windows is '\',unix is '/' try { //创建一个流对象 InputStream in = new FileInputStream(f); //读取数据,并将读取的数据存储到数组中 byte[] b = new byte[(int) f.length()];//数据存储的数组 int len = 0; int temp = 0; while((temp = in.read()) != -1){//循环读取数据,未到达流的末尾 b[len] = (byte) temp;//将有效数据存储在数组中 len ++; } System.out.println(new String(b, 0, len, "GBK")); in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ end_time = new Date(); System.out.println("==============第一种方式——start_time:"+df.format(start_time)); System.out.println("==============第一种方式——end_time:"+df.format(end_time)); System.out.println("==============第一种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒"); } } /** * the second method of reading file */ public void operateFile2(){ start_time = new Date(); File f = new File("E:"+File.separator+"test.txt"); try { InputStream in = new FileInputStream(f); byte[] b = new byte[1024]; int len = 0; while((len = in.read(b)) != -1){ System.out.println(new String(b, 0, len, "GBK")); } in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ end_time = new Date(); System.out.println("==================第二种方式——start_time:"+df.format(start_time)); System.out.println("==================第二种方式——end_time:"+df.format(end_time)); System.out.println("==================第二种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒"); } } /** * the third method of reading file(文件读取(Memory mapping-内存映射方式)) * 这种方式的效率是最好的,速度也是最快的,因为程序直接操作的是内存 */ public void operateFile3(){ start_time = new Date(); File f = new File("E:"+File.separator+"test.txt"); try { FileInputStream in = new FileInputStream(f); FileChannel chan = in.getChannel();//内存与磁盘文件的通道,获取通道,通过文件通道读写文件。 MappedByteBuffer buf = chan.map(FileChannel.MapMode.READ_ONLY, 0, f.length()); byte[] b = new byte[(int) f.length()]; int len = 0; while(buf.hasRemaining()){ b[len] = buf.get(); len++; } chan.close(); in.close(); System.out.println(new String(b,0,len,"GBK")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ end_time = new Date(); System.out.println("======================第三种方式——start_time:"+df.format(start_time)); System.out.println("======================第三种方式——end_time:"+df.format(end_time)); System.out.println("======================第三种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒"); } } /** * the first method of copying file */ public void fileCopy1(){ start_time = new Date(); File f = new File("E:"+File.separator+"test.txt"); try { InputStream in = new FileInputStream(f); OutputStream out = new FileOutputStream("F:"+File.separator+"test.txt"); int len = 0; while((len = in.read()) != -1){ out.write(len); } out.close(); in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ end_time = new Date(); System.out.println("======================第一种文件复制方式——start_time:"+df.format(start_time)); System.out.println("======================第一种文件复制方式——end_time:"+df.format(end_time)); System.out.println("======================第一种文件复制方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒"); } } /** * 使用内存映射实现文件复制操作 */ public void fileCopy2(){ start_time = new Date(); File f = new File("E:"+File.separator+"test.txt"); try { FileInputStream in = new FileInputStream(f); FileOutputStream out = new FileOutputStream("F:"+File.separator+"test2.txt"); FileChannel inChan = in.getChannel(); FileChannel outChan = out.getChannel(); //开辟缓冲区 ByteBuffer buf = ByteBuffer.allocate(1024); while ((inChan.read(buf)) != -1){ //重设缓冲区 buf.flip(); //输出缓冲区 outChan.write(buf); //清空缓冲区 buf.clear(); } inChan.close(); outChan.close(); in.close(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ end_time = new Date(); System.out.println("======================第二种文件复制方式——start_time:"+df.format(start_time)); System.out.println("======================第二种文件复制方式——end_time:"+df.format(end_time)); System.out.println("======================第二种文件复制方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒"); } } }
前面三种方法是关于文件的读取操作,第一种和第二种是比较常见的普通方式,第三种则是采用内存映射的模式,这种模式是直接操作内存,效率是最快的,后面两种是关于文件的读取和写入操作。
这就是上面的程序运行的结果,上面说到第三种方式是直接面向内存的,效率是最快的,可是我们发现第三种的运行结果却还没有第二种方式快,具体的原因我还没有进行深入探究,而且我的文件容量也比较小,看不出什么本质的效果,而且这个也仅仅是读取操作,但最后的那个文件复制操作效果就相当明显了,不仅仅是读取操作,同时还涉及到了文件的写操作,普通的复制方式需要105毫秒,而采用内存映射的方式仅仅只需要1毫秒,效果立马明晓了。
至于读操作的效率问题有兴趣的朋友可以去深入探究一番。
原文出处:http://www.open-open.com/lib/view/open1415448427183.html
原文地址:http://blog.csdn.net/hu1991die/article/details/41010025