2008-10-19 49 views
469

將輸出從java.io.OutputStream傳遞到Java中的String的最佳方式是什麼?將OutputStream轉換爲字符串

說我有方法:

writeToStream(Object o, OutputStream out) 

從對象與給定流寫入某些數據。但是,我希望儘可能輕鬆地將此輸出轉換爲字符串。

我考慮寫一個類像這樣(未經):

class StringOutputStream extends OutputStream { 

    StringBuilder mBuf; 

    public void write(int byte) throws IOException { 
    mBuf.append((char) byte); 
    } 

    public String getString() { 
    return mBuf.toString(); 
    } 
} 

但有一個更好的辦法?我只想運行測試!

+6

你只有ASCII字節嗎?你不需要代碼頁? – Horcrux7 2008-10-19 20:13:35

+0

在這種情況下,是的。不過,好點 - 我沒有想過。 – 2008-10-19 20:19:03

回答

514

我會使用ByteArrayOutputStream。而在完成您可以撥打:

new String(baos.toByteArray(), codepage); 

或更好

baos.toString(codepage); 

對於String構造的codepage可以是一個字符串或java.nio.charset.Charset一個實例。可能的值是java.nio.charset.StandardCharsets.UTF_8

方法toString只接受一個字符串作爲codepage參數(stand Java 8)。

+7

ByteArrayOutputStream沒有toArray()方法;它確實有toByteArray()。你能解決答案嗎?另外,爲什麼不使用baos.toString(String charsetName),這會稍微簡單一些。 – Jonik 2009-06-07 15:29:38

+0

感謝您使用toString(charset)提示。我從來沒有看過toString,因爲我期待着一個ByteArrayOutputStream @ 123456。我還糾正了toByteArray()的錯誤。 – Horcrux7 2009-06-07 18:41:05

+0

另請注意,除非您明確要求使用自定義安裝,否則不會安裝某些代碼頁。 – 2009-06-07 21:14:56

40

我喜歡Apache Commons IO庫。看看它的版本ByteArrayOutputStream,它有一個toString(String enc)方法以及toByteArray()。使用Commons項目等現有的可信組件可以讓您的代碼更小,更容易擴展和重新使用。祝你好運。

11

這裏是我落得這樣做:

Obj.writeToStream(toWrite, os); 
try { 
    String out = new String(os.toByteArray(), "UTF-8"); 
    assertTrue(out.contains("testString")); 
} catch (UnsupportedEncondingException e) { 
    fail("Caught exception: " + e.getMessage()); 
} 

其中OS是一個ByteArrayOutputStream

21

這個工作很好

OutputStream output = new OutputStream() 
    { 
     private StringBuilder string = new StringBuilder(); 
     @Override 
     public void write(int b) throws IOException { 
      this.string.append((char) b); 
     } 

     //Netbeans IDE automatically overrides this toString() 
     public String toString(){ 
      return this.string.toString(); 
     } 
    }; 

方法調用= >>marshaller.marshal((Object) toWrite , (OutputStream) output);

然後打印字符串或得到它只是提到「輸出」流本身 作爲一個例子,打印出來的字符串到控制檯= >>System.out.println(output);

僅供參考:我的方法調用marshaller.marshal(Object,Outputstream)是用於處理XML。這與這個話題無關。

這對於生產使用來說是非常浪費的,有許多轉換方式,而且有點鬆動。這只是爲了向你證明,完全可以創建一個自定義的OuputStream並輸出一個字符串。但是隻要使用Horcrux7,只需兩個方法調用即可。

和世界住在另一天....

-11

你爲什麼不使用ByteArrayOutputStream?這就是你應該用於這個目的。