【问题标题】:Reading serialized file - java [closed]读取序列化文件 - java [关闭]
【发布时间】: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


【解决方案1】:

文件不包含十六进制文本,也没有分隔成行。

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

如果您使用ObjectOutputStreamFileOutputStream 写入文件,则需要使用ObjectInputStreamFileInputStream 读取它。

【讨论】:

  • 好的,谢谢。但问题是,如果文件包含以下内容: 第一行:“您好,我的名字” 第二行:“由三个组成” 第三行:“字母” 上面的代码将打印“您好,我的名字”。现在,序列化文件不是这种情况,它会打印所有内容,因为它是二进制文件。那么有什么方法可以将文件转换为十六进制而不是二进制,所以文件总是看起来像上面那样?我不想反序列化它,只能读取每一行。例如:“啊,这一行包含 aced”。
  • 文件包含字母“aced”。该文件以字节 172 开头,后跟字节 237,恰好是十六进制的“AC”和“ED”。您可以读取每个字节并自己将其转换为十六进制。
  • 另外,文件不分行。无论您用来查看文件的任何程序都以某种方式将其分成几行以使其适合您的屏幕。行拆分实际上不在文件中。
  • 感谢您的回答。现在我开始意识到主要问题。你知道我如何读取每个字节吗?
  • 使用FileInputStream(或BufferedInputStream包装一个)并重复调用read() - 每个调用返回一个字节(从0到255)或-1如果没有更多的字节文件。这是最简单但不是最有效的方式(读取数组通常更快)
【解决方案2】:

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

【讨论】:

  • 如果这个问题看起来很奇怪,我很抱歉。问题是我不想反序列化对象。我只想通过读取每一行来分析序列化文件,一次一个。现在我意识到该文件实际上不是以十六进制编写的,所以我的问题是,有没有办法将文件转换为十六进制,所以它总是看起来像主帖中的数据?我希望这可以澄清一些事情。
  • 为什么?为什么你认为你需要十六进制而不是二进制?你到底要拿它做什么?
  • 是的,我想这是真的。我可能不需要它的十六进制。那我如何读取每个字节?老实说,这只是我为了更好地理解序列化和编程而做的一个小项目。如果您序列化一个对象,那么在序列化文件中会隐藏很多关于该对象的信息。所以我想分析一下文件,看看能找到什么数据。
  • 所以看看吧。您根本不需要编写任何代码。只需使用十六进制编辑器,就像您似乎已经在做的那样,并研究规范的协议章节。
  • 是的,这正是我一直在做的,但我想更进一步,创建一个简单的“序列化文件解密器”,它基本上试图找到文件中的所有隐藏数据。因此,假设您只有文件(没有代码或任何东西)并且您想了解文件的内容。没什么太花哨的,但它是我练习编程的一种方式。
猜你喜欢
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2020-07-24
相关资源
最近更新 更多