這篇文章主要介紹了Java進階教程之IO基礎,這裡只是對Java IO的基本介紹,包含讀取和寫入等操作,需要的朋友可以參考下
計算機最重要的功能是處理數據。一個有用的電腦語言需要擁有良好的IO功能,以便讓未處理的資料流入程序,讓已處理的資料流出。
與其他語言相比,Java的IO功能顯得複雜。在其他語言中,許多IO功能(例如讀取檔案),是被封裝好的,可以用一兩行程式實作。在Java中,程式設計師往往需要多個層次的裝飾(decoration),才能實現檔案讀取。
相對的複雜性帶來的好處是IO的靈活性。在Java中,程式設計師可以控制IO的整個流程,從而設計出最好的IO方式。我們將在下文看到更多。
IO範例
下面是我用來示範的檔案file.txt
Hello World! Hello Nerd!
我們先來研究一個檔案讀取的範例:
import java.io.*; public class Test { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader("file.txt")); String line = br.readLine(); while (line != null) { System.out.println(line); line = br.readLine(); } br.close(); } catch(IOException e) { System.out.println("IO Problem"); } } }
這段程式中包含一個try...catch...finally的異常處理器。可參考Java進階教學之異常處理
裝飾器與功能組合
程式IO的關鍵在於建立BufferedReader物件br:
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
在在建立的過程中,我們先建立了一個FileReader對象,這個物件的功能是從檔案"file.txt"讀取位元組(byte)流,並轉換為文字流。在Java中,標準的文字編碼方式為unicode。 BufferedReader()接收該FileReader對象,並擴展FileReader的功能,新建出一個BufferedReader物件。該物件除了有上述的檔案讀取和轉換的功能外,還提供了快取讀取(buffered)的功能。最後,我們透過對br物件呼叫readLine()方法,可以逐行的讀取檔案。
(快取讀取是在記憶體中開闢一片區域作為緩存,該區域存放FileReader讀出的文字流。當該快取的內容被讀走後(例如readLine()指令),快取就會載入後續的文字流。修飾器的好處是,它可以用來修飾不同的物件。我們這裡被修飾的是從文件中讀取的文字流。其他的文字流,例如標準輸入,網路傳輸的流等等,都可以被BufferedReader()修飾,從而實現快取讀取。
下圖顯示了br的工作方式,資料自下而上流動:
#
上述的裝飾過程與Linux中的文字流思想很相似。在Linux中,我們使用類似函數的方式來處理和傳遞文字流。在Java中,我們使用了裝飾器。但它們的目的都類似,就是實現功能的
模組化 更多的組合事實上,Java提供了豐富的裝飾器。 FileReader中合併了讀取和轉換兩個步驟,並採用了常用的預設設置,例如編碼採取unicode。我們可以使用FileInputStream + InputStreamReader的組合來取代FileReader,從而分離讀取位元組和轉換兩個步驟,並對兩個過程有更好的控制。
(當然,FileReader的使用更方便。InputStreamReader是將FileInputStream轉換成一個Reader,用於處理unicode文字)
箭頭表示資料流動方向
流的讀寫來自於四個基底類別: InputStream, OutputStream, Reader和Writer。 InputStream和Reader是處理讀取操作,OutputStream和Writer是處理寫入作業。它們都位於java.io套件中。繼承關係如下:
java.io
此外,IOException有下列衍生類別:
########################################### #IOException###### Reader和Writer及其衍生類別是處理unicode文字。如我們看到的Buffered Reader, InputStreamReader或FileReader。 ######InputStream和OutputStream及其衍生類別是處理位元組(byte)流。電腦中的資料都可以認為是位元組形式,所以InputStream和OutputStream可用於處理更廣泛的資料。例如我們可以使用下面的組合來讀取壓縮檔中包含的資料(例如整數):###箭头表示数据流动方向
我们从压缩文件中读出字节流,然后解压缩,最终读出数据。
写入
写入(write)操作与读取操作相似。我们可以通过使用装饰,实现复杂的写入功能。这里是一个简单的写入文本的例子:
import java.io.*; public class Test { public static void main(String[] args) { try { String content = "Thank you for your fish."; File file = new File("new.txt"); // create the file if doesn't exists if (!file.exists()) { file.createNewFile(); } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(content); bw.close(); } catch(IOException e) { System.out.println("IO Problem"); } } }
上面创建了file对象,用于处理文件路径。
总结
这里只是对Java IO的基本介绍。Java的IO相对比较复杂。Java程序员需要花一些时间来熟悉java.io中的类及其功能。
以上是Java進階教學之IO基礎詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!