When I want to write the full contents of a file into an OutputStream
, I usually allocate a buffer as a byte[]
, then make a for
loop to read
data from the file's InputStream
into the buffer and write the buffer contents into the OutputStream
, until the InputStream
has no more bytes available.
This seems rather clumsy to me. Is there a better way to do this?
Also, I am always unsure about the buffer size. Usually, I am allocating 1024 bytes, because it just feels good. Is there a better way to determine a reasonable buffer size?
In my current case, I want to copy the full contents of a file into the output stream that writes the contents of an HTTP response. So, this is not a question about how to copy files on the file system.
Apache Commons-IO:
JDK NIO
For Java 1.7+ you can use the Files.copy(Path, OutputStream), e.g.
Note, since you are dealing with
HttpServletResponse
is is also a good idea to set correct response headers. Add the following lines before you copy the actual file data to the response:Note, the encoding of the file name passed to the content disposition is important, see this question.
With commons-io you have a one-line solution:
Note that you'd have to close your streams manually (or by
IOUtils.closeQuitely(..)
)