天天看點

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
         while ((data = reader.read()) != -)
         {
            // 準備的檔案為文本檔案,且内容為阿拉伯數字,是以直接強制轉換為字元輸出
            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

完成這個操作。