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 有一种copy方法可以将两个流绑定在一起:

IOUtils.copy(in, out);

但这并不能让我“记录”发送的字节。在我自己动手之前,任何人都可以推荐一个已经这样做的像样的图书馆吗?

4

2 回答 2

5

使用来自 Apache Commons IO 的TeeOutputStream / TeeInputStream,您可以写入您的输出以及您的savedInFileand savedOutFile

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

然后您可以将 tee 发送到执行读/写的应用程序。

于 2012-11-26T21:29:25.143 回答
0

正如前面提到的答案,您可以使用CommonsIO的 TeeOutputStream,但您仍然需要正确缓冲输入流。您包含的代码很接近,但您只是将读出的字节数写入两个流,而不是字节本身。

尝试这样的事情:

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 回答