You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:将InputStream读取的字符串写入文件后PDF损坏问题求助

问题根源与解决方案

问题出在哪

PDF是二进制文件,不能通过String作为中间载体转换。你用IOUtils.toString(inputStream)把二进制流转成字符串时,会默认用系统平台编码(比如UTF-8)处理字节,而PDF里的很多二进制数据无法被正确映射为文本字符,会被替换成占位符或丢失信息。之后再把这个字符串转回字节数组,得到的已经不是原始的PDF二进制内容,自然会导致文件损坏。

测试场景修正代码

直接复制二进制流,跳过字符串转换步骤:

import org.apache.commons.io.IOUtils;
import org.apache.commons.io.FileUtils;
import java.io.FileOutputStream;
import java.io.IOException;

File inFile = new File("test_input.pdf");
File outFile = new File("output.pdf");

// 用try-with-resources自动关闭流
try (InputStream inputStream = FileUtils.openInputStream(inFile);
     OutputStream outputStream = new FileOutputStream(outFile)) {
    IOUtils.copy(inputStream, outputStream);
} catch (IOException e) {
    e.printStackTrace();
}

如果只是复制文件,更简单的写法:

FileUtils.copyFile(inFile, outFile);

实际业务场景处理

如果其他服务给你的是Base64编码的字符串(这是二进制文件转字符串的标准方式),需要先解码成字节数组再写入文件:

import org.apache.commons.io.FileUtils;
import java.util.Base64;
import java.io.IOException;

// 从其他服务获取的Base64格式PDF字符串
String pdfBase64Str = "JVBERi0xLjQNCiXi48/TDQoNCjEgMCBvYmoNCjw8DQovVHlwZSAvQ2F0YWxvZw0KL091dGxpbmVzIDIgMCBSDQovUGFnZXMgMyAwIFINCj4+DQplbmRvYmoNCg0KMiAwIG9iag0KPDwNCi9UeXBlIC9PdXRsaW5lcw0KL0NvdW50IDANCj4+DQplbmRvYmoNCg0KMyAwIG9iag0KPDwNCi9UeXBlIC9QYWdlcw0KL0NvdW50IDINCi9LaWRzIFsgNSAwIFIgXQ0KPj4NCmVuZG9iag0KDQo0IDAgb2JqDQo8PA0KL1R5cGUgL1BhZ2VzDQovQ29udGVudCAzIDAgUg0KL0tpZHMgWyA2IDAgUiBdDQo+Pg0KZW5kb2JqDQoNCjUgMCBvYmoNCjw8DQovVHlwZSAvUGFnZQ0KL1BhcmVudCA1IDAgUg0KL0NvbnRlbnQgNCAwIFINCj4+DQplbmRvYmoNCg0KNiAwIG9iag0KPDwNCi9UeXBlIC9QYWdlcw0KL1BhcmVudCA2IDAgUg0KL0NvbnRlbnQgNSAwIFINCj4+DQplbmRvYmoNCg0KNSAwIG9iag0KPDwNCi9UeXBlIC9QYWdlcw0KL1BhcmVudCA3IDAgUg0KL0NvbnRlbnQgNiAwIFINCj4+DQplbmRvYmoNCg0KOCAwIG9iag0KPDwNCi9UeXBlIC9QYWdlcw0KL1BhcmVudCA4IDAgUg0KL0NvbnRlbnQgNyAwIFINCj4+DQplbmRvYmoNCg0KOSAwIG9iag0KPDwNCi9UeXBlIC9QYWdlcw0KL1BhcmVudCA5IDAgUg0KL0NvbnRlbnQgOCAwIFINCj4+DQplbmRvYmoNCg0KMTAgMCBvYmoNCjw8DQovVHlwZSAvQ2F0YWxvZw0KL091dGxpbmVzIDYgMCBSDQovUGFnZXMgMTAgMCBSDQo+Pg0KZW5kb2JqDQoNCjExIDAgb2JqDQo8PA0KL1R5cGUgL0ZvbnQNCi9TdWJ0eXBlIC9UeXBlMQ0KL05hbWUgL1N1YnR5cGUxDQovQmFzZUZvbnQgL0hlbHZldGljYQ0KL0ZvbnQtdHlwZSAvTGVuZ3RoDQovRmlsdGVyIC9GbGF0ZURlY29kZQ0KL0xlbmd0aCAxOTQ0DQovRjEgMCBSDQovRjIgMCBSDQovRjMgMCBSDQovRjQgMCBSDQovRjUgMCBSDQovRjYgMCBSDQovRjcgMCBSDQovRjggMCBSDQovRjkgMCBSDQovRjEwIDAgUg0KL0YxMSAwIFINCj4+DQplbmRvYmoNCg0KMTIgMCBvYmoNCjw8DQovVHlwZSAvRm9udA0KL1N1YnR5cGUgL1R5cGUxDQovTmFtZSAvU3VidHlwZTEwDQovQmFzZUZvbnQgL0hlbHZldGljYQ0KL0ZvbnQtdHlwZSAvTGVuZ3RoDQovRmlsdGVyIC9GbGF0ZURlY29kZQ0KL0xlbmd0aCAxOTQ0DQovRjEgMCBSDQovRjIgMCBSDQovRjMgMCBSDQovRjQgMCBSDQovRjUgMCBSDQovRjYgMCBSDQovRjcgMCBSDQovRjggMCBSDQovRjkgMCBSDQovRjEwIDAgUg0KL0YxMSAwIFINCj4+DQplbmRvYmoNCg0KMTMgMCBvYmoNCjw8DQovVHlwZSAvQ29udGVudA0KL0ZpbHRlciAvRmxhdGVEZWNvZGUNCi9MZW5ndGggMTM0NA0KPj4NCmVuZG9iag0KDQp4cmVmDQowIDE0DQowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAwMDAwMTAgMDAwMDAgbiANCiAwMDAwMDAwMDY1IDAwMDAwIG4NCjAwMDAwMDAxMjAgMDAwMDAgbiANCiAwMDAwMDAwMTg1IDAwMDAwIG4NCjAwMDAwMDAyNDkgMDAwMDAgbiANCiAwMDAwMDAwMzE0IDAwMDAwIG4NCjAwMDAwMDAzNzkgMDAwMDAgbiANCiAwMDAwMDAwNDQ0IDAwMDAwIG4NCjAwMDAwMDA1MDkgMDAwMDAgbiANCiAwMDAwMDAwNTc0IDAwMDAwIG4NCjAwMDAwMDA2MzkgMDAwMDAgbiANCiAwMDAwMDAwNzA0IDAwMDAwIG4NCjAwMDAwMDA3NjkgMDAwMDAgbiANCiAwMDAwMDA4MzQgMDAwMDAgbiANCiAwMDAwMDA4OTkgMDAwMDAgbiANCiAwMDAwMDA5NjQgMDAwMDAgbiANCiAwMDAwMDEwMjkgMDAwMDAgbiANCiAwMDAwMDEwOTQgMDAwMDAgbiANCiAwMDAwMDEyMjQgMDAwMDAgbiANCiAwMDAwMDEyODkgMDAwMDAgbiANCiAwMDAwMDEzNTQgMDAwMDAgbiANCiAwMDAwMDE0MTkgMDAwMDAgbiANCiAwMDAwMDE0ODQgMDAwMDAgbiANCiAwMDAwMDE1NDkgMDAwMDAgbiANCiAwMDAwMDE2MTQgMDAwMDAgbiANCiAwMDAwMDE2NzkgMDAwMDAgbiANCiAwMDAwMDE3NDQgMDAwMDAgbiANCiAwMDAwMDE4MDkgMDAwMDAgbiANCiAwMDAwMDE4NzQgMDAwMDAgbiANCiAwMDAwMDE5MzkgMDAwMDAgbiANCiAwMDAwMDIwMDQgMDAwMDAgbiANCiAwMDAwMDIwNjkgMDAwMDAgbiANCiAwMDAwMDIxMzQgMDAwMDAgbiANCiAwMDAwMDIxOTkgMDAwMDAgbiANCiAwMDAwMDIyNjQgMDAwMDAgbiANCiAwMDAwMDIzMjkgMDAwMDAgbiANCiAwMDAwMDIzOTQgMDAwMDAgbiANCiAwMDAwMDI0NTkgMDAwMDAgbiANCiAwMDAwMDI1MjQgMDAwMDAgbiANCiAwMDAwMDI1ODkgMDAwMDAgbiANCiAwMDAwMDI2NTQgMDAwMDAgbiANCiAwMDAwMDI3MTkgMDAwMDAgbiANCiAwMDAwMDI3ODQgMDAwMDAgbiANCiAwMDAwMDI4NDkgMDAwMDAgbiANCiAwMDAwMDI5MTQgMDAwMDAgbiANCiAwMDAwMDI5NzkgMDAwMDAgbiANCiAwMDAwMDMwNDQgMDAwMDAgbiANCiAwMDAwMDMxMDkgMDAwMDAgbiANCiAwMDAwMDMxNzQgMDAwMDAgbiANCiAwMDAwMDIyMzkgMDAwMDAgbiANCi9Sb290IDMgMCBSDQovSUQgWzw1N0U0RjE4LUIxQjgtNEMzNi1CRjE4LTU0RjE0QjE4QjE4MT4gPDVCRjE4QjE4LTU0RjEtNEMzNi1CRjE4LTU0RjE0QjE4QjE4MT4gXQ0KPj4NCnN0YXJ0eHJlZg0KMTM1OA0KJSVFT0YNCg==";
File outFile = new File("output.pdf");

try {
    byte[] pdfBytes = Base64.getDecoder().decode(pdfBase64Str);
    FileUtils.writeByteArrayToFile(outFile, pdfBytes);
} catch (IOException e) {
    e.printStackTrace();
}

如果其他服务是直接把二进制流转成普通字符串(非Base64),那这种方式本身就有问题,得让对方改成传Base64编码字符串或者直接传输二进制流,否则无法恢复原始的PDF文件。

内容的提问来源于stack exchange,提问作者V.Aggarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:22:07