读/写期间类文件的魔术值会发生变化

时间:2014-04-08 14:37:14

标签: java file-io binary .class-file

我试图将java类保存到数据库中。为此,我按如下方式阅读文件:

bytes = com.google.common.io.ByteStreamsByteStreams.toByteArray(url.openStream());

然后,这些字节在base64中编码:

org.apache.hadoop.hbase.util.Base64.encodeBytes(bytes);

再次加载时,反之亦然:

org.apache.hadoop.hbase.util.Base64.decode(base64);

并将其写入文件:

com.google.common.io.Files.write(binary, file);

但是,源文件和目标文件并不相同。使用二进制文件查看器显示它们确实非常相似;我发现了一件事:新文件以

开头
EF BF BD EF BF BD EF BF BD EF BF BD

而不是预期的

CA FE BA BE

之后,它们至少在几个亨德字节中相同。

作为一个合乎逻辑的结果,我在尝试从新文件加载类时收到以下错误消息:

java.lang.ClassFormatError: Incompatible magic value 4022320623 in class file ch/unibe/scg/doodle/producerTest/GiantTurtle

我不知道它在哪里打破,而且调试起来相当困难。我对文件读/写的单元测试是绿色的。问题出在哪里?

1 个答案:

答案 0 :(得分:0)

我刚刚发现我已经解决了代码中的问题,但还没有更新二进制文件:这是一个eclipse插件项目,取决于另一个开发项目,但另一个项目总是需要构建到jar和复制到插件的目录,以便在运行时工作。

问题是我第一次使用基于字符串的FileWriter

FileWriter fstream = new FileWriter(file, append);
BufferedWriter out = new BufferedWriter(fstream);
out.write(content);
out.close();

重新打包我的项目并实际使用上面的代码解决了这个问题。