0

http 接続からストリーム データを取得しています。log4j を使用して、ストリームをログ ファイルに記録したいと考えています。

他の操作を行うには、このストリームがさらに必要です (保持する必要があります)

どうやってやるの?

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/xml");
InputStream xml = connection.getInputStream();

私はこれを試しました:

StreamUtils.copy(xml, new LogOutputStreamUtil(log, Level.INFO));

http://www.java2s.com/Open-Source/Java/Testing/jacareto/jacareto/toolkit/log4j/LogOutputStream.java.htmの LogOutputStreamUtil

しかし、それがログに記録されるとすぐに。ストリームが閉じられています:(

4

2 に答える 2

2

簡単な解決策は、独自の inputStream ラッパーを作成することです

何かのようなもの:

class LogingInputStream extends BufferedStream {
    ByteArrayOutputStream copy4log = new ByteArrayOutputStream();
    InputStream source;

    public LogingInputStream( InputStream source ) { this.source = source; }

    public int read() {
        int value = source.read()
        logCopy.write( value );
        return value;
    }

    public void close() {
        source.close();
        StreamUtils.copy(xml, new LogOutputStreamUtil(copy4log, Level.INFO));
        copy4log.close();
    }

    .....more code here
}

とにかく、一般的な考え方は、入力ストリームの読み取りメソッドをインターセプトする必要があるということです。

ソースinputStreamをバッファ(バイト配列、文字列、またはあなたに合ったもの)にコピーし、そのバッファをログに記録し、バッファの周りに別のinputStreamを作成し、ソースinputStreamの代わりに呼び出し元に返すなど、これを達成する他の方法があります。実行するのは簡単ですが、正しい解決策はユースケースによって異なります。

于 2012-09-11T06:44:46.243 に答える