一.流的概念:java
流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。它的特性是進行數據傳輸;數組
通俗理解:例如從水源地長江把水導入自來水廠,而後又從自來水廠把水送到各家各戶。從長江到自來水廠之間的管道咱們能夠稱之爲輸入流,從自來水廠把水送到各家各戶的管道咱們稱之爲輸出流,咱們大概能夠這麼理解。工具
二.流的分類:測試
根據數據類型分爲:字符流和字節流,根據流的方向分爲輸入流和輸出流。spa
三.字節流和字符流線程
字節流:InputStream和OutputStream是java中能夠按照最小字節單位讀取的流,即每次讀寫一個字節,字節流是直接鏈接到輸入源的流。code
字符流:是以字符爲單位進行數據處理的IO流。本質其實就是基於字節流讀取時,去查找指定的碼錶。對象
字節流以字節爲單位,字符流以字符爲單位,一次可讀2個字節,字節流可用於處理全部類型數據,而字符流只能處理字符類型的數據。
只要是處理純文本就優先考慮使用字符流,除此以外都使用字節流blog
四.輸入流和輸出流ip
輸入流是指程序從數據源中讀取數據。只進行讀操做;
輸出流是指將數據從程序中寫到指定的文件中;
五.IO流結構圖
字節輸入流InputStream:
InputStream 是全部的輸入字節流的父類,它是一個抽象類。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三種基本的介質流,它們分別從Byte 數組、StringBuffer、和本地文件中讀取數據。
PipedInputStream 是從與其它線程共用的管道。
ObjectInputStream 和全部FilterInputStream 的子類都是裝飾流。
字節輸出流OutputStream:
OutputStream 是全部的輸出字節流的父類,它是一個抽象類。
ByteArrayOutputStream、FileOutputStream 是兩種基本的介質流,它們分別向Byte 數組、和本地文件中寫入數據。
PipedOutputStream 是向與其它線程共用的管道中寫入數據。
ObjectOutputStream 和全部FilterOutputStream 的子類都是裝飾流。
字符輸入流Reader:
Reader 是全部的輸入字符流的父類,它是一個抽象類。
CharReader、StringReader 是兩種基本的介質流,它們分別將Char 數組、String中讀取數據。
PipedReader 是從與其它線程共用的管道中讀取數據。
BufferedReader 很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader 對象。
FilterReader 是全部自定義具體裝飾流的父類,其子類PushbackReader 對Reader 對象進行裝飾,會增長一個行號。
InputStreamReader 是一個鏈接字節流和字符流的橋樑,它將字節流轉變爲字符流。FileReader 能夠說是一個達到此功能、經常使用的工具類,在其源代碼中明顯使用了將FileInputStream 轉變爲Reader 的方法。咱們能夠從這個類中獲得必定的技巧。Reader 中各個類的用途和使用方法基本和InputStream 中的類使用一致。
字符輸出流Writer:
Writer 是全部的輸出字符流的父類,它是一個抽象類。
CharArrayWriter、StringWriter 是兩種基本的介質流,它們分別向Char 數組、String 中寫入數據。
PipedWriter 是向與其它線程共用的管道中寫入數據。
BufferedWriter 是一個裝飾器爲Writer 提供緩衝功能。PrintWriter 和PrintStream 極其相似,功能和使用也很是類似。
OutputStreamWriter 是OutputStream 到Writer 轉換的橋樑,它的子類FileWriter 其實就是一個實現此功能的具體類。
九.經常使用例子
使用FileInputStream類讀取文件內容
1. import java.io.FileInputStream; 2. import java.io.FileNotFoundException; 3. import java.io.IOException; 4. /** 5. * 數據輸入流測試 7. * 8. */ 9. public class firstIO { 10. //程序的主方法 11. public static void main(String [] args) throws IOException{ 12. int i=0; 13. FileInputStream in=null; 14. try { 15. in=new FileInputStream("C:Users15080Desktopaaaa.txt");//從文件外讀數據 16. } catch (FileNotFoundException e) { 17. // TODO: handle exception 18. System.out.println("找不到文件位置"); 19. System.exit(-1); 20. } 21. try { 22. int num=0;//用於字節個數的計數 23. while((i=in.read())!=-1){ 24. System.out.println((char)i);//將獲得的ASCII碼值轉換成字符型 25. num++; 26. } 27. in.close(); 28. System.out.println("傳輸字節個數:"+num); 29. } catch (Exception e) { 30. // TODO: handle exception 31. System.out.println("讀取文件錯誤"); 32. } 34. } 36. }
使用FileOutputStream寫入文件
import java.io.FileInputStream; import java.io.FileOutputStream; /** * 輸入輸出流測試 * * */ public class outIO { //程序主方法 public static void main(String []args){ int i=0; FileInputStream in=null; FileOutputStream out=null; try { //實例化FileInputStream,FileOutputStream對象 in=new FileInputStream("C:\\Users\\15080\\Desktop\\aaaa.txt"); out=new FileOutputStream("C:\\Users\\15080\\Desktop\\bbbb.txt"); while((i=in.read())!=-1){ out.write(i); System.out.println((char)i); } in.close(); out.close(); System.out.println("文件已複製"); } catch (Exception e) { // TODO: handle exception System.out.println("文件複製錯誤"); System.exit(-1); } } }
使用FileRead、FileWriter複製文件
import java.io.FileReader; import java.io.FileWriter; public class TestFieldWriter1 { public static void main(String []args){ FileReader fr=null; FileWriter fw=null; try { fr=new FileReader("C:\\Users\\15080\\Desktop\\eeee.txt");//要讀取的文件 fw=new FileWriter("C:\\Users\\15080\\Desktop\\ffff.txt");//要複製的目的文件 int i=0; while((i=fr.read())!=-1){ fw.write(i); System.out.println((char)i);//將獲得的ASCII碼值轉換成字符型 } fr.close(); fw.close(); } catch (Exception e) { // TODO: handle exception } } }