C語言中文網 目錄

Java字符流的使用:字符輸入/輸出流、字符文件和字符緩沖區的輸入/輸出流

盡管 java 中字節流的功能十分強大,幾乎可以直接或間接地處理任何類型的輸入/輸出操作,但利用它卻不能直接操作 16 位的 Unicode 字符。這就要用到字符流。本節將重點介紹字符流的操作。

字符輸入流

Reader 類是所有字符流輸入類的父類,該類定義了許多方法,這些方法對所有子類都是有效的。

Reader 類的常用子類如下。
  • CharArrayReader 類:將字符數組轉換為字符輸入流,從中讀取字符。
  • StringReader 類:將字符串轉換為字符輸入流,從中讀取字符。
  • BufferedReader 類:為其他字符輸入流提供讀緩沖區。
  • PipedReader 類:連接到一個 PipedWriter。
  • InputStreamReader 類:將字節輸入流轉換為字符輸入流,可以指定字符編碼。

與 InputStream 類相同,在 Reader 類中也包含 close()、mark()、skip() 和 reset() 等方法,這些方法可以參考 InputStream 類的方法。下面主要介紹 Reader 類中的 read() 方法,如表 1 所示。

表1 Reader類中的read()方法
方法名及返回值類型 說明
int read() 從輸入流中讀取一個字符,并把它轉換為 0~65535 的整數。如果返回 -1, 則表示
已經到了輸入流的末尾。為了提高 I/O 操作的效率,建議盡量使 用下面兩種 read()
方法
int read(char[] cbuf) 從輸入流中讀取若干個字符,并把它們保存到參數 cbuf 指定的字符數組中。 該方
法返回讀取的字符數,如果返回 -1,則表示已經到了輸入流的末尾
int read(char[] cbuf,int off,int len) 從輸入流中讀取若干個字符,并把它們保存到參數 cbuf 指定的字符數組中。其中,
off 指定在字符數組中開始保存數據的起始下標,len 指定讀 取的字符數。該方法返
回實際讀取的字符數,如果返回 -1,則表示已經 到了輸入流的末尾

字符輸出流

與 Reader類相反,Writer 類是所有字符輸出流的父類,該類中有許多方法,這些方法對繼承該類的所有子類都是有效的。

Writer 類的常用子類如下。
  • CharArrayWriter 類:向內存緩沖區的字符數組寫數據。
  • StringWriter 類:向內存緩沖區的字符串(StringBuffer)寫數據。
  • BufferedWriter 類:為其他字符輸出流提供寫緩沖區。
  • PipedWriter 類:連接到一個 PipedReader。
  • OutputStreamReader 類:將字節輸出流轉換為字符輸出流,可以指定字符編碼。

與 OutputStream 類相同,Writer 類也包含 close()、flush() 等方法,這些方法可以參考 OutputStream 類的方法。下面主要介紹 Writer 類中的 write() 方法和 append() 方法,如表 2 所示。

表2 Writer類中的write()方法和append()方法
方法名及返回值類型 說明
void write(int c) 向輸出流中寫入一個字符
void write(char[] cbuf) 把參數 cbuf 指定的字符數組中的所有字符寫到輸出流中
void write(char[] cbuf,int off,int len) 把參數 cbuf 指定的字符數組中的若干字符寫到輸出流中。其中,off 指定
字符數組中的起始下標,len 表示元素個數
void write(String str) 向輸出流中寫入一個字符串
void write(String str, int off,int len) 向輸出流中寫入一個字符串中的部分字符。其中,off 指定字符串中的起
始偏移量,len 表示字符個數
append(char c) 將參數 c 指定的字符添加到輸出流中
append(charSequence esq) 將參數 esq 指定的字符序列添加到輸出流中
append(charSequence esq,int start,int end) 將參數 esq 指定的字符序列的子序列添加到輸出流中。其中,start 指定
子序列的第一個字符的索引,end 指定子序列中最后一個字符后面的字符
的索引,也就是說子序列的內容包含 start 索引處的字符,但不包括 end
索引處的字符

注意:Writer 類所有的方法在出錯的情況下都會引發 IOException 異常。關閉一個流后,再對其進行任何操作都會產生錯誤。

字符文件輸入流

為了讀取方便,Java 提供了用來讀取字符文件的便捷類——FileReader。該類的構造方法有如下兩種重載形式。
  1. FileReader(File file):在給定要讀取數據的文件的情況下創建一個新的 FileReader 對象。其中,file 表示要從中讀取數據的文件。
  2. FileReader(String fileName):在給定從中讀取數據的文件名的情況下創建一個新 FileReader 對象。其中,fileName 表示要從中讀取數據的文件的名稱,表示的是一個文件的完整路徑。

在用該類的構造方法創建 FileReader 讀取對象時,默認的字符編碼及字節緩沖區大小都是由系統設定的。要自己指定這些值,可以在 FilelnputStream 上構造一個 InputStreamReader。

注意:在創建 FileReader 對象時可能會引發一個 FileNotFoundException 異常,因此需要使用 try catch 語句捕獲該異常。

字符流和字節流的操作步驟相同,都是首先創建輸入流或輸出流對象,即建立連接管道,建立完成后進行讀或寫操作,最后關閉輸入/輸出流通道。

例 1

要將 E:\myjava\HelloJava.java 文件中的內容讀取并輸出到控制臺,使用 FileReader 類的實現代碼如下:
package ch13;
import java.io.FileReader;
import java.io.IOException;
public class Test12
{
    public static void main(String[] args)
    {
        FileReader fr=null;
        try
        {
            fr=new FileReader("E:/myjava/HelloJava.java");    //創建FileReader對象
            int i=0;
            System.out.println("E:\\myjava\\HelloJava.java文件內容如下:");
            while((i=fr.read())!=-1)
            {    //循環讀取
                System.out.print((char) i);    //將讀取的內容強制轉換為char類型
            }
        }
        catch(Exception e)
        {
            System.out.print(e);
        }
        finally
        {
            try
            {
                fr.close();    //關閉對象
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

如上述代碼,首先創建了 FileReader 字符輸入流對象 fr,該對象指向 E:\myjava\HelloJava.java 文件,然后定義變量 i 來接收調用 read() 方法的返回值,即讀取的字符。在 while 循環中,每次讀取一個字符賦給整型變量 i,直到讀取到文件末尾時退出循環(當輸入流讀取到文件末 尾時,會返回值 -1)。

字符文件輸出流

Java 提供了寫入字符文件的便捷類——FileWriter,該類的構造方法有如下 4 種重載形式。
  1. FileWriter(File file):在指定 File 對象的情況下構造一個 FileWriter 對象。其中,file 表示要寫入數據的 File 對象。
  2. FileWriter(File file,boolean append):在指定 File 對象的情況下構造一個 FileWriter 對象,如果 append 的值為 true,則將字節寫入文件末尾,而不是寫入文件開始處。
  3. FileWriter(String fileName):在指定文件名的情況下構造一個 FileWriter 對象。其中,fileName 表示要寫入字符的文件名,表示的是完整路徑。
  4. FileWriter(String fileName,boolean append):在指定文件名以及要寫入文件的位置的情況下構造 FileWriter 對象。其中,append 是一個 boolean 值,如果為 true,則將數據寫入文件末尾,而不是文件開始處。

在創建 FileWriter 對象時,默認字符編碼和默認字節緩沖區大小都是由系統設定的。要自己指定這些值,可以在 FileOutputStream 上構造一個 OutputStream Writer 對象。

FileWriter 類的創建不依賴于文件存在與否,如果關聯文件不存在,則會自動生成一個新的文件。在創建文件之前,FileWriter 將在創建對象時打開它作為輸出。如果試圖打開一個只讀文件,將引發一個 IOException 異常。

注意:在創建 FileWriter 對象時可能會引發 IOException 或 SecurityException 異常,因此需要使用 try catch 語句捕獲該異常。

例 2

編寫一個程序,將用戶輸入的 4 個字符串保存到 E:\myjava\book.txt 文件中。在這里使用 FileWriter 類中的 write() 方法循環向指定文件中寫入數據,實現代碼如下:
package ch13;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class Test13
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        FileWriter fw=null;
        try
        {
            fw=new FileWriter("E:\\myjava\\book.txt");    //創建FileWriter對象
            for(int i=0;i<4;i++)
            {
                System.out.println("請輸入第"+(i+1)+"個字符串:");
                String name=input.next();    //讀取輸入的名稱
                fw.write(name+"\r\n");    //循環寫入文件
            }
            System.out.println("錄入完成!");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        finally
        {
            try
            {
                fw.close();    //關閉對象
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

如上述代碼,首先創建了一個指向 E:\myava\book.txt 文件的字符文件輸出流對象 fw,然后使用 for 循環錄入 4 個字符串,并調用 write() 方法將字符串寫入到指定的文件中。最后在 finally 語句中關閉字符文件輸出流。

運行該程序,根據提示輸入 4 個字符串,如下所示。接著打開 E:\myjava\book.txt 文件,將看到寫入的內容,如圖 1 所示。
請輸入第1個字符串:
熱點要聞
請輸入第2個字符串:
個性推薦
請輸入第3個字符串:
熱搜新聞詞
請輸入第4個字符串:
本地看點
錄入完成!


圖1 book.txt文件內容

字符緩沖區輸入流

BufferedReader 類主要用于輔助其他字符輸入流,它帶有緩沖區,可以先將一批數據讀到內存緩沖區。接下來的讀操作就可以直接從緩沖區中獲取數據,而不需要每次都從數據源讀取數據并進行字符編碼轉換,這樣就可以提高數據的讀取效率。

BufferedReader 類的構造方法有如下兩種重載形式。
  1. BufferedReader(Reader in):創建一個 BufferedReader 來修飾參數 in 指定的字符輸入流。
  2. BufferedReader(Reader in,int size):創建一個 BufferedReader 來修飾參數 in 指定的字符輸入流,參數 size 則用于指定緩沖區的大小,單位為字符。

除了可以為字符輸入流提供緩沖區以外,BufferedReader 還提供了 readLine() 方法,該方法返回包含該行內容的字符串,但該字符串中不包含任何終止符,如果已到達流末尾,則返回 null。readLine() 方法表示每次讀取一行文本內容,當遇到換行(\n)、回車(\r)或回車后直接跟著換行標記符即可認為某行已終止。

例 3

使用 BufferedReader 類中的 readLine() 方法逐行讀取 E:\myjava\Book.txt 文件中的內容,并將讀取的內容在控制臺中打印輸出,代碼如下:
package ch13;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test13
{
    public static void main(String[] args)
    {
        FileReader fr=null;
        BufferedReader br=null;
        try
        {
            fr=new FileReader("E:\\myjava\\book.txt");    //創建 FileReader 對象
            br=new BufferedReader(fr);    //創建 BufferedReader 對象
            System.out.println("E:\\myjava\\book.txt 文件中的內容如下:");
            String strLine="";
            while((strLine=br.readLine())!=null)
            {    //循環讀取每行數據
                System.out.println(strLine);
            }
        }
        catch(FileNotFoundException e1)
        {
            e1.printStackTrace();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                fr.close();    //關閉 FileReader 對象
                br.close();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

如上述代碼,首先分別創建了名稱為 fr 的 FileReader 對象和名稱為 br 的 BufferedReader 對象,然后調用 BufferedReader 對象的 readLine() 方法逐行讀取文件中的內容。如果讀取的文件內容為 Null,即表明已經讀取到文件尾部,此時退出循環不再進行讀取操作。最后將字符文件輸入流和帶緩沖的字符輸入流關閉。

運行該程序,輸出結果如下所示:
E:\myjava\book.txt 文件中的內容如下:
熱點要聞
個性推薦
熱搜新聞詞
本地看點

字符緩沖區輸出流

BufferedWriter 類主要用于輔助其他字符輸出流,它同樣帶有緩沖區,可以先將一批數據寫入緩沖區,當緩沖區滿了以后,再將緩沖區的數據一次性寫到字符輸出流,其目的是為了提高數據的寫效率。

BufferedWriter 類的構造方法有如下兩種重載形式。
  1. BuflferedWriter(Writer out):創建一個 BufferedWriter 來修飾參數 out 指定的字符輸出流。
  2. BufferedWriter(Writer out,int size):創建一個 BufferedWriter 來修飾參數 out 指定的字符輸出流,參數 size 則用于指定緩沖區的大小,單位為字符。

該類除了可以給字符輸出流提供緩沖區之外,還提供了一個新的方法——newLine(),該方法用于寫入一個行分隔符。行分隔符字符串由系統屬性 line.separator 定義,并且不一定是單個新行(\n)符。

提示:BufferedWriter 類的使用與 FileWriter 類相同,這里不再重述。

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户