java - 如何在同一个输入流上读取不同的数据组,并为每个数据组使用不同类型的输入流?

标签 java inputstream outputstream regex-lookarounds

我需要以各种方式在 Java 中保存一些数据,保存到 FileStringSystem.out.. .最后我用了 3 种方法来做几乎同样的事情。因此,我将它们更改为单个方法,并以 OutputStream 作为参数。我向单个 OutputStream 写入了一些内容,例如一些文本、一个序列化对象、另一个序列化对象、一些数字数据...

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

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

最佳答案

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

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

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

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

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

关于java - 如何在同一个输入流上读取不同的数据组,并为每个数据组使用不同类型的输入流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12110523/

相关文章:

java - 输入流:int/long 参数混合

java - ByteArrayInputStream、SequenceInputStream、StringReader在哪里使用

java - 在其他线程中使用蓝牙连接的OutputStream会干扰消息的接收

java - 如何动态更改回收器 View 项?

java - 编译 Java 8 中的一个奇怪的 NullPointerException(编译器(1.8.0_31))

java - 在 Apache Spark 上为每个 worker 创建一个单例

ios - 通过 FTP 发送数据

java - Android 平台上的 HttpsURLConnectionImpl.getInputStream() 错误

java - 当JVM退出时,输出流会被刷新吗?

java - 如何下载所有可能的 Maven 依赖项以便它们是本地的