之前有好几次碰到文件操作方面的问题,大都由于时间太赶而没有好好花时间去细致的研究研究。每次都是在百度或者博客或者论坛里面參照着大牛们写的步骤照搬过来,之后再次碰到又忘记了。刚好今天比較清闲。于是就在网上找了找Java经常使用的file文件操作方面的资料。之后加以一番整理。现分享给大家。

直接上源代码吧。

  1. package com.file;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. import java.nio.ByteBuffer;
  11. import java.nio.MappedByteBuffer;
  12. import java.nio.channels.FileChannel;
  13. import java.text.DateFormat;
  14. import java.text.SimpleDateFormat;
  15. import java.util.Date;
  16.  
  17. /**
  18. * file operate
  19. * @author ruanpeng
  20. * @time 2014-11-11上午9:14:29
  21. */
  22. public class OperateFileDemo {
  23.  
  24. private DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS");
  25. private Date start_time = null;//開始时间
  26. private Date end_time = null;//结束时间
  27.  
  28. public static void main(String[] args) {
  29. OperateFileDemo demo = new OperateFileDemo();
  30. demo.operateFile1();
  31. demo.operateFile2();
  32. demo.operateFile3();
  33. demo.fileCopy1();
  34. demo.fileCopy2();
  35. }
  36.  
  37. /**
  38. * the first method of reading file
  39. */
  40. public void operateFile1(){
  41. start_time = new Date();
  42. File f = new File("E:"+File.separator+"test.txt");//File.separator——windows is '\'。unix is '/'
  43. try {
  44. //创建一个流对象
  45. InputStream in = new FileInputStream(f);
  46. //读取数据,并将读取的数据存储到数组中
  47. byte[] b = new byte[(int) f.length()];//数据存储的数组
  48. int len = 0;
  49. int temp = 0;
  50. while((temp = in.read()) != -1){//循环读取数据,未到达流的末尾
  51. b[len] = (byte) temp;//将有效数据存储在数组中
  52. len ++;
  53. }
  54.  
  55. System.out.println(new String(b, 0, len, "GBK"));
  56. in.close();
  57. } catch (FileNotFoundException e) {
  58. e.printStackTrace();
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }finally{
  62. end_time = new Date();
  63. System.out.println("==============第一种方式——start_time:"+df.format(start_time));
  64. System.out.println("==============第一种方式——end_time:"+df.format(end_time));
  65. System.out.println("==============第一种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
  66. }
  67. }
  68.  
  69. /**
  70. * the second method of reading file
  71. */
  72. public void operateFile2(){
  73. start_time = new Date();
  74. File f = new File("E:"+File.separator+"test.txt");
  75. try {
  76. InputStream in = new FileInputStream(f);
  77. byte[] b = new byte[1024];
  78. int len = 0;
  79. while((len = in.read(b)) != -1){
  80. System.out.println(new String(b, 0, len, "GBK"));
  81. }
  82. in.close();
  83. } catch (FileNotFoundException e) {
  84. e.printStackTrace();
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }finally{
  88. end_time = new Date();
  89. System.out.println("==================另外一种方式——start_time:"+df.format(start_time));
  90. System.out.println("==================另外一种方式——end_time:"+df.format(end_time));
  91. System.out.println("==================另外一种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
  92. }
  93. }
  94.  
  95. /**
  96. * the third method of reading file(文件读取(Memory mapping-内存映射方式))
  97. * 这样的方式的效率是最好的,速度也是最快的,由于程序直接操作的是内存
  98. */
  99. public void operateFile3(){
  100. start_time = new Date();
  101. File f = new File("E:"+File.separator+"test.txt");
  102. try {
  103. FileInputStream in = new FileInputStream(f);
  104. FileChannel chan = in.getChannel();//内存与磁盘文件的通道,获取通道,通过文件通道读写文件。
  105.  
  106. MappedByteBuffer buf = chan.map(FileChannel.MapMode.READ_ONLY, 0, f.length());
  107. byte[] b = new byte[(int) f.length()];
  108. int len = 0;
  109. while(buf.hasRemaining()){
  110. b[len] = buf.get();
  111. len++;
  112. }
  113. chan.close();
  114. in.close();
  115. System.out.println(new String(b,0,len,"GBK"));
  116. } catch (FileNotFoundException e) {
  117. e.printStackTrace();
  118. } catch (IOException e) {
  119. e.printStackTrace();
  120. }finally{
  121. end_time = new Date();
  122. System.out.println("======================第三种方式——start_time:"+df.format(start_time));
  123. System.out.println("======================第三种方式——end_time:"+df.format(end_time));
  124. System.out.println("======================第三种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
  125. }
  126. }
  127.  
  128. /**
  129. * the first method of copying file
  130. */
  131. public void fileCopy1(){
  132. start_time = new Date();
  133. File f = new File("E:"+File.separator+"test.txt");
  134. try {
  135. InputStream in = new FileInputStream(f);
  136. OutputStream out = new FileOutputStream("F:"+File.separator+"test.txt");
  137. int len = 0;
  138. while((len = in.read()) != -1){
  139. out.write(len);
  140. }
  141. out.close();
  142. in.close();
  143. } catch (FileNotFoundException e) {
  144. e.printStackTrace();
  145. } catch (IOException e) {
  146. e.printStackTrace();
  147. }finally{
  148. end_time = new Date();
  149. System.out.println("======================第一种文件复制方式——start_time:"+df.format(start_time));
  150. System.out.println("======================第一种文件复制方式——end_time:"+df.format(end_time));
  151. System.out.println("======================第一种文件复制方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
  152. }
  153. }
  154.  
  155. /**
  156. * 使用内存映射实现文件复制操作
  157. */
  158. public void fileCopy2(){
  159. start_time = new Date();
  160. File f = new File("E:"+File.separator+"test.txt");
  161. try {
  162. FileInputStream in = new FileInputStream(f);
  163. FileOutputStream out = new FileOutputStream("F:"+File.separator+"test2.txt");
  164. FileChannel inChan = in.getChannel();
  165. FileChannel outChan = out.getChannel();
  166. //开辟缓冲区
  167. ByteBuffer buf = ByteBuffer.allocate(1024);
  168. while ((inChan.read(buf)) != -1){
  169. //重设缓冲区
  170. buf.flip();
  171. //输出缓冲区
  172. outChan.write(buf);
  173. //清空缓冲区
  174. buf.clear();
  175. }
  176. inChan.close();
  177. outChan.close();
  178. in.close();
  179. out.close();
  180. } catch (FileNotFoundException e) {
  181. e.printStackTrace();
  182. } catch (IOException e) {
  183. e.printStackTrace();
  184. }finally{
  185. end_time = new Date();
  186. System.out.println("======================另外一种文件复制方式——start_time:"+df.format(start_time));
  187. System.out.println("======================另外一种文件复制方式——end_time:"+df.format(end_time));
  188. System.out.println("======================另外一种文件复制方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
  189. }
  190. }
  191. }

说明:

前面三种方法是关于文件的读取操作,第一种和另外一种是比較常见的普通方式,第三种则是採用内存映射的模式。这样的模式是直接操作内存。效率是最快的,后面两种是关于文件的读取和写入操作。

这就是上面的程序执行的结果,上面说到第三种方式是直接面向内存的,效率是最快的,但是我们发现第三种的执行结果却还没有另外一种方式快,详细的原因我还没有进行深入探究,并且我的文件容量也比較小,看不出什么本质的效果,并且这个也不过读取操作,但最后的那个文件复制操作效果就相当明显了。不不过读取操作。同一时候还涉及到了文件的写操作,普通的复制方式须要105毫秒。而採用内存映射的方式只只须要1毫秒。效果立刻明晓了。

至于读操作的效率问题有兴趣的朋友能够去深入探究一番。

原文出处:http://www.open-open.com/lib/view/open1415448427183.html

java中的File文件读写操作的更多相关文章

  1. Java 字符流实现文件读写操作(FileReader-FileWriter)

    Java 字符流实现文件读写操作(FileReader-FileWriter) 备注:字符流效率高,但是没有字节流底层 字节流地址:http://pengyan5945.iteye.com/blog/ ...

  2. java学习(九) —— java中的File文件操作及IO流概述

    前言 流是干什么的:为了永久性的保存数据. IO流用来处理设备之间的数据传输(上传和下载文件) java对数据的操作是通过流的方式. java用于操作流的对象都在IO包中. java IO系统的学习, ...

  3. java中实现File文件的重命名(renameTo)、将文件移动到其他目录下、文件的复制(copy)、目录和文件的组合(更加灵活方便)

    欢迎加入刚建立的社区:http://t.csdn.cn/Q52km 加入社区的好处: 1.专栏更加明确.便于学习 2.覆盖的知识点更多.便于发散学习 3.大家共同学习进步 3.不定时的发现金红包(不多 ...

  4. JAVA基于缓冲的文件读写操作

    File f2 = new File("e://index.java"); BufferedReader reader = new BufferedReader(new Input ...

  5. java文件读写操作类

    借鉴了项目以前的文件写入功能,实现了对文件读写操作的封装 仅仅需要在读写方法传入路径即可(可以是绝对或相对路径) 以后使用时,可以在此基础上改进,比如: 写操作: 1,对java GUI中文本框中的内 ...

  6. Java 字节流实现文件读写操作(InputStream-OutputStream)

    Java 字节流实现文件读写操作(InputStream-OutputStream) 备注:字节流比字符流底层,但是效率底下. 字符流地址:http://pengyan5945.iteye.com/b ...

  7. [转]Android - 文件读写操作 总结

     转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...

  8. Kotlin入门(27)文件读写操作

    Java的文件处理用到了io库java.io,该库虽然功能强大,但是与文件内容的交互还得通过输入输出流中转,致使文件读写操作颇为繁琐.因此,开发者通常得自己重新封装一个文件存取的工具类,以便在日常开发 ...

  9. Kotlin入门-文件读写操作

    转 https://blog.csdn.net/aqi00/article/details/83241762 Java的文件处理用到了io库java.io,该库虽然功能强大,但是与文件内容的交互还得通 ...

随机推荐

  1. 单例/单体模式(Singleton)

    单例/单体模式(Singleton) 首先,单例模式是对象的创建模式之一,此外还包括工厂模式. 单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3, ...

  2. 洛谷 [P2859] 摊位预定

    贪心 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm ...

  3. 【NOIP2016练习】T2 跑跑步 (数论)

    : 这场的难度是从高到低的 ..]of longint; n,m,i,ans:longint; function gcd(x,y:longint):longint; var r:longint; be ...

  4. es6总结(十二)--generator

  5. Adoquery的 moveby和GotoBookmark,RecNo

    GotoBookmark 是必须存在的记录,再次返回原来那个记录的位置,但是原来的那个记录必须存在,所以不适合[删除订单后回到原来的位置],因为原来的订单已经不存在了,删除了, moveby(),从当 ...

  6. Thread线程的基础知识及常见疑惑点

    引言 相信各位道友在平时工作中已经很少直接用到Thread线程类了,现在大多是通过线程池或者一些多线程框架来操作线程任务,但我觉得还是有必要了解清楚Thread线程类中各种方法的含义,了解了底层才能更 ...

  7. [功能集锦] 001 - java下载文件

    @RequestMapping("/downloadxls.action") public void downloadxls(HttpServletRequest request, ...

  8. Codeforces 401D Roman and Numbers

    题目大意 Description 给定一个数 N(N<1018) , 求有多少个经过 N 重组的数是 M(M≤100) 的倍数. 注意: ①重组不能有前导零; ②重组的数相同, 则只能算一个数. ...

  9. arch 安装

    xfce参考 http://my.oschina.net/u/1408707/blog/182581#OSC_h2_6 chm阅读 – chmsee作为一个苦逼的码农,要忍受各种chm文件的蹂躏,这个 ...

  10. Android-TextView属性ellipsize多行失效的解决思路

    多余文字显示省略号的常规做法 android:ellipsize="end" //省略号显示在末尾 android:ellipsize="middle" //省 ...