流:表明任何有能力產出數據的數據源對象或者是有能力接受數據的接收端對象 ;其做用是爲數據源和目的地創建一個輸送通道。html
IO流:是程序中一套用於數據傳輸的機制。IO流是Input流和Output流的簡稱。流的輸入輸出是以程序爲參照物。java
一、輸入流linux
數據從外部流向程序。例如讀取文件,就是從外部流入程序。程序員
二、輸出流數組
數據從程序流向外部。例如將程序中的數據寫入到文件中。緩存
一、根據方向可分爲:輸入流和輸出流網絡
二、根據形式:分爲字符流(字符類型文件:txt、java、html等)和字節流(圖片、視頻、音頻等)。spa
三、四大基本流都是抽象類,都不能直接建立對象。操作系統
四、數據的來源/目的地:磁盤、網絡、內存和外部設備。code
一、從文件中讀取數據:FileReader類
FileReader類時Reader的一個實現子類。FileReader對象中經常使用的是read方法,返回讀取的字符串個數。
不傳入數組,源碼中會自動建立一個長度爲1的數組,將讀取值放入到數組中,返回讀取到的字符值;傳入數組,底層會將讀取到的字符放入到對應數組中,並返回讀取到的字符個數。
示例以下:
//1.每次讀取一個字符
//建立了一個輸入流對象指向D盤下的a.txt //文件字符輸入流沒有緩衝區 FileReader reader = new FileReader("D:\\a.txt"); //讀取數據 //每次只讀取一個字符,因此返回值也就是表示讀取到的這個字符 // int i1 = reader.read(); // System.out.println(i1); //定義一個變量記錄每次讀取的字符 int i; //讀取到末尾會返回 -1 //這種寫法是錯誤的,表示讀一個跳一個 // while((i = reader.read()) != -1) { // System.out.println(reader.read()); // } // while((i = reader.read()) != -1) { System.out.println(i); } //關流 reader.close(); //2.每次讀取多個字符
FileReader reader = new FileReader("D:\\a.txt"); //定義一個字符數組做爲緩衝區 char[] cs = new char[5]; //將數據讀取到緩衝區 // reader.read(cs); // System.out.println(new String(cs)); //返回值表示本次讀取到的字符個數 //定義一個變量記錄讀取的個數; //文件中一共有11個字符 //第一次讀取的時候,讀取到了5個字符,因此len的值爲5 //第二次讀取的時候,讀取到了5個字符,因此len的值爲5 //第三次讀取的時候,讀取到了1個字符,因此len的值爲1 //第四次讀取的時候,讀取到了文件末尾,因此len的值爲-1 int len; //將讀取到的數據放到數組中,而返回值表示王數組中放的字符個數 while((len = reader.read(cs)) != -1) { //String(value, offset, len) //從value數組的第offset爲開始,將len個元素轉爲字符串 System.out.println(new String(cs, 0 , len)); } reader.close();
二、向txt文件中寫入字符串 --FileWriter
FileWriter類時Writer的一個實現子類。FileWriter對象中經常使用的是write方法,表示將數據寫入到文件中。
示例以下:
//建立一個新文件 //若是原文件不存在,則操做建立的這個新文件 //若是源文件已存在,則利用新文件覆蓋源文件 FileWriter writer = new FileWriter("D:\\a.txt"); //寫出數據 //在寫數據的時候,這個數據並不直接寫到文件中而是先寫到緩衝區中 //當緩衝區寫滿了以後,再將緩衝區中的數據寫入到文件中 //在緩衝區沒有寫滿的時候,程序就已經結束 //結果致使數據死在了緩存區 writer.write("detgagf"); //沖刷緩衝區 //將數據從緩衝區中衝到文件中 writer.flush(); //關閉流 //爲了釋放文件以容許別的流來操做這個文件 //流一旦關閉,就不能再次開啓 //close以前,流自動進行一次flush操做,以免有數據死在緩衝區 writer.close(); //清空引用將其標記爲垃圾對象 writer = null;
一、文件字節輸入流 FileInputStream
FileInputStream類時InputStream的一個實現子類。FileInputStream對象中經常使用的是write方法,表示將數據寫入到文件中。 文件字節流沒有緩衝區,可定義字節數組做爲緩衝區。示例以下
FileInputStream in = new FileInputStream("D:\\b.txt"); //讀取到的是字節 //定義一個字節數組做爲緩衝區 byte[] bs = new byte[10]; int len; while((len = in.read(bs)) != -1) { System.out.println(new String(bs, 0 , len)); } in.close();
二、文件字節輸出流 FileOutputStream
FileOutputStream類時OutputStream的一個實現子類。FileOutputStream對象中經常使用的是write方法,表示將數據寫入到文件中。能夠定義一個字節數組做爲緩衝區。
示例以下:
FileOutputStream fs = new FileOutputStream("D:\\b.txt"); //寫出數據 //字節輸出流沒有緩衝區 fs.write("abc".getBytes()); //關流 fs.close();
一、字符輸入緩衝流 BufferedReader
在構建的時候須要傳入一個Reader對象。真正讀取數據依靠的是傳入的這個Reader對象,BufferedReader從Reader對象中獲取數據提取到緩衝區。其本質是FileReader的一個包裝類。省去了程序員人爲爲FileReader提供數組緩衝區的步驟。
示例以下:
//真正讀取文件的是FileReader //FileReader自己沒有緩衝區 FileReader reader = new FileReader("D:\\a.txt"); //BufferedReader將FileReader讀取的數據進行緩衝 //BufferedReader提供緩衝區 BufferedReader br = new BufferedReader(reader); //讀取一行 //String str = br.ReadLine(); // System.out.println(str); //定義一個變量用來記錄讀取的每一行數據 String str; //若是讀取到末尾,返回的是null while((str = br.readLine()) != null) { System.out.println(str); } //關流 只關閉外層流就行 br.close();
二、字符輸出緩衝流 --BufferedWriter
提供了一個更大的緩衝區,其中提供了一個newLine()方法,用於進行換行操做,以屏蔽不一樣操做系統的差別性。
示例以下:
//真正向文件中寫數據的流是FileWirter //BufferedWriter提供了一個更大的緩衝區 BufferedWriter writer = new BufferedWriter(new FileWriter("D:c.txt")); writer.write("sdsakj"); //在Windows中,換行通常用\r\n //在linux中,換行只用\n //進行換行,屏蔽不一樣操做系統的差別性 writer.newLine(); writer.write("4564561"); writer.close();
一、不管流操做成功與否,關流操做都得發生,因此須要將關流操做放到finally代碼塊中。
二、爲了讓流對象在finally依然可以使用,因此須要將流對象放在try以外聲明,而且要賦值爲null,而後放在try以內進行實際的初始化過程。
三、在關流以前要判斷對象是否初始化成功,實際上就是判斷流對象是否爲null;
四、由於關流有可能失敗,此時流會依然佔用文件,因此須要將流對象置爲null,標記爲垃圾對象進行強制回收以釋放內存;
五、若是流有緩衝區,那麼爲了防止關流失敗致使沒有進行自動沖刷,因此須要手動沖刷一次,以防止有數據死在緩衝區而產生數據丟失。
流異常處理實例以下:
//2.須要將流對象放在try以外聲明而且賦值爲null FileWriter writer = null; try { // 2.將流對象放在try以內進行初始化 writer = new FileWriter("F:\\a.txt"); writer.write("積分聖誕節"); //5.爲了防止關流失敗沒有自動flush而致使數據產生丟失 writer.flush(); } catch (IOException e) { e.printStackTrace(); } finally { //3.在關流以前要判斷對象是否初始化成功,實際上就是判斷流對象是否爲null if(writer != null) { try {
//1.不管寫流成功仍是失敗,都須要關流 writer.close(); } catch (IOException e) { e.printStackTrace(); } finally { //4.若是關流失敗,將該流標記爲垃圾對象,強制回收 //若是關流成功,將該流標記爲垃圾對象,釋放內存 writer = null; } } }