【问题标题】:Why we writeBytes into a OutputStream and readLine out of a InputStream in java?为什么我们在java中将Bytes写入OutputStream并从InputStream中读取Line?
【发布时间】:2010-12-07 06:47:09
【问题描述】:

这只是这个例子:

http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139

为什么感觉这么奇怪?

【问题讨论】:

  • 我不知道你的感受,但当我这样做时,我感到欣喜若狂。
  • 但真的 - 有什么奇怪的地方?它不是对称的?
  • 我觉得很奇怪,为什么不从OutputStream 而是从InputStreamout
  • 输出就是输出。因此,您写入它以将数据发送到另一端。输入就是进来的内容。您从中读取数据以获取从另一端进来的数据。

标签: java iostream


【解决方案1】:

您实际上正在查看两种不同类型的流。

Writer / Reader 类和子类用于读取/写入基于字符的数据。它负责 Java 内部文本的 UTF-16 表示和外部使用的字符编码之间的转换。 BufferedReader 类添加了一个了解终端制造商的 readLine() 方法。

InputStream / OutputStream 类和子类用于读取和写入基于字节的数据,而不假设字符编码或数据是文本。由于它避开了这些假设,“line”没有明确的含义,因此BufferedInputStream 类没有readLine() 方法。

(顺便说一句,DataInputStream 确实有一个 readLine() 方法,但它已被弃用,因为它已损坏。它对某些平台上无效的编码等进行了假设!)


在您的特定示例中,代码是不对称的,因为它设计用于与之通信的 HTTP 服务是不对称的。该服务需要一个带有二进制内容的请求(使用DataOutputStream 包装器编码),并提供一个带有文本内容的响应。这并不是特别不寻常的......或者是错误的。

将服务器的“输入”写入“输出”的奇怪之处只是一个角度问题。简单来说,OutputStream / Writer 是您“写入”的东西(即数据接收器),而 InputStream 或 Reader 是您“读取”的东西(即数据源)。就是这样,习惯了也就不奇怪了。

【讨论】:

    【解决方案2】:

    实际上,我们没有。 InputStream 中没有定义 readLine 方法。它也只对字节进行操作,就像 OutputStream 一样。

    在您引用的代码中,readLine 在BufferedReader 上调用。

    Reader 和 Writer 用于文本数据并对字符(和字符串)进行操作,InputStream 和 OutputStream 用于二进制数据(原始字节)。要在两者之间进行转换(即将 InputStream 包装成 Reader 或将 OutputStream 包装成 Writer),您需要选择一个字符集。

    我很奇怪为什么不从 OutputStream 中读取,而是从 InputStream 中读取

    这只是一个观点问题。

    OutputStreamWriter您将输出写入 的位置。

    InputStreamReader您从中读取输入的地方。

    当然,在某个地方,在流的另一端,有人可能会将您的 OutputStream 视为他们的 InputStream ...

    【讨论】:

      【解决方案3】:

      readLine 完全符合其名称的含义——它读取一行文本,直到行尾标记。

      当您写入流时,您已经知道行的结束位置。

      如果您正在寻找一种以更直观的方式写入流的方法,请尝试PrintWriter

      【讨论】:

        猜你喜欢
        • 2012-04-30
        • 2019-04-19
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 2013-12-07
        • 1970-01-01
        • 2013-09-13
        • 2020-03-11
        相关资源
        最近更新 更多