首頁  >  文章  >  Java  >  Java進階教學之IO基礎詳解

Java進階教學之IO基礎詳解

怪我咯
怪我咯原創
2017-07-02 10:30:151507瀏覽

這篇文章主要介紹了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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn