【问题标题】:Question about streams in Java关于Java中流的问题
【发布时间】:2011-04-29 18:56:36
【问题描述】:

过去几天我一直在阅读有关 Java 流的信息。在阅读了相当多之后,我开始明白选择“流”这个名字是因为与我们在“现实生活”中使用的词(例如水)相似。并且没有必要知道数据来自哪里。如果我解释错了请指正。

但我不明白这一点。例如,当我在套接字上说getOutputStream 或getInputStream 时,我得到一个InputStream,我可以将它链接到我喜欢的任何东西。但是 InputStream/OutputStream 不是抽象类吗?我不知道如何正确解释它,但我不明白仅通过自动调用该方法的套接字连接具有字节/字符可以流动的流/通道?实际上什么是 InputStream/OutputStream?流是抽象真实来源的一种方式吗?

我想我理解链接它们的各种方式,但是我觉得我错过了这个概念的核心。

由于缺乏正确的解释方式,如果问题不好,我将删除。

感谢您的宝贵时间。

【问题讨论】:

    标签: java io


    【解决方案1】:

    InputStream/OutputStream 是,嗯,抽象。它们为您提供了一些基本的 API 来读取/写入字节或字节组,而不会暴露实际的实现。我们以OutputStream为例:

    OutputStream 通过公共 API 接收一堆字节。您实际上并不知道(也不关心)这些字节之后发生了什么:它们是发送。真正的实现可能:将它们附加到文件中,忽略它们(Apache Commons 中的NullOutputStream),将它们保存在内存中或......通过套接字发送。

    当你调用Socket.getOutputStream() 时会发生这种情况:你得到了OutputStream 的一些 实现,不用在意,它依赖于实现并且是特定的。当您向此流发送字节时,底层实现将使用 TCP/IP 或 UDP 推送它们。事实上,TCP/IP 本身就是一个流协议,尽管它对数据包/帧进行操作。

    InputStream 的情况与此类似——您从套接字获得 一些 实现。当您向流询问几个字节时,底层的InputStream 实现将向操作系统套接字询问相同数量的字节,可能会阻塞。但这是继承的真正乐趣:你不在乎!以任何你想要的方式使用这些流,链接、缓冲等。

    【讨论】:

    • 太好了,谢谢。这就是我所追求的,实际上我应该停止关心发生的事情。
    【解决方案2】:

    当您调用getInputStream 时,套接字返回InputStream 的某个具体子类的实例。通常你不用担心返回对象的确切类;因为它是一个InputStream,你就这样使用它。 (子类甚至可以是套接字类的私有嵌套类。)

    【讨论】:

      【解决方案3】:

      InputStream 确实是一个抽象。在每种情况下,都可以使用流概念的不同实现。但是流的用户不需要知道确切的实现是什么。

      在Socket 的情况下,实现是一个扩展FileInputStream 的SocketInputStream

      【讨论】:

        【解决方案4】:

        我不认为这是一个坏问题。您说得很对,流从您那里抽象出数据来源的复杂性并使其统一。因此,您可以编写从文件或套接字读取的代码,并且该代码看起来几乎相同。这意味着您通常需要编写更少的代码。

        当您从 Socket 获取 InputStream 时,您可以访问到达该套接字的任何数据。从这个流中读取时,通常,您提供一个字节数组并要求流为您填充它。它将读取尽可能多的数据,否则将填满缓冲区。这取决于你如何处理这个字节数组中的数据。

        尽管如此,对于任何类型的 Socket IO,都说了关于 Streams 的所有内容,Java 套接字 API 已经相当老了,并且有一些非常好的替代方案可以封装它并且更易于使用。我强烈推荐 Netty 使用它,您可以忘记流并专注于 POJO 以及如何编码和解码它们。

        【讨论】:

          猜你喜欢
          • 2011-09-06
          • 2012-03-19
          • 2017-12-02
          • 2011-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-26
          相关资源
          最近更新 更多