java中IO流的知識點總結
1.流的概念
流是一組有順序的,有起點和終點的位元組集合,是對資料傳輸的總稱或抽象。即資料在兩裝置間的傳輸稱為流,流的本質是資料傳輸,根據資料傳輸特性將流抽象為各種類,方便更直觀的進行資料操作。
2.IO流的分類
IO流分為字元流和位元組流.
3.位元組流和字元流的區別
1.位元組流讀取的時候,讀到一個位元組就返回一個位元組; 字元流使用了位元組流讀到一個或多個位元組(中文對應的位元組數是兩個,在UTF-8碼錶中是3個位元組)時。先去查指定的編碼表,將查到的字元返回。
2.位元組流可以處理所有型別資料,如:圖片,MP3,AVI視訊檔案,而字元流只能處理字元資料。只要是處理純文字資料,就要優先考慮使用字元流,除此之外都用位元組流。
4.通過程式碼體現IO流中各種流的方法的使用
1.用普通位元組流複製a檔案的內容到b檔案中
public class CopyFileDemo { public static void main(String[] args) throws IOException { FileInputStream fis=new FileInputStream("a.txt"); FileOutputStream fos=new FileOutputStream("b.txt"); //方式一:一次讀取寫入單個位元組 int i=0; while((i=fis.read())!=-1){ fos.write(i); } fos.close(); fis.close(); //方式二:一次讀取寫入一個位元組陣列 byte[] by=new byte[1024]; int len=0; while((len=fis.read(by))!=-1){ fos.write(by,0,len); } fos.close(); fis.close(); } }
2.使用高效字元流複製檔案
public class CopyFileDemo3 { public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new FileReader("a.txt")); //如果d檔案中有資料,true表示繼續往檔案中追加資料 BufferedWriter bw=new BufferedWriter(new FileWriter("d.txt",true)); String line=null; //高效字元輸入流的特有方法readline(),每次讀取一行資料 while((line=br.readLine())!=null){ bw.write(line); //高效字元輸出流的特有方法newline() bw.newLine(); //將緩衝區中的資料刷到目的地檔案中 bw.flush(); } //關閉流,其實關閉的就是java呼叫的系統底層資源。在關閉前,會先重新整理該流。 bw.close(); br.close(); } } 注: a.高效流不能直接對檔案進行操作,必須通過普通流操作.高效流是從輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。 可以指定緩衝區的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了 b.位元組流在操作的時候本身是不會用到緩衝區(記憶體)的,是與檔案本身直接操作的,而字元流在操作的時候是使用到緩衝區的,並且可以使用flush方法強制進行重新整理緩衝區
5.轉換流
InputStreamReader 是位元組流通向字元流的橋樑
OutputStreamWriter 是字元流通向位元組流的橋樑
轉換流可以將位元組轉成字元,原因在於,將獲取到的位元組通過查編碼表獲取到指定對應字元。
轉換流的最強功能就是基於 位元組流 + 編碼表 。沒有轉換,沒有字元流
6.列印流
PrintWriter
PrintStream
注:
A:只操作目的地,不操作資料來源
B:可以操作任意型別的資料
C:如果啟用了自動重新整理,在呼叫println(),printf(),format()方法的時候,能夠換行並重新整理
D:可以直接操作檔案
7.序列化流
ObjectOutputStream序列化流
ObjectInputStream反序列化流
序列化:把物件作為一個整體按照流一樣的方式傳輸或者儲存。
反序列化:把網路中的流資料或者檔案中的流資料還原成物件
主要方法有:
1.Object readObject();該方法丟擲異常:ClassNotFountException。
2. void writeObject(Object):被寫入的物件必須實現一個介面:Serializable,否則就會丟擲:NotSerializableException
3.如果實現了該介面,想解決黃線問題就生成一個隨機的serialVersionUID號碼
8.綜合小案例:鍵盤錄入資料儲存到檔案中
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//建立鍵盤錄入
InputStream is=System.in;
//將位元組流轉換為字元流
InputStreamReader isr=new InputStreamReader(is);
//高效字元流讀取資料
BufferedReader br=new BufferedReader(isr);
//列印流寫入資料,第一個true表示如果檔案中有內容就追加資料,第二個true表示啟用自動重新整理
PrintWriter pw=new PrintWriter(new FileWriter("a.txt",true),true);
String line=null;
while((line=br.readLine())!=null){
if("over".equals(line)){
break;
}
//PrintWriter啟用自動重新整理
pw.println(line);
}
pw.close();
br.close();
}
}