繁体   English   中英

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

[英]Writing image not working properly using BufferedOutputStream

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

这就是问题:

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

您正在使用InputStreamReader ,这意味着它正在以文本形式读取二进制数据。 不要那样做 您的OutputStream很好,这是您输入处理的问题。

您应该只使用InputStream或可能的BufferedInputStream ,理想情况下一次读取数据块,而不是单个字节:

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-与资源语句来执行所有的封闭你简单得多 例如:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM