1. 程式人生 > >java節點流和處理流

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目標檔案裡面去