2

アプリケーションから別のアプリケーションに渡されるデータのストリームを記録する必要があります(両方とも私の制御下にあります)。

統合テストのために送受信されたバイトを記録するためにこれを実行したいと思います。

私はこのようなことをすることができます:

void inputStreamToOutputStream(final InputStream inputStream, final OutputStream out) {
    Thread t = new Thread(new Runnable() {

        public void run() {
            try {
                int d;
                while ((d = inputStream.read()) != -1) {
                    out.write(d);
                    savedFile.write(d);
                }
            } catch (IOException ex) {
            }
        }
    });
    t.start();
}

しかし、これを行うためのライブラリがすでにあるはずだと感じています。Apache IOUtilsには、copy2つのストリームを結び付けるメソッドがあることがわかります。

IOUtils.copy(in, out);

しかし、これでは送信されたバイトを「記録」することはできません。私が自分で転がる前に、誰かがすでにこれを行っているまともなライブラリを提案できますか?

4

2 に答える 2

5

ApacheCommonsIOのTeeOutputStream / TeeInputStreamsavedInFileを使用すると、出力だけでなく、およびsavedOutFile:にも書き込むことができます。

OutputStream teeOutput = new TeeOutputStream(out, savedOutFile);
InputStream teeInput = new TeeInputStream(input, savedInFile)

次に、読み取り/書き込みを行うアプリケーションにTシャツを送信できます。

于 2012-11-26T21:29:25.143 に答える
0

前に述べたように、CommonsIOのTeeOutputStreamを使用できますが、それでも入力ストリームを適切にバッファリングする必要があります。含めたコードは近いものでしたが、バイト自体ではなく、2つのストリームに読み取られたバイト数を書き込んでいただけです。

代わりに次のようなものを試してください。

void inputStreamToOutputStream(final InputStream inputStream, final OutputStream out) {
    Thread t = new Thread(new Runnable() {

        public void run() {
            try {
                TeeOutputStream tos = new TeeOutputStream (out,savedFile);
                byte [] buf = byte[1024];
                int d;
                while ((d = inputStream.read(buf,0,buf.length)) != -1) {
                    tos.write(buf,0,d);
                }
            } catch (IOException ex) {
            }
        }
    });
    t.start();
}
于 2012-11-26T21:40:32.080 に答える