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

时间:2012-08-24 13:36:46

标签: java inputstream outputstream lookahead

我需要以各种方式将一些数据保存在Java中,FileStringSystem.out ......我最终得到了3种方法。同一件事情。所以我把它们改成了一个方法,OutputStream作为参数。我给一个OutputStream写了一些东西,例如一些文本,序列化对象,另一个序列化对象,一些数值数据......

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

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

1 个答案:

答案 0 :(得分:2)

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

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

现在存在解释数据的问题。我建议用标签数据对编写所有内容。你首先写出一个Integer(可能是enum的序数,以便在你的程序中更容易使用),然后你写出你的数据。整数表示流中下一个数据的类型(例如Text或Object),然后您读入的下一个对象是数据,您知道它是什么类型。如果它是Text,你可以将对象转换为String,并将其传递给Scanner,如果它是一个对象,那么你就可以做任何你需要做的对象。

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

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