1

我需要将二进制数据附加到文件中,但在此数据之前是 xml 标头。整个文件不会是正确的 xml 文件,但它必须是正确的 xml 标头,如下所示:

<EncryptedFileHeader>
    <Algorithm>name</Algorithm>
    <KeySize>256</KeySize>
    <SubblockLength>64</SubblockLength>
    <CipherMode>ECB</CipherMode>
    <sessionKey>sessionKey</sessionKey>  
</EncryptedFileHeader>
*binary data*

我用 JAXB 编组很容易的 xml 标头,甚至更容易的是在 base64 中添加这个二进制数据并存储在 xml 中的 note 中。但这是一个线索。我必须将其存储为二进制文件以节省 base64 使用的 33% 空间。

所以问题是如何添加这些数据,当然以后再读回来(序列化/反序列化)?

另一个问题是如何从文件的第一行中删除?

我尝试使用:

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);

但它会引发异常:

javax.xml.bind.PropertyException:名称:com.sun.xml.bind.xmlDeclaration 值:在 com.sun.xml.internal 的 javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:358) 处为 false。 bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527)

谢谢

4

1 回答 1

0

实际上,我通过使用 JAXB 序列化 xml 标头,然后将二进制数据(字节数组)附加到现有文件来解决这个问题。使用缓冲阅读器从文件中读取如下:

BufferedReader reader = new BufferedReader(new FileReader("filepath"));
        String line, results = "";
        while ((line = reader.readLine()) != null) {
            results += line;
        }
        reader.close();

        String[] splited = results.split("</EncryptedFileHeader>");
        splited[0] += "</EncryptedFileHeader>";
        String s0 = splited[0];
        String s1 = new String(splited[1]);
        ByteArrayInputStream bais = new ByteArrayInputStream(s0.getBytes());

现在我遇到了第二个拆分字符串 s1 的问题,它包含来自“byteArrayOutputStream.toByteArray();”的数据。现在我必须将数据从这个字符串传输到字节数组。从:

'��A����g�X���

类似于:
[39, -63, -116, 65, -123, -114, 27, -115, -2, 103, -64, 88, -99, -96, -26, -12]

我试过(在同一台机器上): byte[] bytes = s1.getBytes();

但是字节数组不同,它返回 34 个字节而不是 16 个字节。我读了很多关于编码的内容,但仍然不知道。

编辑:

不同字节数的问题是由于新行按字符和字节流的不同表示。

于 2013-05-14T21:16:30.473 回答