我正在尝试编写一个进程,它将通过rest API调用检索文件(各种类型 - pdf,txt,docx,tif等),将该文件的二进制数据从base64编码转换为未编码,以及将文件写入另一个位置(由另一个进程拾取)。所有上述操作都有效,但如果文件类型不是txt,则新写出的文件将无法打开。
public File retrieveDocument(String in_ItemId, File in_DestinationFile, Map<String, String> in_DocumentProperties)
throws IOException {
byte[] binaryData = new byte[8198];
try {
String url = "filestore url";
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new MappingJacksonHttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
Map documentMap = restTemplate.getForObject(url, Map.class);
if (documentMap.get("binaryData") != null) {
binaryData = Base64.decodeBase64(((String) documentMap.get("binaryData")).getBytes());
}
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(in_DestinationFile));
outputStream.write(binaryData);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return in_DestinationFile;
}
当我在文本编辑器(即Notepad ++)中打开原始文件和新文件并比较两者时,新文件中有许多其他字符(主要是问号)。以下是tif图像的示例。我在新文件中的一些附加字符下添加了^。
原始档案:
II* P €?à@$
„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%3Ñ©Tºe6O¨
‡ÄbqX¼f7•ß²<¦W-—ÌfsY¼æw=ŸÐhlÐ=—M§ÔjuZ½f·]¯Øll™-–×m·Ünw[½æ÷}¿à_tœ'Çäry\¾g7hÚsú]
新文件:
II* P €?à@$
„BaP¸d6ˆDbQ8¤V-ŒFcQ¸äv=?HdR9$–M'”JeR¹d¶]/˜LfS9¤Öm7œNgS¹äö}? PhT:%3Ñ©Tºe6?O¨
^ ^
‡ÄbqX¼f7?•ß²<¦W-—ÌfsY¼æw=ŸÐhlÐ=—M§ÔjuZ½f·]¯Øll™-–×m·Ünw[½æ÷}¿à_tœ'?Çäry\¾g7?hÚsú]
^ ^
关于我做错了什么的想法?
答案 0 :(得分:2)
Writer
的 PrintWriter
个类用于文本数据。 Stream
等OutputStream
类用于二进制数据。
您将二进制数据转换为String
,此时某些二进制数据可能会被破坏。
摆脱String strBinaryData
以及从byte[]
获得的Base64.decodeBase64
。