java—如何在同一个inputstream上读取不同的数据组,为每个数据组使用不同类型的inputstreams?

9q78igpj  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(383)

我需要以各种方式用java保存一些数据,以便 File ,到 String ,至 System.out ... 最后我用了三种方法做了几乎相同的事情。所以我用一个 OutputStream 作为参数。我给一个outputstream写了一些东西,比如一些文本,一个序列化对象,另一个序列化对象,一些数字数据。。。
但现在我被困住了。我忽略了一个事实,即我无法区分所写的不同的东西。我创建一个 InputStream 为了数据。我用一个 Scanner 在该流上首先读取文本,然后我尝试使用objectinputstream读取序列化对象,但是我得到一个 EOFException .
我想扫描器可以提前读取。如何防止扫描仪提前读取。
或者更确切地说,如何使用每组数据的适当输入流来读取每组数据。

oxiaedzo

oxiaedzo1#

你真的不想尝试使用不同的阅读器来读取同一个流。即使您设法让它在您的机器上工作,当您在不同的操作系统或使用不同的jvm实现运行它时,它也可能会中断。
您应该选择一种读写数据的方法。因为您在流中使用序列化对象,所以最好在所有情况下都使用它。您已经在注解中指出,通过字符串读取二进制数据并正确解释它是非常困难的。然而,获取一个string对象,将其写在输出流上,读回并将其转换为字符串并不难。
现在有一个解释数据的问题。我建议把所有的东西都写在标记数据对中。首先写出一个整数(可能是枚举的序数,以便于在程序中使用),然后写出数据。整数表示流中接下来的数据类型(例如文本或对象),然后您读入的下一个对象就是数据,您知道它是什么类型。如果它是文本,你可以将对象转换成字符串,并将其传递给扫描器,如果它是一个对象,那么你只需对该对象做任何你需要做的事情。
为了让事情变得更干净,可以围绕流构建一个 Package 器,每个数据类型都有一个方法。也许你可以喝一杯 getNextObject() 方法和步骤 getNextTextScanner() 方法。每个都将首先检查流中的下一个整数标记,以确保它读取的数据正确(如果发现不匹配,则引发异常),然后返回下一个对象或返回一个新的扫描仪来处理一个数据字符串。
实际上,如果您可以对两种不同类型的数据使用不同的流,那就更好了。但是,如果你真的被困在使用同一个流,那么我会这样做。

相关问题