Java學習筆記之輸入輸出

java.io包下主要包括輸入/輸出兩種IO流,每種輸入/輸出流又可分爲字節流和字符流兩大類。字節流以字節爲單位處理,字符流以字符來處理。

File類,操作文件和目錄,能新建/刪除/重命名等操作,但是不能訪問文件內容本身。訪問文件本身需要IO流。

Java的輸入流都以InputStream和Reader爲基類,輸出流主要由OutputStream和Writer爲基類。他們都是抽象基類,無法直接創建實例。InputStream和OutputStream爲字節流基類,Reader和Writer爲字符流基類。

節點流和處理流的概念:

節點流:從/向一個特定IO設備讀寫數據的流,也成爲低級流。

處理流:對一個已存在的流進行連接和封裝,通過封裝後的流實現數據讀/寫功能。也成爲高級流。用處理流的好處是,只要使用相同的處理流,程序就可以採用完全相同的輸入/輸出代碼來訪問不同的數據源。採用的是一種叫裝飾器的設計模式,因此處理流也稱爲包裝流。

對流模型的理解:可以把輸入和輸出設備看作一個蓄水池,流就是水管這麼一個概念,是一種過程概念,水管中的水滴就是字節/字符。

對輸入而言,InputStream和Reader是輸入流抽象基類,提供方法:read()不同參數用法。如果用於讀取文件,其子類爲FileInputStream和FileReader。

同樣對輸出,有個FileOutputStream和FileWriter,提供write方法。如果希望直接輸出字符串內容,FileWriter非常有效。直接:

FileWriter fw = new FileWriter("test.txt");

fw.write("hello");……

一般,對文件輸入輸出流最後都必須 close方法,不過Java7後,直接寫在try裏,配上catch(IOException ex)即可自動關閉輸入輸出流。

上面的方法都是基於節點流,可以看出非常費勁,需要解析每個字節或字符,我們希望用處理流來簡化編程。注意處理流的構造器參數是一個已經存在的流。例如非常強大的PrintStream處理流:

FileOutputStream fos = new FileOutputStream("test.txt“);

PrintStream ps = new PrintStream(fos);

ps.println("hello");

……

非常方便,不用逐個解析了。其實,標準輸出System.out就是PrintStream類型的。

整個IO體系包含了很多類,用於各種場合。除了訪問文件,還有訪問數組、管道、字符串、緩衝等類。

關於輸入/輸出重定向:System類提供靜態方法:

setErr(PrintStream err)重定向標準錯誤輸出流;

setIn(InputStream in)重定向標準輸入流;

setOut(OutputStream out)重定向標準輸出流。

一旦重定向,就可以把標準輸入輸出當成是自己定義的流的輸入輸出了。

補充讀取標準輸入的方法:

Scanner sc = new Scanner(System.in);

關於RandomAccessFile類,提供文件輸入輸出,但最大特點是支持“隨機訪問”方式,程序可以直接跳轉到文件的任意地方來讀寫數據。seek方法!

關於對象序列化:

直接傳輸對象時,序列化把Java對象轉化爲平臺無關的二進制流可以傳輸,獲得傳輸流後可以恢復爲對象。使用方法是,對相關的類實現Serializable接口,保證該類的對象就是可以序列化的了。然後再調用類中,輸出用ObjectOutputStream(注意是一個包裝類),用流的writeObject方法就可以輸出。輸入用ObjectInputStream並調用readObject方法讀取流對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章