java之IO流详解(一)

 IO流

IO分为两大类:字节流和字符流。体系结构如下:

一般来说处理纯文本文件时用字符流较方便,默认编码。

对于非文本文件需要用字节流处理,比如图片。

字符流:

常用类:

FileReader和fileWriter :效率低一次只能读取一个字符

bufferedReader和bufferedWriter :具有缓存功能。可以此读取一行String readLine();

inputStreamReader是字节流转向字符流的通道

outputStreamWriter是字符流转向字节流的通道

Reader的常用方法:

  close();关闭流

   int read();读取一个字符

  int read(char[] buf);  将字符读入数组。

  int read(char buf,int off,int len)将字符读入数组的某一部分。

  mark();标记流当前的位置

  boolean markSupported() ;判断此流是否支持 mark() 操作

  long skip(long n);跳过n个字符

构造方法:new FileReader(File file);new FileReader(String filename),FileReader(FileDescriptor fd)

  1 public  class test{
  2 
  3     public static void main(String[] args) {
  4         // TODO Auto-generated method stub
  5         //demo1();
  6         //demo2();
  7         //demo3();
  8         
  9         demo4();
 10         
 11         
 12     }
 13 
 14     private static void demo4() {
 15         /*
 16          * 输入源:文本文件
 17          * 是否需要缓存:否
 18          * 输出处:文件中
 19          * */
 20         FileReader fr=null;
 21         FileWriter fw=null;
 22         try {
 23             fr=new FileReader("D:\\test.txt");//若此文件不存在会抛出异常java.io.FileNotFoundException: 
 24             fw=new FileWriter("D:\\test1.txt");//若文件test1.txt文件存在,则会覆盖,若不存在会重新创建一个
 25             char[] buf=new char[1024];//自定义一个容器,提高效率
 26             int len=0;
 27             while((len=fr.read(buf))!=-1){
 28                 fw.write(buf, 0, len);
 29                 fw.flush();//字符流需要在内存中进行刷新才能进入到磁盘中。
 30             }
 31         } catch (IOException e) {
 32             // TODO Auto-generated catch block
 33             e.printStackTrace();
 34         }finally{
 35             
 36             if(fr!=null){
 37                 try {
 38                     fr.close();
 39                 } catch (IOException e) {
 40                     // TODO Auto-generated catch block
 41                     e.printStackTrace();
 42                 }
 43             }
 44             if(fw!=null){
 45                 try {
 46                     fw.close();//关闭流之前会先刷新
 47                 } catch (IOException e) {
 48                     // TODO Auto-generated catch block
 49                     e.printStackTrace();
 50                 }
 51             }
 52             
 53         }
 54     }
 55 
 56     private static void demo3() {
 57         /*
 58          * 输入源:文本文件
 59          * 是否需要缓存:是
 60          * 输出处:文件中
 61          * */
 62         BufferedReader br=null;
 63         BufferedWriter bw=null;
 64         String line;
 65         try {
 66             br=new BufferedReader(new FileReader("D:\\test.txt"));
 67             bw=new BufferedWriter(new FileWriter("D:\\test1.txt",true));//在文件中追加内容true
 68             while((line=br.readLine())!=null){
 69                 bw.write(line);
 70                 bw.newLine();//换行
 71                 bw.flush();
 72                 
 73             }
 74         } catch (IOException e) {
 75             // TODO Auto-generated catch block
 76             e.printStackTrace();
 77         }finally{
 78             if(br!=null)
 79                 try {
 80                     br.close();
 81                 } catch (IOException e) {
 82                     // TODO Auto-generated catch block
 83                     e.printStackTrace();
 84                 }
 85             if(bw!=null){
 86                 try {
 87                     bw.close();
 88                 } catch (IOException e) {
 89                     // TODO Auto-generated catch block
 90                     e.printStackTrace();
 91                 }
 92             }
 93         }
 94     }
 95 
 96     private static void demo2() {
 97         /*
 98          * 输入源:键盘 
 99          * 是否需要缓存:是
100          * 输出处:文件中
101          * */
102         BufferedReader br=null;
103         BufferedWriter bw=null;
104         String line;
105         try {
106             br=new BufferedReader(new InputStreamReader(System.in));
107             bw=new BufferedWriter(new FileWriter("D:\\test1.txt",true));//在文件中追加内容true
108             while((line=br.readLine())!=null){
109                 if(line.equals("o"))
110                     break;
111                 bw.write(line);
112                 bw.newLine();//换行
113                 bw.flush();
114                 
115             }
116         } catch (IOException e) {
117             // TODO Auto-generated catch block
118             e.printStackTrace();
119         }finally{
120             if(br!=null)
121                 try {
122                     br.close();
123                 } catch (IOException e) {
124                     // TODO Auto-generated catch block
125                     e.printStackTrace();
126                 }
127             if(bw!=null){
128                 try {
129                     bw.close();
130                 } catch (IOException e) {
131                     // TODO Auto-generated catch block
132                     e.printStackTrace();
133                 }
134             }
135         }
136     }
137 
138     private static void demo1() {
139         /*
140          * 输入源:键盘 
141          * 是否需要缓存:是
142          * 输出处:控制台
143          * */
144         BufferedReader br=null;
145         PrintWriter pw=null;
146         String line;
147         try {
148             br=new BufferedReader(new InputStreamReader(System.in));
149             pw=new PrintWriter(System.out,true);
150             while((line=br.readLine())!=null){
151                 pw.println(line.toUpperCase());
152             }
153         } catch (IOException e) {
154             // TODO Auto-generated catch block
155             e.printStackTrace();
156         }finally{
157             if(br!=null)
158                 try {
159                     br.close();
160                 } catch (IOException e) {
161                     // TODO Auto-generated catch block
162                     e.printStackTrace();
163                 }
164             if(pw!=null)
165                 pw.close();
166             
167         }
168     }

写了几个例子,对上述几个类的应用,从其中应该可以发现规律。

另外PipedXXX适用于线程间的交流。

字符流在处理文本文件时较为方便,但若是非文本文件需要用字节流,比如图片。

字节流中的FileInputStream、FileOutputStream,BufferInputStream、BufferOutputStream原理和上述字符流相似。值得注意的是字节流不需要刷新就可以直接写入文件中。

 

posted on 2016-11-01 11:46  一朵云呀  阅读(385)  评论(0编辑  收藏  举报

导航