Java IO5:字符流


字符流

字節流提供了處理任何類型輸入/輸出操作的功能(因為對於計算機而言,一切都是0和1,只需把數據以字節形式表示就夠了),但它們不可以直接操作Unicode字符,因為上一篇文章寫了,一個Unicode字符占用2個字節,而字節流一次只能操作一個字節。既然Java的口號就是"一次編寫、處處運行",那么包含直接的字符輸入/輸出的支持是必要的。因此就有一些字符輸入/輸出流,之前已經說明過了,字符流頂層是Reader和Writer這兩個抽象類,因此就從這里開始本文。

 

Reader

Reader是定義Java的字符輸入流的抽象類,該類的所有方法在出錯的情況下都將引發IOException。Reader類中有這些方法:

方    法 作    用
abstract void close() 關閉該流並釋放與之關聯的所有資源
void mark(int readAheadLimit) 標記流中的當前位置
boolean markSupported() 判斷此流是否支持mark()操作
int read() 從文件中讀取單個字符
int read(char[] cbuf) 從文件中讀取字符到cbuf
abstract int read(char[] cbuf, int off, int len) 將文件中的字符讀入cbuf數組,從off位置開始,讀取len個字符。三個read方法在字符可用、發生I/O異常或者已經到達流的末尾前,此方法會一直阻塞
int read(CharBuffer target) 試圖將文件中的字符讀入指定的字符緩沖區
boolean ready() 判斷是否准備讀取此流
voi reset() 重置該流
long skip(long n) 跳過n個字符

 

Writer

Writer是定義字符輸出流的抽象類,所有該類的方法都返回一個void值並在出錯的條件下引發IOException。Writer類中的方法有:

方    法 作    用
Writer append(char c) 將制定字符添加到此writer
Writer append(CharSequence csq) 將制定字符序列添加到此writer
Writer append(CharSequence csq, int start, int end) 將指定字符序列的子序列添加到此writer.Appendable
abstract void close() 關閉此流,但要先flush()它
abstract void flush() 刷新該流的緩沖
void write(char[] cbuf) 將cbuf中的內容寫入文件
abstract void write(char[] cbuf, int off, int len) 將字符數組cbuf中從off開始的len個字節寫入文件
void write(int c) 寫入單個字符到文件中
void write(String str) 寫入字符串到文件中
void write(String str, int off, int len) 寫入str從off位置開始的len個字符到文件中

 

FileReader和FileWriter

FileReader類創建了一個可以讀取文件內容的Reader類,最常用的構造方法是:

1、FileReader(String fileName)

2、FileReader(File file)

FileWriter創建了一個可以寫文件的Writer類,最常用的構造方法是:

1、FileWriter(String fileName)

2、FileWriter(String fileName, boolean append)

3、FileWriter(File file)

其中第二個構造方法,如果append為true,那么輸出是追加到文件結尾的FileWriter類的創建不依賴文件是否存在,在創建文件之前,FileWriter將在創建對象時打開它來作為輸出。如果試圖打開一個只讀文件,那么將引發一個IOException。看一下FileWriter和FileReader的使用,現在D盤目錄下沒有"writer.txt":

public static void main(String[] args) throws Exception
{
    File file = new File("D:/writer.txt");
    Writer out = new FileWriter(file);
    // 聲明一個String類型對象
    String str = "Hello World!!!";
    out.write(str);
    out.close();
        
    // 讀文件操作
    Reader in = new FileReader(file);
    // 開辟一個空間用於接收文件讀進來的數據
    char c0[] = new char[1024];
    int i = 0;
    // 將c0的引用傳遞到read()方法之中,同時此方法返回讀入數據的個數
    i = in.read(c0);
    in.close();
        
    if (-1 == i)
    {
        System.out.println("文件中無數據");
    }
    else
    {
        System.out.println(new String(c0, 0, i));
    }
}

利用FileWriter和FileReader進行了一次的讀寫操作,先看一下D盤下是否有"writer.txt",假如有"writer.txt"那"writer.txt"中又是什么:

看來利用FileWriter寫入一個內存中的字符串到文件中是成功了,那么利用利用FileReader讀入文件中的內容到內存呢,看一下運行結果:

Hello World!!!

打印結果和文件中的內容一致,說明FileReader的操作也成功。

這就是FileWriter和FileReader的使用,和FileOutputStream和FileInputStream的使用差不多,不過實際操作中一般不會用FileWriter和FileReader,這將在下一篇文章進行講解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM