Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java idiom for "piping"

Tags:

java

io

pipe

Is there a more concise/standard idiom (e.g., a JDK method) for "piping" an input to an output in Java than the following?

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();
    }
}

[EDIT] Please note the Reader and Writer are given. The correct answer will demonstrate how to take in and out and form a pipe (preferably with no more than 1 or 2 method calls). I will accept answers where in and out are an InputStream and an OutputStream (preferably with a conversion from/to Reader/Writer). I will not accept answers where either in or out is a subclass of Reader/InputStream or Writer/OutputStrem.

like image 875
Chris Conway Avatar asked Feb 04 '23 13:02

Chris Conway


2 Answers

IOUtils from the Apache Commons project has a number of utilily methods that do exactly what you need.

IOUtils.copy(in, out) will perform a buffered copy of all input to the output. If there is more than one spot in your codebase that requires Stream or Reader/Writer handling, using IOUtils could be a good idea.

like image 200
Henning Avatar answered Feb 06 '23 11:02

Henning


Take a look at java.io.PipedInputStream and PipedOutputStream, or PipedReader/PipedWriter from the same package.

From the Documentation of PipedInputStream:

A piped input stream should be connected to a piped output stream; the piped input stream then provides whatever data bytes are written to the piped output stream. Typically, data is read from a PipedInputStream object by one thread and data is written to the corresponding PipedOutputStream by some other thread. Attempting to use both objects from a single thread is not recommended, as it may deadlock the thread. The piped input stream contains a buffer, decoupling read operations from write operations, within limits. A pipe is said to be broken if a thread that was providing data bytes to the connected piped output stream is no longer alive.

like image 31
Einar Avatar answered Feb 06 '23 12:02

Einar