输入流与输出流有何不同?

时间:2012-12-17 07:50:50

标签: java inputstream outputstream

我看到两者都是数据的“流”。在那种情况下,为什么认为它们不同?有什么区别呢?

评论 - 请不要关闭此问题。这是基本的东西 在一次采访中混淆了人们。

更新1 - 每个人似乎都说同样的话 - 你从IS读到并写入操作系统。 所以,它们基本相同。就像一条水流过它的管道。当您使用该管道中的水时,您将其称为InputStream,当您将水泵入其中时,它称为输出流。它真的那么微不足道吗?

UPDATE2 -  如果差异不那么“大”,那么我们可以有一个InAndOutStream而不必为两个类(InputStream和OutputStream)创建代码吗?

7 个答案:

答案 0 :(得分:15)

它们在概念上是不同的

  • 来自InputStream您阅读
  • 到你写的OutputStream

答案 1 :(得分:4)

流是您按顺序访问的数据。您可以将它想象成一条从隧道入口处观看的火车,这样您就可以一次看到一辆汽车。或者是一条穿过传送带的小部件流,要求你在每个传送带上拧紧一个螺丝,然后再传递给装配线上的下一个人,他必须用锤子砸它,等等。当你从桥上看时,或者从河上漂浮的枝条。

无论它们如何在内部工作,所有流都为使用它们的程序提供相同的简单模型:流是一系列数据。程序使用输入流从源读取数据,一次一个项: IO Stream

程序使用输出流将数据写入目标,一次一项: IO Stream

答案 2 :(得分:4)

  

如果区别不是那么“大”,那么我们可以有一个InAndOutStream而不必为两个类(InputStream和OutputStream)创建代码吗?

除了ByteArray类之外,这是不可能的。原因是大多数Streams都由系统提供的设备(如文件或套接字)支持。对于文件,您编写的文件是您读取的文件,但对于套接字,您写入的流与您读取的流无关。

即使尝试将它们组合起来也是一个坏主意恕我直言,因为人们在文本和二进制流之间变得足够混乱。如果他们能够读取和写入同一个流,我会怀疑会更加混乱。

通常,开发人员应该清楚地了解它们是从设备读取还是写入。如果他们不清楚你肯定会遇到问题。

仅供参考:我已经编写了一个库,它完全按照你在内存流中建议的内容,如“管道”;)但是,我会说这只适用于专家开发人员,即便如此我仍然保持接口尽可能不同以防止混乱。

答案 3 :(得分:2)

从<{1}}读取,并且写入InputStream。这是他们之间的关键区别。

在某些情况下,您需要能够同时读写。一个这样的例子是流socket。 Java库处理此问题的方法是使OutputStream 成为InputStream

答案 4 :(得分:2)

流的概念并不像你在问题中所暗示的那样对称。由于这是Java,因此流的读写器在执行环境中占据截然不同的位置:一个实现流对象,另一个调用方法。

因此,由于语言强制模型不对称,因此Java中任何I / O工具的实现者需要事先确定是占用流的读取侧还是写入侧。该设施的用户无法做出选择。例如,然后;为了实现从其用户接收数据的I / O工具,需要实现OutputStream(用户将要求写入)。

要实现对称设施,语言需要能够进行协同执行。在这种情况下,流可以真正具有可读和可写的一面,并且尝试写入的调用者将屈服于读者,反之亦然。但是,Java不支持这样的设施。 (至少在多线程之外,对于大多数情况来说,这显然太重了。)

我希望这更清楚一点。

答案 5 :(得分:0)

我最好的选择是保持它们很小,当用户只是要读取流时,为什么要加载用于写入流的函数?这完全基于我的猜测......

编辑:我对单词文件很愚蠢,不仅可以使用文件流。

答案 6 :(得分:0)

为避免流之间的混淆,例如html注册表单,输入表单的数据称为输入数据,一旦注册成功或失败输出称为out-data。以相同的方式,应用程序通过输入流接收数据,应用程序通过输出流发送数据。

以下代码可帮助我们避免流之间的混淆:

//Standard input: 
Scanner scan = new Scanner(System.in);
String s = scan.next();

//Standard output
System.out.println("Hello World!");