0

我需要以各种方式在 Java 中保存一些数据,到 a File,到 a String,到System.out... 最后我用 3 种方法做几乎相同的事情。OutputStream因此,我将它们更改为以 an作为参数的单个方法。我在单个 OutputStream 中写了一些东西,例如一些文本、一个序列化对象、另一个序列化对象、一些数字数据......

但现在我被困住了。我忽略了一个事实,即我无法区分所写的不同内容。我为数据创建了一个InputStream。我Scanner首先在该流上使用 a 来读取文本,然后尝试使用 ObjectInputStream 来读取序列化对象,但我得到一个EOFException.

我猜扫描仪会提前读取。如何防止扫描仪提前读取。
或者更确切地说,我如何使用适当的 InputStream 为每组数据读取每组数据。

4

1 回答 1

2

你真的不想尝试使用不同的阅读器从同一个流中读取。即使你设法让它在你的机器上运行,当你在不同的操作系统或不同的 JVM 实现上运行它时,它也可能会中断。

您应该选择一种读取和写入数据的方法。由于您在流中使用序列化对象,因此最好将其用于所有内容。您已经在评论中指出,通过字符串读取二进制数据并正确解释它是非常困难的。然而,获取一个 String 对象并不难,将其写到输出流中,再读回并将其转换为 String。

现在存在解释数据的问题。我建议将所有内容都写成标签数据对。你先写出一个整数(也许是一个枚举的序数,以使它们更容易在你的程序中使用),然后你写出你的数据。整数表示流中接下来的数据类型(例如文本或对象),然后您读取的下一个对象是数据并且您知道它是什么类型。如果是文本,您可以将对象转换为字符串,并将其传递给扫描仪,如果它是对象,那么您只需对对象执行任何您需要做的事情。

为了使事情变得更简洁,您可以使用每种数据类型的方法围绕流构建一个包装器。也许你可以有一个getNextObject()方法和一个getNextTextScanner() 方法。每个都将首先检查流中的下一个 Integer 标记以确保它正在读取正确的数据(如果发现不匹配则抛出异常),然后将返回下一个 Object 或返回一个新的 Scanner 以处理数据字符串。

确实,如果您可以为两种不同类型的数据使用单独的流,那会更好。但是,如果你真的坚持使用相同的流,那么我就是这样做的。

于 2012-08-24T15:46:51.023 回答