節點流:可以從或向一個特定的地方(節點)讀寫數據。如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目標文件裡面去。