I :input,输入 ,O:output,输出 。I/O处理技术是Java语言中实现文件操作、内存操作、控制台输入以及网络编程的基础。

IO类

java.io

为了使输入和输出的结构保持统一,从而方便程序员使用IO相关的类,在Java语言的IO类设计中引入了一个新的概念——Stream(流)。

1、输入流(Input Stream):

该类流将外部数据源的数据转换为流,程序通过读取该类流中的数据,完成对于外部数据源中数据的读入。

 2、输出流(Output Stream):

该类流完成将流中的数据转换到对应的数据源中,程序通过向该类流中写入数据,完成将数据写入到对应的外部数据源中。

在java.io包中又实现了两类流:字节流(byte stream)和字符流(char stream)。

这两种流实现的是流中数据序列的单位,在字节流中,数据序列以byte为单位,也就是流中的数据按照一个byte一个byte的顺序实现成流,对于该类流操作的基本单位是一个byte;而对于字节流,数据序列以char为单位,也就是流中的数据按照一个char一个插入的顺序实现成流,对于该类流操作的基本单位是一个char。

字符输入流(Reader体系):

Reader体系中读取数据的基本单位是字符(Char),就是每次至少读取数据一个字符(两个字节)的数据。

体系常用方法:

void close()   关闭该流并释放与之关联的所有资源。 
  int read()    读取单个字符。 
  int read(char[] cbuf)    将字符读入数组。 
  int read(char[] cbuf, int off, int len)     将字符读入数组的某一部分。 
  int read(CharBuffer target)    试图将字符读入指定的字符缓冲区。

注意的是,创建Reader实例对象,和调用上述方法均会抛出IOException异常。

字符输出流(Writer体系):

 Writer体系中的类写入数据的基本单位是字符(char),也就是每次最少写入一个字符(两个字节)的数据。

体系常用方法

Writer append(char c)      将指定字符添加到此 writer。 
  Writer append(CharSequence csq)    将指定字符序列添加到此 writer。 
  Writer append(CharSequence csq, int start, int end)   将指定字符序列的子序列添加到此 writer.Appendable。 
  void close()      关闭此流,并在关闭之前刷新流。 
  void flush()       刷新该流的缓冲。 
  void write(char[] cbuf)     写入字符数组。 
  void write(char[] cbuf, int off, int len)         写入字符数组的某一部分。 
  void write(int c)         写入单个字符。 
  void write(String str)         写入字符串。 
  void write(String str, int off, int len)        写入字符串的某一部分。

练习1:

1. import java.io.*;  
2. public class IODemo1{  
3. public static void main(String[] args){   
4.     writTest();  
5.     readTest();           
6.     }  
7. public static void writTest(){  
8. null;//先定义fw的类型,并初始化为null  
9. try{  
10. new FileWriter("demo.txt"); //new FileWriter的实例对象  
11. "写入啊发把灯关掉非常v字的发的发的噶短发");             
12. catch(IOException e){  
13. throw new RuntimeException("写入错误!");  
14.         }  
15. //必须执行close方法  
16. finally{  
17. //close 也会抛异常,所以需要try catch。  
18. try{  
19. //当且仅当fw对象创建成功时才需要关闭资源。  
20. if(fw !=null)  
21.                     fw.close();  
22.             }  
23. catch(IOException e){}  
24.         }  
25.     }  
26. public static void readTest(){  
27. null;//先定义fr的类型,并初始化为null  
28. try{  
29. new FileReader("demo.txt");  
30. char[] fileBuff = new char[1024];//定义一个字符数组缓冲区,大小为2kB  
31. int len = 0; //读取的字符长度  
32. while((len=fr.read(fileBuff))!=-1){ //当read返回 -1时,即代表字符读取完毕。  
33. new String(fileBuff,0,len));  
34.             }  
35. catch(IOException e){  
36. throw new RuntimeException("读取错误!");  
37. finally{  
38. try{  
39. //当且仅当fr对象创建成功时才需要关闭资源。  
40. if(fr !=null)  
41.                     fr.close();  
42.             }  
43. catch(IOException e){}  
44.         }  
45.           
46.     }  
47. }


练习2,复制文本文件:

1. import java.io.*;  
2. public class FileCopyTest{  
3. public static void main(String[] args){  
4. "TestMain6.java","TestMain6.java.txt");  
5.     }  
6. public static void copyFile(String from,String to){   
7. null;  
8. null;  
9. try{  
10. new FileReader(from);  
11. new FileWriter(to);  
12. char[] buff = new char[1024]; //2kB  
13. int len = 0;  
14. while(len!=-1){  
15.                 len = fr.read(buff);  
16. if(len == -1){  
17. "复制结束.");  
18. break;}  
19. 0,len);  
20. "正在复制...");  
21.             }  
22.               
23. catch(IOException e){   
24. throw new RuntimeException("读写异常!");  
25. finally {  
26. try {  
27. if(fr != null)  
28.                     fr.close();  
29. catch (IOException e){   
30. throw new RuntimeException("异常!");  
31.             }  
32. try {  
33. if(fw != null)  
34.                     fw.close();  
35. catch (IOException e){   
36. throw new RuntimeException("异常!");  
37.             }             
38.         }         
39.     }  
40. }


练习3,模拟BufferedReader:

1. class MyBufferedReader extends Reader{  //继承Reader方法  
2. private Reader r;     
3. //接受Reader的实例流对象  
4. this.r = r;  
5.     }     
6. public String readLine() throws IOException{  //模拟行读取  
7. int ch =0;  
8. new StringBuilder(); //用StringBuilder来模拟缓冲  
9. while((ch=r.read())!=-1){  
10. if(ch =='\r')  
11. continue;  
12. if(ch =='\n')  //如果读到换行符,返回一行数据为字符串  
13. return sb.toString();  
14. else  
15. char)ch); //将读取的数据转换为char类型,并添加  
16.         }  
17. if(sb.length()!=0) //考虑到最后一行没有换行符的情况,如果缓冲还有数据则返回  
18. return sb.toString();  
19. return null;  
20.     }  
21. /**
22.     必须覆盖Reader类中的抽象方法。
23.     */  
24. public int read(char[] cbuf, int off, int len) throws IOException  
25.     {  
26. return r.read(cbuf,off,len) ;  
27.     }  
28. public void close()throws IOException{  
29.         r.close();  
30.     }     
31. }  
32. public class MyBufferedReaderDemo{  
33. public static void main(String[] args){  
34. null;  
35. null;  
36. try{  
37. new FileReader("IODemo.java");  
38. new MyBufferedReader(fr);  
39. null; //定义读取的行字符串  
40. while((line=myBufReader.readLine())!=null){  
41.                 System.out.println(line);  
42.             }  
43. catch(IOException e){}  
44. finally{   
45. try{  
46. if (myBufReader!=null)  
47.                     myBufReader.close();  
48. catch(IOException e){}  
49.         }  
50.     }  
51. }  
52.