将OutputStream获取为String

Adr*_*uat 555 java string io stream

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

说我有方法:

  writeToStream(Object o, OutputStream out)
Run Code Online (Sandbox Code Playgroud)

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

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

class StringOutputStream extends OutputStream {

  StringBuilder mBuf;

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

  public String getString() {
    return mBuf.toString();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Hor*_*ux7 588

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

new String( baos.toByteArray(), codepage );
Run Code Online (Sandbox Code Playgroud)

或更好

baos.toString( codepage );
Run Code Online (Sandbox Code Playgroud)

对于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. (33认同)
  • 只是澄清这里引用的代码页:在Java中你可以使用Charset.defaultCharset()或Charset.forName("specific charset"); 对我有用的是:new String(baos.toByteArray(),Charset.defaultCharset()); (10认同)
  • ByteArrayOutputStream没有toArray()方法; 虽然它确实有.ByteArray().你能解决这个问题吗?另外,为什么不使用稍微简单的baos.toString(String charsetName). (8认同)
  • 使用`defaultCharset`的@WallaceBrown并不比完全忽略charset更好 - 你需要在使用`toString之前找出它是什么 (5认同)
  • 可以简单地返回baos.toString(),什么是coepage的东西? (3认同)
  • @artbristol:虽然从技术上讲,关于“ defaultCharset”的警告是正确的,但在这种情况下(单元测试)似乎无关紧要-在程序的相同执行期间,字符串将在同一台机器上进行编码和解码。在这里,实际上没有风险使用不同的代码页。 (2认同)
  • StandardCharsets.UTF_8是一个Charset,而不是String。此外,该参数称为“ charsetName”,而不是“ codepage”。 (2认同)

Joe*_*dge 45

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

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

小智 24

这很好用

    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();
        }
    };
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Adr*_*uat 15

这是我最终做的事情:

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());
}
Run Code Online (Sandbox Code Playgroud)

os是一个ByteArrayOutputStream.

  • 考虑用`StandardCharsets.UTF_8`替换`"UTF-8"`. (18认同)
  • @JavaJigs我在将近5年前的答案底部阐明了这一点:) (2认同)

jsc*_*sse 9

baos.toString(StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

通过使用指定的字符集解码字节,将缓冲区的内容转换为字符串。

Java 17 - https://docs.oracle.com/