數據流
Java所有的I/O機制都是基于數據流的,這些數據流表示了字符或者字節數據的流動序列。Java的I/O流提供了讀寫數據的標準方法。任何Java中表示數據源的對象都會提供以數據流的方式讀寫它的數據的方法。
Java.io是大多數面向數據流的輸入/輸出類的主要軟件包。這個軟件包包含了兩個抽象類,InputStream和OutputStream。所有其它面象數據流的輸入/輸出類都要擴展這兩個基類。
java.io軟件包提供了一些類和接口,它們在由InputStream和OuputStream類提供的讀寫操作的頂端定義了一些有用的抽象。例如,ObjectInputStream類提供了讓你把輸入/輸出流中的數據當成對象來讀取的方法,而ObjectOutputStream類提供了讓你能夠把Java對象寫入數據流中的方法。
優化讀寫過程
JDK 1.1 增加了一套讀寫類,它們提供了比現有數據流類更有用的抽象和更好的輸入/輸出性能。例如,BufferedReader和BufferedWriter 類被用來從基于字符的輸入和輸出流中讀取和寫入文本。BufferdReader 類緩存字符以更高效的讀取字符串,數組和文本行。BufferedWriter類緩存字符以更高效的寫入字符串,數組和文本行。BufferedReader和BufferedWriter 類可以按需求進行設置。
Java 輸入/輸出架構提供的讀取器和寫入器類包括 LineNumberReader 類,CharArrayReader類,FileReader類,FilterReader類,PushbackReader類,PipedReader 類,StringReader類以及其它一些類。這些類是在InputStream和OuputStream類頂部的包裹類因此提供了與 InputStream和OuputStream類相似的方法。但是,這些類為讀寫特定的對象,比方文件,字符數組和字符串等等提供了更高效而有用的抽象。
讀取數據
當你從一個相應的數據源對象里提取輸入流或者是創建一個讀取器對象的時候就會自動打開一個輸入流。例如,要為一個文件打開輸入流,我們只需要以下面的方式把文件名傳遞給Java.io.FileReader對象的構造函數:
java.io.FileReader fileReader = new java.io.FileReader("/home/me/myfile.txt");
要按順序讀取FileReader底層的輸入流中的一個字節數據,只需要使用不帶參數的read方法。表A中的代碼段從一個文件讀取文本數據,一次一個字符,然后把它寫入System.out里。
要從輸入流讀取指定數目的字節數據到char數組里,只需要使用帶一個char[]參數的read方法。數組的長度被用來確定應該讀取的字符的個數。表B演示了這個技術。
要關閉一個輸入流以及這個流使用的所有系統資源,你只需要以下面的方式調用close方法:
fileReader.close();
寫入數據
象一個輸入流一樣,輸出流通常在你從相應的數據源提取它或者是在你創建一個寫入對象的時候被自動的打開。例如,要為一個文件打開輸出流,我們把文件的名字傳遞給java.io.FileWriter對象的構造函數,如下所示:
java.io.FileWriter fileWriter = new
java.io.FileWriter("/home/me/out.txt");
要將一個特定的字符寫入到輸出流中,可以使用帶一個int參數的write方法,int參數代表要定入的字符。
int aChar = (int)'X';
fileWriter.write(aChar);
要在輸出流給定的偏移地址寫入一個char數組中特定數目的字符,你可以使用帶一個char[]參數,一個int 偏移量參數和一個int長度參數的write方法,如下面的例子所示:
fileWriter.write(buffer, 0, byteCount);
要關閉一個輸出流并釋放所有與之相關的系統資源,可以使用close方法,就象這樣:
fileWriter.close();
要強迫寫出一個輸出流中的所有數據,可以使用下面的flush方法:
fileWriter.flush();
把它們全部綜合起來
我們可以使用我們學習過的這些函數從一個文件中讀取數據并同時寫到另一個文件中去,如表C所示。
總結
Java的輸入/輸出機制為從不同的數據源讀取和寫入字符增加了一套簡單而標準化的API。你對一種數據源使用Java流的經驗能夠讓你容易的使用其它由Java提供的數據源類型。
在我們下一篇文章中,我們將會開始學習Java平臺的聯網和遠程通訊架構。我們將會把我們對Java流的討論擴展到這些環境并演示如何打開遠程數據源,并象操作本地數據源,比方文件一樣,寫入數據和讀取數據。
posted on 2006-11-19 20:06
larryjava 閱讀(140)
評論(0) 編輯 收藏