1. 程式人生 > >Java IO 接口--- 字節操作 字符操作 磁盤操作 網絡操作

Java IO 接口--- 字節操作 字符操作 磁盤操作 網絡操作

傳輸 就是 讀取文件 程序 ibm fileread 也有 數據傳輸 div

1、IO類庫的基本結構

基於字節操作的IO接口分別是InputStream和OutputStream,InputStream的類結構圖如下所示:

技術分享

同InputStream類似,OutputStream類也有著相同的類結構圖。

技術分享

關於各個子類的使用可以參考JDK 的 API 說明文檔,這裏我們需要註意的是:操作數據的方式是可以組合的,如下所示:

InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("h:\\haha.txt"), "utf-8");

從上面代碼可以看出,InputStreamReader可以從FileInputStream中讀取數據,從源碼中可以看出來,其實不僅是InputStreamReader,所有的IO類都可以以這種方式來組合使用。

技術分享

還有一點需要註意的是必須制定流最終寫入到什麽地方,是磁盤還是網絡,從OutputStream類圖中可以看出,寫入網絡中實際也是寫文件操作,只不過底層是通過網絡傳輸了。

2、 基於字符的IO操作接口

不管是磁盤還是網絡數據傳輸,都是以字節為單位的,但是程序中一般常見的數據操作都是以字符為單位的(Java中char占用2字節,C/C++中 char占用1字節),這就需要我們有一個操作字符的IO接口,來處理字符與字節見的編碼轉換問題,也就是Write和Reader接口及其實現類,他們 二者的類接口圖如下:

技術分享

技術分享

讀字符接口Reader的最主要操作方法為read(),其讀取字符並返回讀取的字符數,不管是 Writer 還是 Reader 類它們都只定義了讀取或寫入的數據字符的方式,也就是怎麽寫或讀,但是並沒有規定數據要寫到哪去(比如磁盤或者網絡)。

3、字節與字符的轉化接口

有時數據持久化和網絡傳輸是以字節進行的,所有需要字節和字符之間的相互轉換。

技術分享 技術分享

/**
 * 使用FileReader進行讀取文件
 */
@Test
public void testFileReader() throws IOException {
    FileReader fileReader = new FileReader("h:\\haha.txt");
    char[] buff = new char[512];
    StringBuffer stringBuffer = new StringBuffer();

    
while (fileReader.read(buff) > 0) { stringBuffer.append(buff); } fileReader.close(); System.out.print(stringBuffer.toString()); } /** * 使用FileReader進行讀取文件,然後FileWriter寫入另一個文件 */ @Test public void testFileReaderAndFileWriter() throws IOException { FileReader fileReader = new FileReader("h:\\haha.txt"); char[] buff = new char[512]; StringBuffer stringBuffer = new StringBuffer(); while (fileReader.read(buff) > 0) { stringBuffer.append(buff); } System.out.println(stringBuffer.toString()); FileWriter fileWriter = new FileWriter("h:\\haha2.txt"); fileWriter.write(stringBuffer.toString().trim()); fileWriter.close(); System.out.println("寫入文件成功"); } /** * 使用InputStreamReader進行讀取文件 */ @Test public void testInputStreamReader() throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("h:\\haha.txt"), "utf-8"); char[] buff = new char[512]; StringBuffer stringBuffer = new StringBuffer(); while (inputStreamReader.read(buff) > 0) { stringBuffer.append(buff); } System.out.println(stringBuffer.toString()); } @Test public void testIntputStream2() throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(new StringBufferInputStream("hello world")); char[] buff = new char[512]; int n = inputStreamReader.read(buff); System.out.println(n); System.out.println(buff); } /** * 使用inputStreamReader進行讀取文件,然後OutputStreamWriter寫入另一個文件 */ @Test public void testOutputStreamWriter() throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("h:\\haha.txt"), "utf-8"); char[] buff = new char[512]; StringBuffer stringBuffer = new StringBuffer(); while (inputStreamReader.read(buff) > 0) { stringBuffer.append(buff); } System.out.println(stringBuffer.toString()); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("h:\\haha2.txt"), "utf-8"); outputStreamWriter.write(stringBuffer.toString().trim()); outputStreamWriter.close(); }

註意:FileReader類繼承了InputStreamReader,FileReader讀取文件流,通過StreamDecoder解碼成char,其解碼字符集使用的是默認字符集。在Java中,我們應該使用File對象來判斷某個文件是否存在,如果我們用FileOutputStream或者FileWriter打開,那麽它肯定會被覆蓋。

文件材料取自於:https://www.ibm.com/developerworks/cn/java/j-lo-javaio/

Java IO 接口--- 字節操作 字符操作 磁盤操作 網絡操作