所以我在读取序列化文件时遇到问题。
更具体地说,我已将一个对象序列化为以十六进制格式编写的文件。当我想从此文件中一次读取一行时,就会出现问题。例如,该文件可能如下所示:
王牌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)读到该文件应该是二进制的(即使我的文件是十六进制的??)。
我应该怎么做才能从此文件中一次读取一行?
编辑:我得到了很多答案,我很感激。我从来不想反序列化该对象 - 只能读取每个十六进制行(一次一个),以便我可以分析序列化的对象。如果问题不清楚,我很抱歉。
现在我意识到该文件实际上不是以十六进制编写的,而是以二进制编写的。此外,它甚至没有被分成行。我现在面临的问题是读取每个字节并将其转换为十六进制。基本上,我希望数据看起来像上面的十六进制数据。
更新:
imbis 评论帮助我解决了这个问题。
“使用 FileInputStream(或包装它的 BufferedInputStream)并重复调用 read() - 每次调用返回一个字节(从 0 到 255),如果文件中没有更多字节,则返回 -1。这是最简单,但不是最有效的方法(读取数组通常更快)”
最佳答案
该文件不包含十六进制文本,并且未分隔行。
无论您使用什么程序来编辑文件,都会“有效”地将其转换为十六进制,因为如果直接显示它会出现乱码。
如果您使用 ObjectOutputStream
和 FileOutputStream
写入文件,则需要使用 ObjectInputStream
和 FileInputStream
读取该文件。
关于java - 读取序列化文件 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23923771/