A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© asinzuo 中级黑马   /  2015-8-31 12:51  /  248 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

总结:对于输出到文件操作,用pw最省事,带换行、带刷新,名称短。


这里通过三组方法来实现文件复制,并揭示一个小现象。


FileReader 与PrintWriter  比较简便的文本操作方法

FileInputStream 与FileOutputStream  任何类型的文件都适用

BufferedReader 与BufferedWriter 带缓冲区,效率高

  1. /**
  2.          * 复制硬盘上的文件,将f.txt数据复制到write.txt
  3.          * @throws Exception
  4.          */
  5.         private static void readData1() throws Exception {

  6.                
  7.                 //关联一个本地文件,f.txt,不加路径表示是当前目录
  8.                 //eclispe当期目录是当前的java project在硬盘的位置
  9.                 FileReader fr = new FileReader("f.txt");
  10.                
  11.                 //关联一个硬盘上的文件,用于输出数据
  12.                 PrintWriter pw = new PrintWriter("write.txt");
  13.                
  14.                 char[] buf = new char[1024];        //用char数组来存储读到的数据
  15.                 int len = 0;        //用于表示char数组中新读取到的数据长度
  16.                 while((len=fr.read(buf))!=-1)        //-1表示读到文件末尾,没读到文件末尾就一直读
  17.                 {
  18.                         //输出数据
  19.                         //最后一个char数组可能不是读满1024个字符,所以要指定输出的char数组的长度
  20.                         //因为print不支持输出指定长度的char数组,所以转成String,否则文件末尾会有很多空格
  21.                        
  22.                         pw.println(new String(buf,0,len));
  23.                 }
  24.                
  25.                 fr.close();        //fr调用了底层资源,关闭资源
  26.                 pw.close();        //关闭资源,也起到了将数据刷到硬盘的作用
  27.                
  28.         }
复制代码

打开write.txt发现文件最后一行比源文件多了一个换行。是因为用了pw的println的原因吗?

用字节输出流来写数据试试。

  1. /**
  2.          * 复制硬盘上的文件,将f.txt数据复制到write.txt
  3.          * @throws Exception
  4.          */
  5.         private static void readData2() throws Exception {

  6.                 //源文件
  7.                 FileInputStream fis = new FileInputStream("f.txt");

  8.                 //关联一个硬盘上的文件,用于输出数据
  9.                 FileOutputStream fos = new FileOutputStream("write.txt");

  10.                 byte [] buf = new byte[1024];        //用byte数组来存储读到的数据
  11.                 int len = 0;        //用于表示char数组中新读取到的数据长度
  12.                 while((len=fis.read(buf))!=-1)        //-1表示读到文件末尾,没读到文件末尾就一直读
  13.                 {
  14.                         //输出数据
  15.                         //最后一个char数组可能不是读满1024个字符,所以要指定输出的char数组的长度
  16.                         //因为print不支持输出指定长度的char数组,所以转成String,否则文件末尾会有很多空格

  17.                         fos.write(buf,0,len);
  18.                 }

  19.                 //关闭资源
  20.                 fis.close();       
  21.                 fos.close();       
  22.         }
复制代码

这次新文件最后没有换行了。

再试试用bufferwriter写数据

  1. /**
  2.          * 复制硬盘上的文件,将f.txt数据复制到write.txt
  3.          * @throws Exception
  4.          */
  5.         private static void readData3() throws Exception{

  6.                 //源文件
  7.                 BufferedReader bufr = new BufferedReader(new FileReader("f.txt"));

  8.                 //关联一个硬盘上的文件,用于输出数据
  9.                 BufferedWriter bufw = new BufferedWriter(new FileWriter("write.txt"));

  10.                 String line = null;        //用line来存储读到的一行数据
  11.                 while((line=bufr.readLine())!=null)        //null表示读到文件末尾,没读到文件末尾就一直读
  12.                 {
  13.                         //输出数据
  14.                         bufw.write(line);       
  15.                         bufw.newLine();         //写一个换行符
  16.                         bufw.flush();        //将数据刷到硬盘上
  17.                 }

  18.                 //关闭资源
  19.                 bufr.close();       
  20.                 bufw.close();
  21.         }
复制代码

发现,新文件最后这次也多了个换行。

这里也是因为写了最后一行数据后,又写了一个换行符bufw.newLine();


所以还是字节流比较规范。





0 个回复

您需要登录后才可以回帖 登录 | 加入黑马