user2930538
user2930538

Reputation: 131

Writing image not working properly using BufferedOutputStream

Iam reading and writing an image file in java.the file can be of any type so i used buffered reader and writer while writing image its not written properly.The image get scattered.

        BufferedReader bufferedReader = null;
        BufferedOutputStream bufferedWriter = null;

        if(!(dto.getInputStream() == null)){

            try {
                bufferedReader = new BufferedReader(new InputStreamReader(dto.getInputStream()));
                FileOutputStream writer = new FileOutputStream(new File(WEBINFLocation.getWebInfPath()+ConstantIFC.RESOURCEPATH+dto.getFileName()+dto.getDocumentCode()+"_"+dto.getVersion()+1+"."+dto.getFormatName()));

                bufferedWriter = new BufferedOutputStream(writer);
                int value;
                while((value = bufferedReader.read()) != -1){
                    bufferedWriter.write(value);                    
                }                   

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    if (bufferedReader != null) {             
                        bufferedReader.close();             
                    }
                    if (bufferedWriter != null) {
                        bufferedWriter.close();
                    }

                    dto.getInputStream().close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

Upvotes: 1

Views: 1510

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1499790

This is the problem:

bufferedReader = new BufferedReader(new InputStreamReader(dto.getInputStream()));

You're using an InputStreamReader, which means it's reading the binary data as text. Don't do that. Your OutputStream is fine, it's your input handling which is broken.

You should just use InputStream, or possibly BufferedInputStream, ideally reading blocks of data at a time instead of a single byte:

byte[] buffer = new byte[8192]; // Try to read 8K at a time
int bytesRead;
while ((bytesRead = input.read(buffer)) > 0) {
    output.write(buffer, 0, bytesRead);
}

There are various libraries which help to do this for you, e.g. with Guava you can use BytesStreams.copy.

Also note that if you're just Java 7, your code can be much simpler using a try-with-resources statement to perform all the closing for you. For example:

try (InputStream input = dto.getInputStream();
     OutputStream output = Files.newOutputStream(...)) {
     BytesStreams.copy(input, output);
}

Use the Path API to specify the path to your file - I'd suggest using a call to String.format instead of all that concatenation, too.

Upvotes: 5

Related Questions