Java PrintStream 到字符串
一、概述
在這個簡短的教程中,我們將闡明如何在 Java 中將PrintStream
轉換為String
。
我們將從使用核心 Java 方法開始。然後,我們將看到如何使用 Apache Commons IO 等外部庫實現相同的目標。
2.什麼是**PrintStream
**
在 Java 中, PrintStream
是一種輸出流,它提供了一種方便的方式來打印和格式化數據。它帶有一組用於打印和格式化不同類型數據的方法,例如println()
和printf().
與其他輸出流不同,它從不拋出IOException.
但是,如果出現錯誤,它會設置一個標誌,可以通過checkError()
方法進行測試。
現在我們知道什麼是PrintStream
,讓我們看看如何將它轉換為字符串。
3. 使用ByteArrayOutputStream
簡而言之, ByteArrayOutputStream is
一個輸出流,其中數據被寫入一個字節數組。
通常,我們可以使用它來捕獲PrintStream
的輸出,然後將捕獲的字節轉換為字符串。那麼,讓我們看看實際情況:
public static String usingByteArrayOutputStreamClass(String input) throws IOException {
if (input == null) {
return null;
}
String output;
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream(outputStream)) {
printStream.print(input);
output = outputStream.toString();
}
return output;
}
如我們所見,我們創建了一個PrintStream
對象,並將ByteArrayOutputStream
傳遞給構造函數。
然後,我們使用print()
方法將輸入字符串寫入PrintStream
。
最後,我們使用ByteArrayOutputStream
類的toString()
方法將輸入轉換為String
對象。
現在,讓我們使用測試用例來確認這一點:
@Test
public void whenUsingByteArrayOutputStreamClass_thenConvert() throws IOException {
assertEquals("test", PrintStreamToStringUtil.usingByteArrayOutputStreamClass("test"));
assertEquals("", PrintStreamToStringUtil.usingByteArrayOutputStreamClass(""));
assertNull(PrintStreamToStringUtil.usingByteArrayOutputStreamClass(null));
}
如上所示,我們的方法完成了將PrintStream
轉換為字符串的工作。
4.使用自定義輸出流
另一種解決方案是使用OutputStream
類的自定義實現。
基本上, OutputStream
是所有表示字節輸出流的類的超類,包括ByteArrayOutputStream
.
首先,讓我們考慮一下CustomOutputStream
靜態內部類:
private static class CustomOutputStream extends OutputStream {
private StringBuilder string = new StringBuilder();
@Override
public void write(int b) throws IOException {
this.string.append((char) b);
}
@Override
public String toString() {
return this.string.toString();
}
}
在這裡,我們使用StringBuilder
實例逐字節寫入給定數據。此外,我們覆蓋了toString()
方法以獲取StringBuilder
對象的字符串表示。
接下來,讓我們重用上一節中的相同示例。但是,我們將使用我們的自定義實現而不是ByteArrayOutputStream
:
public static String usingCustomOutputStream(String input) throws IOException {
if (input == null) {
return null;
}
String output;
try (CustomOutputStream outputStream = new CustomOutputStream(); PrintStream printStream = new PrintStream(outputStream)) {
printStream.print(input);
output = outputStream.toString();
}
return output;
}
現在,讓我們添加另一個測試用例來確認一切都按預期工作:
@Test
public void whenCustomOutputStream_thenConvert() throws IOException {
assertEquals("world", PrintStreamToStringUtil.usingCustomOutputStream("world"));
assertEquals("", PrintStreamToStringUtil.usingCustomOutputStream(""));
assertNull(PrintStreamToStringUtil.usingCustomOutputStream(null));
}
5. 使用 Apache Commons IO
或者,我們可以使用 Apache Commons IO 庫來實現相同的目標。
首先,讓我們將 Apache Commons IO依賴項添加到我們的pom.xml
中:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
Apache Commons IO 提供了自己的[ByteArrayOutputStream](https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/output/ByteArrayOutputStream.html) .
此類帶有toByteArray()
方法以將數據檢索為字節數組。
讓我們在實踐中看看它:
public static String usingApacheCommonsIO(String input) {
if (input == null) {
return null;
}
org.apache.commons.io.output.ByteArrayOutputStream outputStream = new org.apache.commons.io.output.ByteArrayOutputStream();
try (PrintStream printStream = new PrintStream(outputStream)) {
printStream.print(input);
}
return new String(outputStream.toByteArray());
}
簡而言之,我們使用toByteArray()
從輸出流中獲取字節數組。然後,我們將返回的數組傳遞給String
構造函數。
這裡的一個重要警告是,與 Java 不同,我們不需要關閉ByteArrayOutputStream
。
該解決方案也可以正常工作,如單元測試所示:
@Test
public void whenUsingApacheCommonsIO_thenConvert() {
assertEquals("hello", PrintStreamToStringUtil.usingApacheCommonsIO("hello"));
assertEquals("", PrintStreamToStringUtil.usingApacheCommonsIO(""));
assertNull(PrintStreamToStringUtil.usingApacheCommonsIO(null));
}
六,結論
在本文中,我們學習瞭如何將PrintStream
轉換為String
。
一路上,我們解釋瞭如何使用核心 Java 方法來完成它。然後,我們說明瞭如何使用 Apache Commons IO 等外部庫。
與往常一樣,本文中使用的代碼可以在 GitHub 上找到。