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原理和上述字符流相似。值得注意的是字节流不需要刷新就可以直接写入文件中。