程序通常包括將數據快速寫入文件或其他地方的要求。這就提出了問題:我們應該怎麼做?我們應該選擇哪個班級?今天我們將了解一個適合這個角色的候選人——BufferedWriter

為什麼我們需要 BufferedWriter?

BufferedWriter 是一個將緩衝字符寫入流的類。它可以讓您減少訪問物理媒體的次數。也就是說,它不是每次寫入一個字符,而是將數據寫入緩衝區,然後將所有字符一次性全部寫入介質。

這大大提高了寫入速度。默認緩衝區大小為 8192 個字符,但這可以通過在構造函數中指定新大小來更改:


BufferedWriter(Writer in, int sz)

在這裡,構造函數的第一個參數是一個流,它將接收我們寫入的數據。事實證明sz是新緩衝區的大小。

Java 還有一個BufferedReader類:它用於緩衝讀取數據。

緩衝區到底是什麼?讓我們舉一個現實生活中的例子。緩衝區就像超市裡的籃子或購物車。與其拿著一件商品走到收銀台,付錢,把它放在汽車後備箱,然後再回來拿另一件商品,我們可以拿一個購物車,把我們想要的東西放進去,然後付款在結賬處。這正是緩衝區的工作原理:它收集數據,然後獲取所有內容並將其寫入,而不是分別寫入每個片段。

BufferedWriter 類的構造函數和方法

現在讓我們仔細看看BufferedWriter類。有兩個用於創建對象的構造函數:


public BufferedWriter(Writer out) 
public BufferedWriter(Writer out, int sz)

兩個構造函數中的out是要寫入的流,而sz,如前所述,是緩衝區的大小。

BufferedWriter類也幾個方法。今天我們將仔細研究其中的一些:

寫(字符[]數組) 將一個字符數組寫入緩衝區
write(String s, int off, int len) 將字符串的一部分寫入緩衝區
附加(字符c) 向緩衝區寫入一個字符
追加(CharSequence csq,int 開始,int 結束) 將數組的一部分寫入緩衝區
新隊() 寫一個行分隔符
沖洗() 沖洗流

讓我們編寫一個將值寫入文件的程序。為了作家參數,我們將傳遞一個文件寫入器給構造函數。它用於編寫文本文件,並有幾個構造函數來初始化對象:

FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)

對於我們的示例,我們將使用一個帶有文件名的構造函數:


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message);
	bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
 }

我們的代碼將使用write(String str)方法將str寫入file.txt文件。

還有其他寫法:

  • write(char[] array ) — 此變體接受並寫入一個char數組;

  • write(String s, int off, int len) — 這個變體接受一個字符串s;偏移量off,這是開始寫入的字符的索引;和len,這是要寫入的字符串(子字符串)的長度。


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message, 0, 11);
 	bufferedWriter.flush();

} catch(IOException ex) {
System.out.println(ex.getMessage());
}

這段代碼會將“Hello, Amig”寫入文件,因為我們告訴該方法從索引 0 開始寫入 11 個字符。

我們的代碼還有一個try-with 資源塊:


try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt"))) 

這意味著我的close()方法會自動調用緩衝寫入器對象,因為它實現了AutoCloseable接口。

代碼中的flush ()方法用於刷新輸出流,強制寫入所有緩衝字節。如果沒有此調用,寫入可能不會發生,因為它表明必須刷新緩衝區並且必須寫入緩衝的字節。

BufferedWriter類還有一個newLine()方法,可以我們的消息中添加一個新行:


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
        String message = "Hello, Amigo! This is a very important message!";
        bufferedWriter.write(message, 0, 13);
        bufferedWriter.newLine();
        bufferedWriter.write(message, 15, 33);
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

在文件中,我們得到:

你好,阿米戈!
這是一條非常重要的信息!

append()方法的簽名如下所示:


public Writer append(CharSequence csq, int start, int end)

它用於添加csq。這裡start是第一個字符的索引,end是要插入的字符串(或子字符串)的最後一個字符的索引。不插入索引結束的字符。


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
    String message = "Hello, Amigo! This is a very important message!";
    bufferedWriter.append(message, 0, 7);
    bufferedWriter.flush();
} catch (IOException ex) {
    System.out.println(ex.getMessage());
}

此代碼將為您提供:

你好,

也就是說,使用append方法,您可以指定將字符串的哪一部分添加到緩衝區。

更仔細地觀察write()append()之間的區別,我們首先看到它們在原則上都做同樣的事情——它們寫入值。

但是,不同之處在於append方法較新,並且將CharSequence作為參數,並且由於String實現了CharSequence,我們可以將StringsStringBuilders以及StringBuffers傳遞給append方法。但是write()方法只接受一個String

就這樣吧!今天我們熟悉了緩衝區,如何對文件執行緩衝寫入,以及可以用來執行此操作的方法。