1. 程式人生 > >JAVA輸入輸出(IO)之字元流

JAVA輸入輸出(IO)之字元流

上一篇《JAVA輸入輸出(IO)之位元組流》介紹了JAVA位元組輸入輸出流的一些用法,位元組流一般是用於讀寫二進位制資料的,當我們要讀些字元資料的時候,如文字檔案,就顯得有些麻煩。所以JAVA還提供了專門用於讀寫字元資料的字元流。

字元輸入流

java.io.Reader用於讀取字元流的抽象類。子類必須實現的方法只有 read(char[], int, int) 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。

方法摘要

返回值 方法名 說明
abstract void close() 關閉該流並釋放與之關聯的所有資源。
int read() 讀取單個字元
int read(char[] cbuf) 將字元讀入陣列
abstract int read(char[] cbuf, int off, int len) 將字元讀入陣列的某一部分
int read(CharBuffer target) 試圖將字元讀入指定的字元緩衝區

同樣的,我們還是以操作檔案為例,java.io.FileReader是用來讀取字元檔案的便捷類。此類的構造方法假定預設字元編碼和預設位元組緩衝區大小都是適當的。要自己指定這些值,可以先在FileInputStream 上構造一個 InputStreamReader。

import java.io.FileReader;
import java.io.IOException;

public class FileReadWrite
{
   public static void main(String[] args)
   {
      FileReader reader = null;
      try
      {
         // 選用指定檔案路徑的構造方法
         reader = new FileReader("test.txt");
         int data = -1;
         // 從此輸入流中讀取一個數據位元組,如果已到達檔案末尾,則返回 -1
while ((data = reader.read()) != -1) { // 準備的檔案為文字檔案,且內容為阿拉伯數字,所以直接強制轉換為字元輸出 System.out.print((char) data); } } catch (IOException e) { // 異常處理 e.printStackTrace(); } finally { try { if (reader != null) { // 關閉輸入流 reader.close(); } } catch (IOException e) { } } } }

這是直接使用FileReader的效果,我們可以看到和位元組輸入流基本一樣,一般我們很少這樣寫,而是使用字元緩衝流java.io.BufferedReader。從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadWrite
{
   public static void main(String[] args)
   {
      BufferedReader reader = null;
      try
      {
         // 選用指定檔案路徑的構造方法
         reader = new BufferedReader(new FileReader("test.txt"));
         String line = null;
         // 從此輸入流中讀取一行
         while ((line = reader.readLine()) != null)
         {
            System.out.print(line);
         }
      }
      catch (IOException e)
      {
         // 異常處理
         e.printStackTrace();
      }
      finally
      {
         try
         {
            if (reader != null)
            {
               // 關閉輸入流
               reader.close();
            }
         }
         catch (IOException e)
         {
         }
      }
   }
}

使用緩衝流,我們可以直接讀取一行。

字元輸出流

寫入字元流的抽象類。子類必須實現的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。

方法概要

返回值 方法名 說明
abstract void close() 關閉此流,但要先重新整理它。
abstract void flush() 重新整理該流的緩衝
void write(char[] cbuf) 寫入字元陣列
abstract void write(char[] cbuf, int off, int len) 寫入字元陣列的某一部分
void write(int c) 寫入單個字元
void write(String str) 寫入字串
void write(String str, int off, int len) 寫入字串的某一部分

與FileReader對應的也有一個java.io.FilterWriter,用於寫入已過濾的字元流的抽象類。抽象類 FilterWriter 自身提供了一些將所有請求傳遞給所包含的流的預設方法。FilterWriter 的子類應重寫這些方法中的一些方法,並且還可以提供一些額外的方法和欄位。

import java.io.FileWriter;
import java.io.IOException;

public class FileReadWrite
{
   public static void main(String[] args)
   {
      FileWriter writer = null;
      try
      {
         // 選用指定檔案路徑的構造方法
         writer = new FileWriter("test.txt");
         writer.write("hello");
         writer.flush();
      }
      catch (IOException e)
      {
         // 異常處理
         e.printStackTrace();
      }
      finally
      {
         try
         {
            if (writer != null)
            {
               // 關閉輸入流
               writer.close();
            }
         }
         catch (IOException e)
         {
         }
      }
   }
}

上面的例子中使用的是FilterWriter向檔案中寫入資料,各位也可以試一下緩衝輸出流java.io.BufferedWriter完成這個操作。