读/写二进制数据时的无关数据

时间:2016-04-07 16:08:52

标签: java

我正在尝试编写一个进程,它将通过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ú]
            ^                                                                  ^

关于我做错了什么的想法?

1 个答案:

答案 0 :(得分:2)

包含Writer

PrintWriter个类用于文本数据。 StreamOutputStream类用于二进制数据。

您将二进制数据转换为String,此时某些二进制数据可能会被破坏。

摆脱String strBinaryData以及从byte[]获得的Base64.decodeBase64