web-dev-qa-db-ja.com

OutputStreamを文字列にする

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

しかしもっと良い方法はありますか?テストを実行したいだけです。

534
Adrian Mouat

私はByteArrayOutputStreamを使います。そして最後にあなたが呼び出すことができます:

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

以上

baos.toString( codepage );

Stringコンストラクタの場合、codepageはStringまたは Java.nio.charset.Charset のインスタンスになります。可能な値は Java.nio.charset.StandardCharsets.UTF_8 です。

ToStringメソッドはcodepageパラメータとしてStringのみを受け付けます(Java 8スタンド)。

566
Horcrux7

私はApache Commons IOライブラリが好きです。そのバージョンの ByteArrayOutputStream を見てください。これにはtoString(String enc)メソッドとtoByteArray()メソッドがあります。 Commonsプロジェクトのような既存の信頼できるコンポーネントを使用すると、コードが小さくなり、拡張や再利用が容易になります。がんばろう。

44
Joe Liversedge

これはうまくいった

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

それから、文字列を出力するか、単に "output"ストリーム自体を参照するようにします。例として、文字列をconsole = >> System.out.println(output);に出力することです。

参考:私のメソッド呼び出しmarshaller.marshal(Object,Outputstream)はXMLを扱うためのものです。このトピックとは無関係です。

これは生産的な使用には非常に無駄が多く、変換が多すぎる方法があり、それは少し緩いです。これは、カスタムOuputStreamを作成して文字列を出力することがまったく可能であることを証明するためにコーディングされたばかりです。しかし、単にHorcrux 7の方法を使用すれば、2つのメソッド呼び出しだけですべてがうまくいきます。

そして世界は別の日に住んでいます…。

22
alcardenas

これが私がやってしまったものです:

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です。

13
Adrian Mouat