java節點流和處理流
JAVA IO操作總結:節點流和處理流
節點流和處理流
按照流是否直接與特定的地方(如磁碟、記憶體、裝置等)相連,分為節點流和處理流兩類。
節點流:
可以從或向一個特定的地方(節點)讀寫資料。如FileReader
處理流:
是對一個已存在的流的連線和封裝,通過所封裝的流的功能呼叫實現資料讀寫。如BufferedReader。處理流的構造方法總是要帶一個其他的流物件做引數。一個流物件經過其他流的多次包裝,稱為流的連結。
常用的節點流
父 類 InputStream OutputStream Reader Writer
文 件 *FileInputStream FileOutputStrean FileReader FileWriter 檔案進行處理的節點流
數 組 *ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 對陣列進行處理的節點流(對應的不再是檔案,而是記憶體中的一個數組)
字串 *無 無 StringReader StringWriter 對字串進行處理的節點流
管 道 *PipedInputStream PipedOutputStream PipedReader PipedWriter 對管道進行處理的節點流
常用處理流(關閉處理流使用關閉裡面的節點流)
父 類 InputStream OutputStream Reader Writer
緩衝流 *BufferedImputStrean BufferedOutputStream BufferedReader BufferedWriter
—-需要父類作為引數構造,增加緩衝功能,避免頻繁讀寫硬碟,可以初始化緩衝資料的大小,由於帶了緩衝功能,所以就寫資料的時候需要使用flush方法咯
轉換流 *InputStreamReader OutputStreamWriter
要inputStream或OutputStream作為引數,實現從位元組流到字元流的轉換
資料流 *DataInputStream DataOutputStream
提供將基礎資料型別寫入到檔案中,或者讀取出來,為什麼要有這個流呢?看這樣的分析,如果沒有這種流的話,有一個long,本身只佔8個位元組,如果我要寫入到檔案,需要轉成字串,然後在轉成字元陣列,那空間會佔用很多,但是有了這種流之後就很方便了,直接將這8個位元組寫到檔案就完了。。是不是既節約了記憶體空間有讓程式寫起來更加方便簡單了吶。寫倒是很簡單,但是讀取的時候就注意了,根據讀取的資料型別,指標會往下移,所以你寫的順序必須要和讀的順序一致才能完成你正確的需求。
ObjectInputStream ObjectOutputStream
*順便研究序列化—將物件所在的型別全部轉換成二進位制,然後寫入到介質中去
transient關鍵字–修飾成員變數,不寫入該成員變數
Serializable介面–表示介面
怎樣實現的呢,在序列化之前,首先判斷 (物件 instanceof Serializable)如果返回true則執行序列化,否則丟擲異常,並且裡面有一個ID,是用來快速查詢某個物件的時候使用的
Externalizable介面–外部化介面
他是Serializable介面的子介面,能手動控制序列化的方式
為什麼要用writeUTF()–因為這種方式是按照utf-8來寫入的,而預設方式是utf-16只是節省空間而已
–位元組流讀取中文的問題
由於java使用的是unicode編碼,每一箇中文字元是佔用兩個位元組的,所以沒有隻讀出其中一個位元組並使用的話當然是亂碼咯,雖然普通的英文字元也是兩個位元組的,但是讀取的時候將高8位去掉也能回去正確的英文字元,所以沒有問題,所以最好還是使用字元流的方式讀取好點
–java.io中專門提供用於列印的流(這類流在寫入的時候有自動flush的功能,所以你不需要每列印一個東西都flush一次)——–注意他們也是屬於處理流,只不過這裡單獨列出來分析而已
PrintStream–繼承自–>FilterOutputStream–繼承自–>OutputStream,(它的建構函式需要OutputStream物件)
*PrintWriter—繼承自–>Writer(它的建構函式需要Writer物件)
System.In====InputStream
System.Out===PrintStream
這種流的print方法不會丟擲異常,這是JSP技術中常用的流,如果在JSP頁面的列印會丟擲異常的話,那JSP也太難寫了點!注意理解這樣的設計思路
–看這樣的程式碼
PrintStream ps=new PrintStream(new OutputStream(“c://…”));
System.setOut(ps);
System.Out.println(“jfdajsflkajdf”);//這樣將不會在列印到命令列視窗,而是指定的PrintStream目標檔案裡面去