Easy way to write contents of a Java InputStream to an OutputStream

后端 未结 23 2483
粉色の甜心
粉色の甜心 2020-11-22 02:10

I was surprised to find today that I couldn\'t track down any simple way to write the contents of an InputStream to an OutputStream in Java. Obviou

相关标签:
23条回答
  • 2020-11-22 02:49

    PipedInputStream and PipedOutputStream should only be used when you have multiple threads, as noted by the Javadoc.

    Also, note that input streams and output streams do not wrap any thread interruptions with IOExceptions... So, you should consider incorporating an interruption policy to your code:

    byte[] buffer = new byte[1024];
    int len = in.read(buffer);
    while (len != -1) {
        out.write(buffer, 0, len);
        len = in.read(buffer);
        if (Thread.interrupted()) {
            throw new InterruptedException();
        }
    }
    

    This would be an useful addition if you expect to use this API for copying large volumes of data, or data from streams that get stuck for an intolerably long time.

    0 讨论(0)
  • 2020-11-22 02:52

    If you are using Java 7, Files (in the standard library) is the best approach:

    /* You can get Path from file also: file.toPath() */
    Files.copy(InputStream in, Path target)
    Files.copy(Path source, OutputStream out)
    

    Edit: Of course it's just useful when you create one of InputStream or OutputStream from file. Use file.toPath() to get path from file.

    To write into an existing file (e.g. one created with File.createTempFile()), you'll need to pass the REPLACE_EXISTING copy option (otherwise FileAlreadyExistsException is thrown):

    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING)
    
    0 讨论(0)
  • 2020-11-22 02:53

    Try Cactoos:

    new LengthOf(new TeeInput(input, output)).value();
    

    More details here: http://www.yegor256.com/2017/06/22/object-oriented-input-output-in-cactoos.html

    0 讨论(0)
  • 2020-11-22 02:54

    Java 9

    Since Java 9, InputStream provides a method called transferTo with the following signature:

    public long transferTo(OutputStream out) throws IOException
    

    As the documentation states, transferTo will:

    Reads all bytes from this input stream and writes the bytes to the given output stream in the order that they are read. On return, this input stream will be at end of stream. This method does not close either stream.

    This method may block indefinitely reading from the input stream, or writing to the output stream. The behavior for the case where the input and/or output stream is asynchronously closed, or the thread interrupted during the transfer, is highly input and output stream specific, and therefore not specified

    So in order to write contents of a Java InputStream to an OutputStream, you can write:

    input.transferTo(output);
    
    0 讨论(0)
  • 2020-11-22 02:55

    PipedInputStream and PipedOutputStream may be of some use, as you can connect one to the other.

    0 讨论(0)
  • 2020-11-22 02:56

    Not very readable, but effective, has no dependencies and runs with any java version

    byte[] buffer = new byte[1024];
    for (int n; (n = inputStream.read(buffer)) != -1; outputStream.write(buffer, 0, n));
    
    0 讨论(0)
提交回复
热议问题