基于字符流和字符緩沖流的文件操作

字符流 FileReader 和 FileWriter

FileReader 和 FileWriter 是使用字符直接對文件的讀與寫操作

FileReader

構造方法 說明
FileReader(File file) 在給定從中讀取數(shù)據(jù)的 File 的情況下創(chuàng)建一個新 FileReader
FileReader(FileDescriptor fd) 在給定從中讀取數(shù)據(jù)的 FileDescriptor 的情況下創(chuàng)建一個新 FileReader
FileReader(String fileName) 在給定從中讀取數(shù)據(jù)的文件名的情況下創(chuàng)建一個新 FileReader

FileWriter

構造方法 說明
FileWriter(File file) 根據(jù)給定的 File 對象構造一個 FileWriter 對象
FileWriter(File file, boolean append) 根據(jù)給定的 File 對象構造一個 FileWriter 對象
FileWriter(FileDescriptor fd) 構造與某個文件描述符相關聯(lián)的 FileWriter 對象
FileWriter(String fileName) 根據(jù)給定的文件名構造一個 FileWriter 對象
FileWriter(String fileName, boolean append) 據(jù)給定的文件名以及指示是否附加寫入數(shù)據(jù)的 boolean 值來構造 FileWriter 對象

示例

使用FileReader和FileWriter類完成文本文件復制,步驟:

  1. 創(chuàng)建讀(FileReader)對象
  2. 創(chuàng)建寫(FileWriter)對象
  3. 循環(huán)讀取的數(shù)據(jù),寫入到目標文件中
  4. 關閉寫(FileWriter)對象
  5. 關閉讀(FileReader)對象

關于讀寫對象的關閉順序不可變

一次讀一個字符

/**
     * 文本文件復制,一次讀一個字符
     * 
     * @param fr
     * @param fw
     * @throws IOException
     */
public static void copy1(FileReader fr, FileWriter fw) throws IOException {
    int ch;
    while ((ch = fr.read()) != -1) {// 讀數(shù)據(jù)
        fw.write(ch);// 寫數(shù)據(jù)
    }
    fw.flush();
}

一次讀一個字符數(shù)組

/**
     * 文本文件復制,一次讀一個字符數(shù)組
     * 
     * @param fr
     * @param fw
     * @throws IOException
     */
public static void copy2(FileReader fr, FileWriter fw) throws IOException {
    char chs[] = new char[1024];
    int len = 0;
    while ((len = fr.read(chs)) != -1) {// 讀數(shù)據(jù)
        fw.write(chs, 0, len);// 寫數(shù)據(jù)
    }
    fw.flush();
}

測試

public static void main(String[] args) throws IOException {

    // 創(chuàng)建輸入流對象
    // 文件不存在會拋出java.io.FileNotFoundException
    FileReader fr = new FileReader("d:\\Test\\copyfrom.txt");

    // 創(chuàng)建輸出流對象
    FileWriter fw = new FileWriter("d:\\Test\\copyto.txt");

    // 創(chuàng)建輸出流做的工作: 1、調(diào)用系統(tǒng)資源創(chuàng)建了一個文件 2、創(chuàng)建輸出流對象 3、把輸出流對象指向文件
    copy1(fr, fw);
    copy2(fr, fw);

    fr.close();
    fw.close();
}

字符緩沖流BufferedReader和BufferedWriter

緩沖流可以讀取到一個字節(jié)/字符,先不輸出,等湊足了緩沖的最大容量后一次性寫出去,從而提高了工作效率

優(yōu)點:減少對硬盤的讀取次數(shù),降低對硬盤的損耗

BufferedReader

字符緩沖流具備文本特有的表現(xiàn)形式,行操作

public class BufferedReader extends Reader
  • 從字符輸入流中讀取文本,緩沖各個字符,從而實現(xiàn)字符、數(shù)組和行的高效讀取。
  • 可以指定緩沖區(qū)的大小,或者可使用默認的大小。大多數(shù)情況下,默認值就足夠大了。
  • 通常,Reader 所作的每個讀取請求都會導致對底層字符或字節(jié)流進行相應的讀取請求。因此,建議用 BufferedReader 包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和 InputStreamReader)

BufferedReader 有一個新方法:readLine ??梢砸淮巫x取一行數(shù)據(jù)。

BufferedWriter

BufferedReader in = new BufferedReader(new FileReader("foo.in"));
  • 將緩沖指定文件的輸入。如果沒有緩沖,則每次調(diào)用 read() 或 readLine() 都會導致從文件中讀取字節(jié),并將其轉(zhuǎn)換為字符后返回,而這是極其低效的。
public class BufferedWriter extends Writer
  • 將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數(shù)組和字符串的高效寫入。

  • 可以指定緩沖區(qū)的大小,或者接受默認的大小。在大多數(shù)情況下,默認值就足夠大了。

  • 該類提供了 newLine() 方法,它使用平臺自己的行分隔符概念,此概念由系統(tǒng)屬性 line.separator 定義。并非所有平臺都使用新行符 ('\n') 來終止各行。因此調(diào)用此方法來終止每個輸出行要優(yōu)于直接寫入新行符。

  • 通常 Writer 將其輸出立即發(fā)送到底層字符或字節(jié)流。除非要求提示輸出,否則建議用 BufferedWriter 包裝所有其 write() 操作可能開銷很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,

    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
    
  • 緩沖 PrintWriter 對文件的輸出。如果沒有緩沖,則每次調(diào)用 print() 方法會導致將字符轉(zhuǎn)換為字節(jié),然后立即寫入到文件,而這是極其低效的。

示例

使用BufferedReader和BufferedWriter完成文件復制

使用 char 做數(shù)據(jù)讀取

/**
     *  和字符流一樣,使用 char 做數(shù)據(jù)讀取
     * @param source
     * @param target
     * @throws IOException
     */
public static void byteCopy(String source, String target) throws IOException {
    // 創(chuàng)建輸入流對象
    BufferedReader br = new BufferedReader(new FileReader(source));// 文件不存在會拋出java.io.FileNotFoundException
    // 創(chuàng)建輸出流對象
    BufferedWriter bw = new BufferedWriter(new FileWriter(target));
    // 文本文件復制
    char[] chs = new char[1024];
    int len = 0;
    while ((len = br.read(chs)) != -1) {
        bw.write(chs, 0, len);
    }
    // 釋放資源
    br.close();
    bw.close();
}

BufferedReader對象使用 readLine 方法讀取數(shù)據(jù)

/**
     * BufferedReader對象使用 readLine 方法讀取數(shù)據(jù)
     * @param source
     * @param target
     * @throws IOException
     */
public static void stringCopy(String source, String target) throws IOException {
    // 創(chuàng)建輸入流對象
    // 文件不存在會拋出java.io.FileNotFoundException
    BufferedReader br = new BufferedReader(new FileReader(source));
    // 創(chuàng)建輸出流對象
    BufferedWriter bw = new BufferedWriter(new FileWriter(target));

    String str = br.readLine();
    while (null != str ) {

        //一定是先寫入數(shù)據(jù),然后再讀取下一行。
        //注意默認沒有換行,所以需要自己添加換行符
        bw.write(str +"\n");
        str = br.readLine();
    }
    // 釋放資源
    br.close();
    bw.close();
}

測試

public static void main(String[] args) throws IOException {

    byteCopy("d:/source.txt" , "d:/target.txt");
    
    stringCopy("d:/source.txt" , "d:/target.txt");
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容