使用BufferedOutputStream编写图像无法正常工作

时间:2014-03-10 10:53:34

标签: java

我在java中读取和写入一个图像文件。该文件可以是任何类型,所以我使用缓冲的读写器,而写入的图像则没有正确写入。图像分散。

        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();
                }
            }

1 个答案:

答案 0 :(得分:5)

这是问题所在:

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

您正在使用InputStreamReader,这意味着它正在将二进制数据作为文本读取。不要那样做。您的OutputStream没问题,这是您的输入处理错误。

您应该只使用InputStreamBufferedInputStream,理想情况下一次读取数据块而不是单个字节:

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);
}

有各种各样的图书馆帮助您做到这一点,例如:使用Guava,您可以使用BytesStreams.copy

另请注意,如果您只是Java 7,则使用try-with-resources语句为您执行所有关闭操作,您的代码可以更简单 。例如:

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

使用Path API指定文件的路径 - 我建议使用对String.format的调用,而不是所有连接。