1.OutputStream

我們最近剛剛探索了輸入流。是時候討論輸出流了。

該類OutputStream是所有支持字節輸出的類的父類。這是一個抽像類,它自己什麼都不做,但它有適用於各種場合的子類。

這聽起來非常複雜。更簡單地說,此類對字節進行操作,而不是對字符或其他數據類型進行操作。而且它是抽象的這一事實意味著我們通常不使用它,而是使用它的後代類之一。比如,FileOutputStream之類的。

但是回到OutputStream課堂上。此類具有其所有後代類都必須實現的方法。以下是主要的:

方法 描述
void write(int b)
將一個字節(不是int)寫入流。
void write(byte[] buffer)
將字節數組寫入流
void write(byte[] buffer, off, len)
將字節數組的一部分寫入流
void flush()
將緩衝區中存儲的所有數據寫入流
void close()
關閉流

當您創建一個繼承類的對象時InputStream,您通常會指定一個從中讀取數據的源對象InputStream。當您創建一個繼承類的對象時OutputStream,您通常還會指定數據將寫入的目標對像或流。

讓我們簡要介紹一下該類的所有方法OutputStream

write(int b)方法

此方法將一個字節(不是int)寫入輸出流。傳遞的值被強制轉換為一個字節,並且丟棄該 int 的前三個字節。

write(byte[] buffer)方法

將給定的字節數組寫入輸出流。就是這樣。

write(byte[] buffer, int offset, int length)方法

將傳遞的字節數組的一部分寫入輸出流。偏移量變量表示數組第一個元素的索引,是length要寫入的子集的長度。

flush()方法

flush()方法用於強制將當前流中可能緩衝的任何數據寫入目標流。這在使用緩沖和/或排列在鏈中的多個流對象時是相關的。

close()方法

將任何未寫入的數據寫入目標對象。close()如果您使用塊,則無需調用該方法try-with-resources

複製文件的例子

代碼 筆記
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStream用於從文件中讀取
OutputStream用於寫入文件

將數據讀入的緩衝區
只要流中有數據

將數據讀入緩衝區
將緩衝區中的數據寫入第二個流

2.Writer

該類Writer與類完全相同OutputStream,但只有一個區別:它使用字符 ( char) 而不是字節。

這是一個抽像類:您不能創建該類的對象Writer。它的主要目標是成為數百個後代類的公共父類,並為它們提供處理字符流的通用方法。

Writer該類(及其所有後代類)的方法:

方法 描述
void write(int b)
將一個字符(不是int)寫入流。
void write(char[] buffer)
將字符數組寫入流
void write(char[] buffer, off, len)
將字符數組的一部分寫入流
void write(String str)
將字符串寫入流
void write(String str, off, len)
將字符串的一部分寫入流
void flush()
將緩衝區中存儲的所有數據寫入流
void close()
關閉流

這些方法與類的方法非常相似OutputStream,但它們使用字符而不是字節。

方法說明:

write(int b)方法

此方法將單個字符 ( char— 而不是int) 寫入輸出流。傳遞的值被轉換為 a char,前兩個字節被丟棄。

write(char[] buffer)方法

將給定的字符數組寫入輸出流。

write(char[] buffer, int offset, int length)方法

將傳遞的字符數組的一部分寫入輸出流。該offset變量表示數組第一個元素的索引,length是要寫入的子集的長度。

write(String str)方法

將給定的字符串寫入輸出流。

write(String str, int offset, int length)方法

將給定字符串的一部分寫入輸出流:字符串被轉換為字符數組。該offset變量表示數組第一個元素的索引,length是要寫入的子集的長度。

flush()方法

flush()方法用於強制將當前流中可能緩衝的任何數據寫入目標流。這在使用緩沖和/或排列在鏈中的多個流對象時是相關的。

close()方法

將任何未寫入的數據寫入目標對象。close()如果您使用塊,則無需調用該方法try-with-resources

複製文本文件的程序示例:

代碼 筆記
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Reader用於從文件中
Writer讀取 用於寫入文件

我們將讀取數據的緩衝區
只要流中有數據

將數據讀入緩衝區
將緩衝區中的數據寫入第二個流

StringWriter班級

還有一個有趣的類繼承了該類Writer:它被稱為StringWriter. 它包含一個可變字符串——一個StringBuffer對象。每次您向StringWriter對象“寫入”內容時,文本都會簡單地添加到其內部緩衝區中。

例子:

代碼 筆記
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
一個目標字符流( StringWriter)被創建
一個字符串被寫入緩衝區裡面StringWriter
一個字符串被寫入緩衝區裡面StringWriter

一個對象的內容轉換成字符串

在這種情況下,該類StringWriter本質上是該類的包裝器StringBuffer,但該類StringWriter是流類的後代Writer,並且可以在流對象鏈中使用。這在實踐中是一個非常有用的屬性。