Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32429
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 122
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 16:09
文章分类
文章存档

2014年(6)

2013年(12)

我的朋友

分类: Java

2013-12-29 15:08:58


Java IO流有4个基类:Reader(字符输入流),Writer(字符输出流),inputSream(字节输入流),outputStream(字节输出流)。

先来一个对字符流基本的输入输出操作。


[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.heima.io;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.File;  
  6. import java.io.FileReader;  
  7. import java.io.FileWriter;  
  8. import java.io.IOException;  
  9.   
  10. /** 
  11.  * 功能:复制文本文件 
  12.  */  
  13. public class ReadAndWriteTextFileDemo {  
  14.   
  15.     public static void main(String[] args) {  
  16.         // 基于当前目录  
  17.         File sourceFile = new File("1.txt");  
  18.         File targetFile = new File("2.txt");  
  19.         FileReader fr = null;  
  20.         FileWriter fw = null;  
  21.         BufferedReader br = null;  
  22.         BufferedWriter bw = null;  
  23.         try {  
  24.             fr = new FileReader(sourceFile);  
  25.             // 创建一个文件,如果文件存在则覆盖,追加模式不覆盖  
  26.             // new RandomAccessFile("1.txt", "rdw").seek(100)也可实现追加  
  27.             fw = new FileWriter(targetFile);  
  28.             // 对流进行封装,实现缓冲。  
  29.             // 把读取的数据缓冲到一个临时空间,然后一起写,提高了效率  
  30.             br = new BufferedReader(fr);  
  31.             bw = new BufferedWriter(fw);  
  32.             String line = null;  
  33.             while ((line = br.readLine()) != null) {  
  34.                 // 字符流要先转换成字节流,输出到缓冲区,文件实际上并没有进入目的地。  
  35.                 // 字节流就不需要flush,直接写到目的地。  
  36.                 bw.write(line);  
  37.                 // BufferedWriter不会把换行写入文件,所以要手动换行  
  38.                 bw.newLine();  
  39.                 // 及时刷新缓冲区数据  
  40.                 // 防止发生断电等意外导致缓存区数据没有刷新到目的地,但是耗资源  
  41.                 bw.flush();  
  42.             }  
  43.         } catch (Exception e) {  
  44.             e.printStackTrace();  
  45.         } finally {  
  46.             // 流应该一个一个的关,防止发生异常后,后面的流没有关闭  
  47.             // buffer的关闭实际上就是关闭了buffer封装的reader或writer流  
  48.             // 所以reader或writer流不用再关闭  
  49.             // 这也是可以用reader或writer作为匿名内部类的原因  
  50.             try {  
  51.                 if (br != null)  
  52.                     br.close();  
  53.             } catch (IOException e) {  
  54.                 e.printStackTrace();  
  55.             }  
  56.             try {  
  57.                 if (bw != null)  
  58.                     bw.close();  
  59.             } catch (IOException e) {  
  60.                 e.printStackTrace();  
  61.             }  
  62.         }  
  63.     }  
  64.   
  65. }  



然后,简单写一个模拟BufferedReader的readLine()和close()方法的类,加深对buffer封装流的理解



[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.heima.io;  
  2.   
  3. import java.io.BufferedWriter;  
  4. import java.io.FileReader;  
  5. import java.io.FileWriter;  
  6. import java.io.IOException;  
  7. import java.io.Reader;  
  8.   
  9. /** 
  10.  * 功能:简单模拟BufferedReader的readLine()和close()方法 
  11.  *  
  12.  * 问题:myReadLine()方法如果遇到某一行没有数据,就不会往下读了。 这是个问题,小弟暂时不知道怎么做,如果你知道,请告诉我 
  13.  */  
  14. public class MyBufferedReaderDemo {  
  15.   
  16.     public static void main(String[] args) {  
  17.         MyBufferedReader mbr = null;  
  18.         BufferedWriter bw = null;  
  19.         try {  
  20.             mbr = new MyBufferedReader(new FileReader("1.txt"));  
  21.             bw = new BufferedWriter(new FileWriter("2.txt"));  
  22.             String line = null;  
  23.             while ((line = mbr.myReadLine()) != null) {  
  24.                 bw.write(line);  
  25.                 bw.newLine();  
  26.                 bw.flush();  
  27.             }  
  28.         } catch (Exception e) {  
  29.             e.printStackTrace();  
  30.         } finally {  
  31.             try {  
  32.                 if (mbr != null)  
  33.                     mbr.myClose();  
  34.             } catch (Exception e) {  
  35.                 e.printStackTrace();  
  36.             }  
  37.             try {  
  38.                 if (bw != null)  
  39.                     bw.close();  
  40.             } catch (Exception e) {  
  41.                 e.printStackTrace();  
  42.             }  
  43.         }  
  44.   
  45.     }  
  46.   
  47.     /** 
  48.      * 自定义缓存读取类 
  49.      */  
  50.     static class MyBufferedReader {  
  51.   
  52.         private Reader reader = null;  
  53.   
  54.         public MyBufferedReader(Reader reader) {  
  55.             this.reader = reader;  
  56.         }  
  57.   
  58.         public String myReadLine() throws IOException {  
  59.             // StringBuilder(线程不安全) 与Stringbuffer的区别:  
  60.             // 参考:http://blog.csdn.net/rmn190/article/details/1492013  
  61.             StringBuilder sb = new StringBuilder();  
  62.             int ch = 0;  
  63.             while ((ch = reader.read()) != -1) {  
  64.                 // window的换行符是\r\n,linux是\n  
  65.                 // 读到换行的第一个字符\r,不再写数据,继续读  
  66.                 if (ch == '\r')  
  67.                     continue;  
  68.                 // 读到换行的第二个字符\n,不再读数据,返回已经读取的数据  
  69.                 if (ch == '\n')  
  70.                     break;  
  71.                 // 读取字符  
  72.                 else  
  73.                     sb.append((char) ch);  
  74.             }  
  75.             if (sb.length() > 0)  
  76.                 return sb.toString();  
  77.             else  
  78.                 return null;  
  79.         }  
  80.   
  81.         /** 
  82.          * Buffered关闭的实际上就是流 所以,关闭了Buffere就不用再关闭流 
  83.          */  
  84.         public void myClose() throws IOException {  
  85.             reader.close();  
  86.         }  
  87.   
  88.     }  
  89.   
  90. }  
阅读(196) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~