阅读序列化文件 - java

时间:2014-05-29 00:05:53

标签: java file serialization binary hex

所以我在阅读序列化文件时遇到了问题。

更具体地说,我已将对象序列化为以十六进制格式编写的文件。当我想从此文件一次读取一行时,会出现此问题。例如,文件可能如下所示:

aced 0005 7372 0005 5465 7374 41f2 13c1

215c 9734 6b02 0000 7870

但是,下面的代码读取整个文件(而不仅仅是第一行)。此外,它会自动将十六进制数据转换为更具可读性的数据:¬ísrTestAòÁ

....
try (BufferedReader file = new BufferedReader(new FileReader(fileName))) {
        read(file);
    } catch ...
....
public static void read(BufferedReader in) throws IOException{
    String line = in.readLine();
    System.out.println(line); // PROBLEM: This prints every line

    }
}

如果我的普通文本文件包含一些随机单词,则此代码可以正常工作,它只打印第一行。我的猜测是问题在于序列化格式。我在某处读取(可能是API)该文件应该是二进制的(即使我的文件是十六进制的?)。

如何从此文件中一次读取一行,我该怎么办?

编辑:我已经得到了不少答案,我很感激。我从来没有想要反序列化对象 - 只能读取每个十六进制行(一次一个),所以我可以分析序列化对象。如果问题不清楚,我很抱歉。

现在我已经意识到文件实际上不是用十六进制编写的,而是用二进制编写的。此外,它甚至没有分成线。我现在面临的问题是读取每个字节并将其转换为十六进制。基本上,我希望数据看起来像上面的十六进制数据。

更新

immibis评论帮我解决了这个问题 “使用FileInputStream(或BufferedInputStream包装)并重复调用read() - 每次调用返回一个字节(从0到255)或-1,如果文件中没有更多的字节。这是最简单的,但不是最多的高效,方式(读取数组通常更快)“

2 个答案:

答案 0 :(得分:1)

该文件不包含十六进制文本,也不会分隔为行。

无论你使用什么程序来编辑文件都是“有用”地将它转换为十六进制,因为如果直接显示它会是乱码。

如果您使用ObjectOutputStreamFileOutputStream撰写文件,则需要使用ObjectInputStreamFileInputStream进行阅读。

答案 1 :(得分:0)

你的问题没有任何意义。序列化数据是二进制的。它不包含行。你无法从中读取线条。您应该使用InputStream,

读取包含ObjectInputStream.或对象的字节