Awesome Awesome - 1 year ago 78
Java Question

Efficient way to write InputStream to a File in Java (Version 6)

I will get input stream from third party library to my application.
I have to write this input stream to a file.

Following is the code snippet I tried:

private void writeDataToFile(Stub stub) {
OutputStream os = null;
InputStream inputStream = null;

try {

inputStream = stub.getStream();
os = new FileOutputStream("test.txt");
int read = 0;
byte[] bytes = new byte[1024];

while ((read = inputStream.read(bytes)) != -1) {
os.write(bytes, 0, read);
}

} catch (Exception e) {

log("Error while fetching data", e);

} finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
log("Error while closing input stream", e);
}
}
if(os != null) {
try {
os.close();
} catch (IOException e) {
log("Error while closing output stream", e);
}
}
}
}


Is there any better approach to do this ?

fge fge
Answer Source

Since you are stuck with Java 6, do yourself a favour and use Guava and its Closer:

final Closer closer = Closer.create();
final InputStream in;
final OutputStream out;
final byte[] buf = new byte[32768]; // 32k
int bytesRead;

try {
    in = closer.register(createInputStreamHere());
    out = closer.register(new FileOutputStream(...));
    while ((bytesRead = in.read(buf)) != -1)
        out.write(buf, 0, bytesRead);
    out.flush();
} finally {
    closer.close();
}

Had you used Java 7, the solution would have been as simple as:

final Path destination = Paths.get("pathToYourFile");
try (
    final InputStream in = createInputStreamHere();
) {
    Files.copy(in, destination);
}

And yourInputStream would have been automatically closed for you as a "bonus"; Files would have handled destination all by itself.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download