【发布时间】:2014-07-18 09:27:20
【问题描述】:
所以我在读取序列化文件时遇到问题。
更具体地说,我已经将一个对象序列化为一个以十六进制格式编写的文件。当我想从这个文件中一次读取一行时,就会出现问题。例如,该文件可能如下所示:
王牌 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 cmets 帮我解决了这个问题。
“使用 FileInputStream(或 BufferedInputStream 包装)并重复调用 read() - 每个调用返回一个字节(从 0 到 255),如果文件中没有更多字节,则返回 -1。这是最简单的,但不是最简单的高效的方式(读取数组通常更快)"
【问题讨论】:
-
“例如,文件可能如下所示:” 使用纯文本编辑器还是十六进制编辑器?
-
如果您使用序列化来写入文件,为什么不使用它来读取文件呢?这就是它的用途......
-
@johnchen902 使用 sublime text 2,无论属于哪个类别。
-
@hokosha 没用,它可以同时读取。
-
你的序列化文件中有\n吗?
标签: java file serialization binary hex