2017-02-16 8 views
1

私は次のユースケースを持っている:サービスInputStream InputStreamsとOutputStreamsの間の書き込みを減らすには?

  • から読み取る

    • は結果がOutputStream
    • に格納され、InputStreamを通過し、いくつかのものを置き換える今私が作成したInputStreamでの作業に行く必要があります

      OutputStream

    からこれは私が今使用してコードです0

    InputStream resourceStream = service.getStream(); 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    replace(resourceStream, output, ...); 
    resourceStream.close(); 
    resourceStream = new ByteArrayInputStream(out.toByteArray()); 
    

    多くのシフトと変換のストリームがあるので、よりクリーンなソリューションがあるかどうか疑問に思っていました。おそらく、InputStreamとして使用することができるOutputStream、または内容が書き込まれるInputStreamを含むOutputStreamとすることができます。

  • +1

    ストリームはストリームです。これは、それがシリアルアクセスで、折り返しなしのバイト列であることを意味します。より良い方法は、元のストリームから1つの項目を取り出し、処理のすべての段階を通過させ、必要に応じて最終出力ストリームに書き込むことです。 – RealSkeptic

    +0

    したがって、このOutputStreamは、そこに現れたらすぐにInputStreamからデータを取得する必要がありますか? –

    +0

    @PavloPlynkoもっと似ています:データは、 'OutputStream'に書き込まれるとすぐに「新しい」InputStreamになければなりません。 –

    答えて

    1

    単一のオブジェクトでデータを書き込んだり読み込んだりしても、InputStreamOutputStreamの実装は「インターフェイス」ではなく「クラス」として実装されています。

    また、Javaでは、単一のサブクラスが複数のスーパークラスを拡張できないため、入力ストリーム操作と出力ストリーム操作の両方を単一のクラスに持つという夢は単なる夢のままです。

    プログラマにとって残された唯一の選択肢は、InputStreamとOutputStreamの両方がクライアントに公開されているクラスを作成することだけです。 java.net.Socketと同じようなものです。 getInputStreamgetOutputStreamを公開します。論理レベルでは、同じ「ソケット」との間で読み書きが行われます。

    だから、あなたはこのような何かを行うことができます。

    public class IOStreamWrapper { 
    
        byte[] streamData; 
    
        public InputStream getInputStream() { 
         // return an inputstream that reads from streamData[] 
        } 
    
        public OutputStream getOutputStream() { 
         // return an outputstream that writes to streamData[] 
        } 
    
    } 
    

    参考文献:

    Java InputStream

    Java OutputStream


    ホープ、このことができます!

    関連する問題