当前位置:  开发笔记 > 编程语言 > 正文

将OutputStream获取为String

如何解决《将OutputStream获取为String》经验,为你挑选了4个好方法。

将输出从java.io.OutputStream传递到Java中的String的最佳方法是什么?

说我有方法:

  writeToStream(Object o, OutputStream out)

它将对象中的某些数据写入给定流.但是,我希望尽可能轻松地将此输出转换为String.

我正在考虑写一个这样的课程(未经测试):

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

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

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

但有更好的方法吗?我只想进行测试!



1> Horcrux7..:

我会用一个ByteArrayOutputStream.完成后你可以打电话:

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

或更好

baos.toString( codepage );

对于String构造函数,String可以是String或java.nio.charset.Charset的实例.可能的值是java.nio.charset.StandardCharsets.UTF_8.

方法toString只接受String作为codepage参数(Stand Java 8).


bytearray只是二进制数据.由于(unicode)文本可以以多种不同的方式编码二进制,ByteArrayOutputStream需要知道用于编码字节的编码,因此它可以使用相同的编码将字节再次解码为字符串.简单地使用toString而不使用参数是不明智的,因为你只是忽略了问题而不是解决它; Java将使用可能正确的平台编码.它基本上是随机的.您需要找出使用什么编码将文本写入字节并将该编码传递给toString.
只是澄清这里引用的代码页:在Java中你可以使用Charset.defaultCharset()或Charset.forName("specific charset"); 对我有用的是:new String(baos.toByteArray(),Charset.defaultCharset());
ByteArrayOutputStream没有toArray()方法; 虽然它确实有.ByteArray().你能解决这个问题吗?另外,为什么不使用稍微简单的baos.toString(String charsetName).
使用`defaultCharset`的@WallaceBrown并不比完全忽略charset更好 - 你需要在使用`toString之前找出它是什么
可以简单地返回baos.toString(),什么是coepage的东西?
@artbristol:虽然从技术上讲,关于“ defaultCharset”的警告是正确的,但在这种情况下(单元测试)似乎无关紧要-在程序的相同执行期间,字符串将在同一台机器上进行编码和解码。在这里,实际上没有风险使用不同的代码页。
StandardCharsets.UTF_8是一个Charset,而不是String。此外,该参数称为“ charsetName”,而不是“ codepage”。

2> Joe Liversed..:

我喜欢Apache Commons IO库.看看它的ByteArrayOutputStream版本,它有一个toString(String enc)方法以及toByteArray().使用像Commons项目这样的现有和可信组件可以让您的代码更小,更容易扩展和重用.祝好运.


嗯,我是狂热的Apache Commons用户,但在这种情况下,我不明白为什么你应该使用Commons IO的ByteArrayOutputStream而不是JDK自己的java.io.ByteArrayOutputStream.后者还提供toString(String charsetName)和toByteArray()方法.注意详细说明?
为自己节省一年的时间并阅读所有常见的API,以便在遇到问题时,您可以释放经过全面测试和社区拥有的解决方案.

3> 小智..:

这很好用

    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);

然后打印字符串或获取它只是引用"输出"流本身作为示例,将字符串打印到console = >> System.out.println(output);

仅供参考:我的方法调用marshaller.marshal(Object,Outputstream)是使用XML.这与这个话题无关.

这对于生产使用来说是非常浪费的,转换的方式太多而且有点松散.这只是为了证明你完全有可能创建一个自定义的OuputStream并输出一个字符串.但是只需要使用Horcrux7方式,仅使用两个方法调用就可以了.

世界生活在另一天......


只是将一个字节转换为char只能在ascii上运行.像Horcrux7一样使用ByteArrayOutputStream
同意戴夫雷.您不能假设您的字节是ASCII字符.您需要使用编码来解释字节.使用byteArrayOutputStream.toString("UTF-8")或new String(byteArrayOutputStream.toByteArray(),"UTF-8").

4> Adrian Mouat..:

这是我最终做的事情:

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.


考虑用`StandardCharsets.UTF_8`替换`"UTF-8"`.
@JavaJigs我在将近5年前的答案底部阐明了这一点:)
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有