我需要将二进制数据附加到文件,但在此数据之前是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:name:com.sun.xml.bind.xmlDeclaration value:false 在javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:358) at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527) 的
由于
答案 0 :(得分:0)
Actualy我通过使用JAXB序列化xml头,然后将二进制数据(bytearray)附加到现有文件来解决这个问题。 使用缓冲读卡器从文件中读取如下:
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();
但是bytes数组是不同的并且返回34个字节而不是16.我读了很多关于编码但仍然不知道。
编辑:
不同字节数的问题是由于逐行字符和字节流的不同表示。