“又是我。”

“嗨,艾莉!”

“今天我想告訴大家有關BufferedReaderBufferedWriter 的所有信息。”

“你已經跟我說過了。它們真的沒有那麼複雜。”

“好的。那告訴我BufferedReader是如何工作的。”

BufferedReader就像一個 110/220V 轉換器。”

“您必須將讀取數據的Reader對像傳遞給BufferedReader構造函數。BufferedReader對像從Reader讀取大塊數據並將它們存儲在內部緩衝區中。這就是為什麼使用 BufferedReaderReader讀取更快而不是直接從Reader閱讀。”

“沒錯。那麼BufferedWriter呢?”

“這是小菜一碟。假設我們寫入一個FileWriter。數據會立即寫入磁盤。如果我們頻繁寫入少量數據,那麼我們會經常訪問磁盤,這會大大降低程序速度。但是如果我們使用BufferedWriter作為“轉換器”,那麼寫入操作會快得多。當您寫入 BufferedWriter 時它將數據保存在內部緩衝區中。當緩衝區已滿時,它將數據寫入Writer為一大塊。這要快得多。”

“嗯。沒錯。但你忘了什麼?”

“完成寫入後,您需要在BufferedWriter對像上調用flush()方法以強制它將仍在緩衝區中的任何數據發送到 Writer

“還有什麼?”

“還有什麼?哦!只要緩衝區還沒有寫入 Writer 就可以刪除和/或替換數據。”

“阿米戈!我印象深刻!你是專家!好吧,那麼我會告訴你一些新類:  ByteArrayStreamPrintStream。”

“例如,ByteArrayInputStreamByteArrayOutputStream。”

“這些類有點像StringReaderStringWriter。除了StringReader從字符串 ( String ) 中讀取字符 ( char ) ,而InputStream從字節數組 ( ByteArray ) 中讀取字節。”

StringWriter將字符 ( char ) 寫入字符串,而ByteArrayOutputStream將字節寫入內部字節數組。當您寫入StringWriter時,其內部字符串會變長,而當您寫入ByteArrayOutputStream時,其內部字節數組也會動態擴展。

“記住上節課給你的例子:”

從 reader 對象讀取並寫入 writer 對象:
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);
 }
}

“如果它使用字節而不是字符,它會是這樣的:”

從 InputStream 對象讀取並寫入 OutputStream 對象:
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,然後再轉換回來。如您所見,這很容易完成:”

將 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 轉換為 ByteArray 並再次轉換回來
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類的格式化方法了。”

“目前為止就這樣了。”

“謝謝,艾莉。”