我需要以各种方式用java保存一些数据,以便 File
,到 String
,至 System.out
... 最后我用了三种方法做了几乎相同的事情。所以我用一个 OutputStream
作为参数。我给一个outputstream写了一些东西,比如一些文本,一个序列化对象,另一个序列化对象,一些数字数据。。。
但现在我被困住了。我忽略了一个事实,即我无法区分所写的不同的东西。我创建一个 InputStream
为了数据。我用一个 Scanner
在该流上首先读取文本,然后我尝试使用objectinputstream读取序列化对象,但是我得到一个 EOFException
.
我想扫描器可以提前读取。如何防止扫描仪提前读取。
或者更确切地说,如何使用每组数据的适当输入流来读取每组数据。
1条答案
按热度按时间oxiaedzo1#
你真的不想尝试使用不同的阅读器来读取同一个流。即使您设法让它在您的机器上工作,当您在不同的操作系统或使用不同的jvm实现运行它时,它也可能会中断。
您应该选择一种读写数据的方法。因为您在流中使用序列化对象,所以最好在所有情况下都使用它。您已经在注解中指出,通过字符串读取二进制数据并正确解释它是非常困难的。然而,获取一个string对象,将其写在输出流上,读回并将其转换为字符串并不难。
现在有一个解释数据的问题。我建议把所有的东西都写在标记数据对中。首先写出一个整数(可能是枚举的序数,以便于在程序中使用),然后写出数据。整数表示流中接下来的数据类型(例如文本或对象),然后您读入的下一个对象就是数据,您知道它是什么类型。如果它是文本,你可以将对象转换成字符串,并将其传递给扫描器,如果它是一个对象,那么你只需对该对象做任何你需要做的事情。
为了让事情变得更干净,可以围绕流构建一个 Package 器,每个数据类型都有一个方法。也许你可以喝一杯
getNextObject()
方法和步骤getNextTextScanner()
方法。每个都将首先检查流中的下一个整数标记,以确保它读取的数据正确(如果发现不匹配,则引发异常),然后返回下一个对象或返回一个新的扫描仪来处理一个数据字符串。实际上,如果您可以对两种不同类型的数据使用不同的流,那就更好了。但是,如果你真的被困在使用同一个流,那么我会这样做。