之前有好几次碰到文件操作方面的问题,大都由于时间太赶而没有好好花时间去细致的研究研究。每次都是在百度或者博客或者论坛里面參照着大牛们写的步骤照搬过来,之后再次碰到又忘记了。刚好今天比較清闲。于是就在网上找了找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