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

Java 如何在同一个InputStream上读取不同的数据组,并为每个组使用不同类型的InputStream?,java,inputstream,outputstream,lookahead,Java,Inputstream,Outputstream,Lookahead,我需要以各种方式在Java中保存一些数据,如文件、字符串、系统输出。。。最后我用3种方法做了几乎相同的事情。因此,我将它们更改为一个方法,并将OutputStream作为参数。我在一个输出流中写了一些东西,例如一些文本、一个序列化对象、另一个序列化对象、一些数字数据 但现在我被卡住了。我忽略了一个事实,那就是我无法区分所写的不同内容。我为数据创建了一个InputStream。我首先在该流上使用扫描仪读取文本,然后尝试使用ObjectInputStream读取序列化对象,但得到了EOFEExcep

我需要以各种方式在Java中保存一些数据,如
文件
字符串
、系统输出。。。最后我用3种方法做了几乎相同的事情。因此,我将它们更改为一个方法,并将
OutputStream
作为参数。我在一个输出流中写了一些东西,例如一些文本、一个序列化对象、另一个序列化对象、一些数字数据

但现在我被卡住了。我忽略了一个事实,那就是我无法区分所写的不同内容。我为数据创建了一个
InputStream
。我首先在该流上使用
扫描仪
读取文本,然后尝试使用ObjectInputStream读取序列化对象,但得到了
EOFEException

我想扫描器可以提前读取。如何防止扫描仪提前读取。

或者更确切地说,我如何使用适当的输入流读取每组数据。

您确实不想尝试使用不同的读取器读取同一数据流。即使您设法让它在您的机器上工作,当您在不同的操作系统上或使用不同的JVM实现运行它时,它也可能会崩溃

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

现在有一个解释数据的问题。我建议用标记数据对写出所有内容。首先写出一个整数(可能是枚举的序数,以便于在程序中使用),然后写出数据。整数表示流中下一个出现的数据类型(例如文本或对象),然后您读入的下一个对象就是数据,您知道它是什么类型。如果是文本,您可以将对象转换为字符串,并将其传递到扫描仪,如果是对象,则只需对该对象执行任何需要执行的操作

为了让事情变得更干净,您可以围绕流构建一个包装器,并为每种数据类型创建一个方法。也许您可以有一个
getNextObject()
方法和一个
getnexttexscanner()
方法。每个都将首先检查流中的下一个整数标记,以确保它读取的数据正确(如果发现不匹配,则引发异常),然后返回下一个对象或返回新的扫描仪以处理数据字符串


实际上,如果您可以对两种不同类型的数据使用单独的流,那就更好了。但是,如果你真的无法使用同一个流,那我就是这么做的。

那么你有一个输入流,你想使用扫描仪和ObjectInputStream从中读取?是的,如果可能的话,你必须决定它是文本(例如扫描仪)还是二进制(例如ObjectInputStream)。如果你真的知道自己在做什么,你可以把它们混合在一起,但这不太可能是个好主意。i、 更可能是一团糟。你的意思是我应该使用一种类型的数据,比如只使用文本?如果我将二进制数据转换为文本,那么我可以使用单个扫描仪解析所有数据。然后我需要找到一种从字符串中的文本数据获取对象的方法。所有文本都是数据,但并非所有数据都是文本。因此,如果需要在流中混合文本和数据,那么将文本视为数据,而不是相反。所以要回答你的问题:不,不要将二进制数据转换成文本;相反,将文本数据转换为二进制。这是一个很好的、清晰的答案。我已尝试实现这些自定义流。问题是,据我所知,序列化只能通过ObjectOutputStream和ObjectInputStream完成。这些类的实现似乎在很大程度上依赖于JVM。它们不是纯java代码。显然,如果不发明我自己的序列化机制,我就无法重新创建它们的行为,我不希望。。看来我需要使用引擎盖下的那些流。我明天会设法让它工作。