Is there a better way to write the full contents of a file to an OutputStream?
Solution 1
For Java 1.7+ you can use the Files.copy(Path, OutputStream), e.g.
HttpServletResponse response = // ...
File toBeCopied = // ...
try (OutputStream out = response.getOutputStream()) {
Path path = toBeCopied.toPath();
Files.copy(path, out);
out.flush();
} catch (IOException e) {
// handle exception
}
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:
String mimeType = URLConnection.guessContentTypeFromName(toBeCopied.getName());
String contentDisposition = String.format("attachment; filename=%s", toBeCopied.getName());
int fileSize = Long.valueOf(toBeCopied.length()).intValue();
response.setContentType(mimeType);
response.setHeader("Content-Disposition", contentDisposition);
response.setContentLength(fileSize);
Note, the encoding of the file name passed to the content disposition is important, see this question.
Solution 2
Apache Commons-IO:
IOUtils.copy(fileInputStream,outputStream);
JDK NIO
new FileInputStream(file).getChannel().transferTo(otherChannel);
Solution 3
With commons-io you have a one-line solution:
IOUtils.copy(yourFileInputStream, outputStream);
Note that you'd have to close your streams manually (or by IOUtils.closeQuitely(..)
)
Related videos on Youtube
Madoc
Freelance software developer/architect/integration specialist, working in and around Germany. My open source-software is published under Jackadull.
Updated on October 31, 2020Comments
-
Madoc over 2 years
When I want to write the full contents of a file into an
OutputStream
, I usually allocate a buffer as abyte[]
, then make afor
loop toread
data from the file'sInputStream
into the buffer and write the buffer contents into theOutputStream
, until theInputStream
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.
-
rfeak over 12 yearsThis would be my suggestion as well. Though what it does is the same thing.
-
Madoc over 12 yearsThat looks really nice. But for this simple task, it seems a little overdone to me to include another library. Of course, if there are more reasons to include Commons-IO, then this will be the solution of choice.
-
Madoc over 12 yearsWow. I gave a short comment regarding Commons-IO at Bozho's answer. But the channel solution is exactly what I was looking for. Thanks a lot, all of NIO channels passed me by, because I had already learned Java IO before NIO existed. And, by the way: 9 minutes! That's almost as fast as lightning.
-
yegor256 almost 11 yearsdon't forget to close the
FileInputStream