java - 读/写期间类文件的魔法值发生变化

标签 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

我不知道它在哪里出错,而且很难调试。我的文件读/写单元测试是绿色的。问题出在哪里?

最佳答案

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

问题是我首先使用了基于字符串的 FileWriter:

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

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

关于java - 读/写期间类文件的魔法值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940300/

相关文章:

java - 如何在 JFreeChart 中添加水平滚动条?

c# - 在 C# 中读取(/写入)文件

java - 使用bytearray加载jar,找不到嵌套类

java - "Program Files"命令实习生未找到 CMD

Java 停止 GIF 动画

java - 二进制到字符串 - 大数错误 .StringIndexOutOfBounds

binary - 对于有符号数,为什么更喜欢二进制补码而不是符号和数值?

C 程序 - 从另一个文件构建索引文件

java - Spring Retry - 异常问题和重试

file-io - 与平台无关的文件锁定?