“又是我。”
“嗨,艾莉!”
“今天我想告訴大家有關BufferedReader和BufferedWriter 的所有信息。”
“你已經跟我說過了。它們真的沒有那麼複雜。”
“好的。那告訴我BufferedReader是如何工作的。”
“ BufferedReader就像一個 110/220V 轉換器。”
“您必須將讀取數據的Reader對像傳遞給BufferedReader構造函數。BufferedReader對像從Reader讀取大塊數據並將它們存儲在內部緩衝區中。這就是為什麼使用 BufferedReader從Reader讀取更快而不是直接從Reader閱讀。”
“沒錯。那麼BufferedWriter呢?”
“這是小菜一碟。假設我們寫入一個FileWriter。數據會立即寫入磁盤。如果我們頻繁寫入少量數據,那麼我們會經常訪問磁盤,這會大大降低程序速度。但是如果我們使用BufferedWriter作為“轉換器”,那麼寫入操作會快得多。當您寫入 BufferedWriter 時,它將數據保存在內部緩衝區中。當緩衝區已滿時,它將數據寫入Writer為一大塊。這要快得多。”
“嗯。沒錯。但你忘了什麼?”
“完成寫入後,您需要在BufferedWriter對像上調用flush()方法以強制它將仍在緩衝區中的任何數據發送到 Writer 。 ”
“還有什麼?”
“還有什麼?哦!只要緩衝區還沒有寫入 Writer ,就可以刪除和/或替換數據。”
“阿米戈!我印象深刻!你是專家!好吧,那麼我會告訴你一些新類: ByteArrayStream和PrintStream。”
“例如,ByteArrayInputStream和ByteArrayOutputStream。”
“這些類有點像StringReader和StringWriter。除了StringReader從字符串 ( String ) 中讀取字符 ( char ) ,而InputStream從字節數組 ( ByteArray ) 中讀取字節。”
StringWriter將字符 ( char ) 寫入字符串,而ByteArrayOutputStream將字節寫入內部字節數組。當您寫入StringWriter時,其內部字符串會變長,而當您寫入ByteArrayOutputStream時,其內部字節數組也會動態擴展。
“記住上節課給你的例子:”
public static void main (String[] args) throws Exception
{
String test = "Hi!\n My name is Richard\n I'm a photographer\n";
StringReader reader = new StringReader(test);
StringWriter writer = new StringWriter();
executor(reader, writer);
String result = writer.toString();
System.out.println("Result: "+ result);
}
public static void executor(Reader reader, Writer writer) throws Exception
{
BufferedReader br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
StringBuilder sb = new StringBuilder(line);
String newLine = sb.reverse().toString();
writer.write(newLine);
}
}
“如果它使用字節而不是字符,它會是這樣的:”
public static void main (String[] args) throws Exception
{
String test = "Hi!\n My name is Richard\n I'm a photographer\n";
InputStream inputStream = new ByteArrayInputStream(test.getBytes());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
executor(inputStream, outputStream);
String result = new String(outputStream.toByteArray());
System.out.println("Result: "+ result);
}
public static void executor(InputStream inputStream, OutputStream outputStream) throws Exception
{
BufferedInputStream bis = new BufferedInputStream(inputStream);
while (bis.available() > 0)
{
int data = bis.read();
outputStream.write(data);
}
}
“一切都與上面的示例相同。除了,我們用 ByteArray 替換了 String,用 InputStream 替換了 Reader,用 OutputStream 替換了 Writer。”
“僅有的兩個其他步驟是將 String 轉換為 ByteArray,然後再轉換回來。如您所見,這很容易完成:”
public static void main (String[] args) throws Exception
{
String test = "Hi!\n My name is Richard\n I'm a photographer\n";
byte[] array = test.getBytes();
String result = new String(array);
System.out.println("Result: "+ result);
}
“要獲取已添加到 ByteArrayOutputStream 的字節,請調用toByteArray () 方法。”
“啊。與 StringReader/StringWriter 的相似之處非常強,尤其是在你向我指出它們之後。謝謝你,Ellie,給了我一堂非常有趣的課。”
“這麼著急去哪裡?我還有個小禮物要給你,我想給你講講PrintStream類。”
“PrintStream?我還是第一次聽說這個課程。”
“是的。特別是,如果您不考慮從學習 Java 的第一天起就一直在使用它的事實。您還記得System.out嗎?好吧,System.out是系統的靜態(類)變量類,它的類型是... PrintStream!這就是所有這些 print、println 等方法的來源。”
“哇。真有趣。我什至從來沒有考慮過。告訴我更多。”
“很好。好吧,聽好了。PrintStream 類是為可讀輸出而發明的。它幾乎完全由 print 和 println 方法組成。看看這張表:”
方法 | 方法 |
---|---|
void print(boolean b) |
void println(boolean b) |
void print(char c) |
void println(char c) |
void print(int c) |
void println(int c) |
void print(long c) |
void println(long c) |
void print(float c) |
void println(float c) |
void print(double c) |
void println(double c) |
void print(char[] c) |
void println(char[] c) |
void print(String c) |
void println(String c) |
void print(Object obj) |
void println(Object obj) |
void println() |
|
PrintStream format (String format, Object ... args) |
|
PrintStream format (Locale l, String format, Object ... args) |
“還有幾種格式方法,因此您可以使用格式字符串輸出數據。例如:”
String name = "Kolan";
int age = 25;
System.out.format("My name is %s. My age is %d.", name, age);
My name is Kolan. My age is 25.
“嗯,我記得。我們已經研究過String類的格式化方法了。”
“目前為止就這樣了。”
“謝謝,艾莉。”
GO TO FULL VERSION