程序通常包括將數據快速寫入文件或其他地方的要求。這就提出了問題:我們應該怎麼做?我們應該選擇哪個班級?今天我們將了解一個適合這個角色的候選人——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, 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,我們可以將Strings和StringBuilders以及StringBuffers傳遞給append方法。但是write()方法只接受一個String。
就這樣吧!今天我們熟悉了緩衝區,如何對文件執行緩衝寫入,以及可以用來執行此操作的方法。
GO TO FULL VERSION