9

Java で入力を出力に「パイプ」するための、次よりも簡潔で標準的なイディオム (JDK メソッドなど) はありますか?

public void pipe(Reader in, Writer out) {
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
    while (in.read(buf) >= 0 ) {
        out.append(buf.flip());
        buf.clear();
    }
}

Reader[編集]とWriter与えられていることに注意してください。正解は、パイプを取得inして形成する方法を示します (できれば、1 つまたは 2 つのメソッド呼び出しで)。とがとであるout場合の回答を受け入れます(できれば/から / への変換を伴う)。orが/または/のサブクラスである場合の回答は受け付けません。inoutInputStreamOutputStreamReaderWriterinoutReaderInputStreamWriterOutputStrem

4

3 に答える 3

10

Apache CommonsプロジェクトのIOUtilsには、必要なことを正確に実行するutililyメソッドがいくつあります。

IOUtils.copy(in, out)出力へのすべての入力のバッファリングされたコピーを実行します。Streamコードベースにor Reader/処理が必要な場所が複数ある場合はWriter、IOUtilsを使用することをお勧めします。

于 2008-12-01T19:10:48.607 に答える
1

java.io.PipedInputStreamPipedOutputStream、または同じパッケージのPipedReader / PipedWriterを見てください。

PipedInputStream のドキュメントから:

パイプされた入力ストリームは、パイプされた出力ストリームに接続する必要があります。パイプされた入力ストリームは、パイプされた出力ストリームに書き込まれたデータ バイトを提供します。通常、データは 1 つのスレッドによって PipedInputStream オブジェクトから読み取られ、データは別のスレッドによって対応する PipedOutputStream に書き込まれます。スレッドがデッドロックする可能性があるため、1 つのスレッドから両方のオブジェクトを使用しようとすることはお勧めしません。パイプされた入力ストリームにはバッファが含まれており、制限内で読み取り操作を書き込み操作から分離しています。接続されたパイプ出力ストリームにデータ バイトを提供していたスレッドが生きていない場合、パイプは壊れていると言われます。

于 2008-09-24T15:15:27.093 に答える
1

利用可能な唯一の最適化は、NIO API の FileChannels: ReadsWritesによるものです。JVM はこの呼び出しを最適化して、最初にデータをカーネル空間に移動することなく、ファイルから宛先チャネルにデータを移動できます。詳細については、この記事を参照してください。

于 2008-09-24T19:11:17.290 に答える