2008-10-19 46 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?这就是你应该用于这个目的。