Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类文件';s的魔法值在读/写过程中发生变化_Java_File Io_Binary_.class File - Fatal编程技术网

Java 类文件';s的魔法值在读/写过程中发生变化

Java 类文件';s的魔法值在读/写过程中发生变化,java,file-io,binary,.class-file,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.

我正在尝试将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 fstream = new FileWriter(file, append);
BufferedWriter out = new BufferedWriter(fstream);
out.write(content);
out.close();

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

好吧,现在您可以找到出错的地方了。这叫做调试,是程序员在发布stackoverflow之前要做的事情。注意:调试不需要使用实际的调试器,尽管这会有所帮助。您已经确定了几个转换数据的位置,可能是数据被弄乱了。请注意,字节EF BF BD是U+FFFD的UTF-8编码,这是“替换字符”。@Kayaman您真的认为我会在这里发布而不进行前几个小时的调试吗?首先,这个问题很难调试,因为数据以许多不同的形式出现,这使得很难在不同的状态下进行比较。但我已经保证数据在程序执行过程中不会改变。@Seelenvirtuose Good call,我没有注意到这一点。但是,这还是很奇怪,因为我只处理字节…不完全是。Base64是文本数据。数据在解码之前是什么样子的?数据库中可能已经损坏了。