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

Java 输入流与输出流有何不同?,java,inputstream,outputstream,Java,Inputstream,Outputstream,我发现两者都是数据流。在这种情况下,为什么认为它们不同?到底有什么区别 评论-请不要关闭此问题。这是一种基本的东西,可以 在面试中使人困惑 更新1- 每个人似乎都在说同样的话——你从IS读,然后写进OS。 所以,它们基本上是一样的。就像一根有水流过的管子。当你使用管道中的水时,你称之为输入流,当你将水泵入管道时,它称为输出流。真的那么琐碎吗 更新2- 如果差别不是那么大,那么我们可以用InAndOutStream来代替为两个类(InputStream和OutputStream)编写代码吗。这就是

我发现两者都是数据流。在这种情况下,为什么认为它们不同?到底有什么区别

评论-请不要关闭此问题。这是一种基本的东西,可以 在面试中使人困惑

更新1-
每个人似乎都在说同样的话——你从IS读,然后写进OS。 所以,它们基本上是一样的。就像一根有水流过的管子。当你使用管道中的水时,你称之为输入流,当你将水泵入管道时,它称为输出流。真的那么琐碎吗

更新2- 如果差别不是那么大,那么我们可以用InAndOutStream来代替为两个类(InputStream和OutputStream)编写代码吗。这就是他们之间的关键区别


在某些情况下,你需要既能读又能写。流就是这样一个例子。Java库处理这一问题的方法是使用
InputStream
OutputStream
,它们在概念上是不同的

  • InputStream
    阅读
  • OutputStream
    您可以编写

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


编辑:我对“文件”这个词很傻,流可以用于多个文件。

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

因此,由于语言强制模型不对称,因此Java中任何I/O工具的实现者都需要提前确定是占用流的读取端还是写入端。该设施的用户没有选择权。比如说,;为了实现从用户接收数据的I/O功能,需要实现一个
OutputStream
(用户将调用它进行写入)

要实现对称功能,该语言需要能够协同例程执行。在这种情况下,流可以真正具有可读和可写的一面,而试图写入的调用方将向读取器屈服,反之亦然。但是,Java不支持此类功能。(至少在多线程之外,对于大多数情况来说,多线程显然太重了。)


我希望这能让它更清楚一点。

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

无论它们在内部如何工作,所有流都向使用它们的程序呈现相同的简单模型:流是数据序列。程序使用输入流从源读取数据,每次读取一项:

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

如果差异不是那么大,那么我们可以使用InAndOutStream来代替为两个类(InputStream和OutputStream)编写代码吗

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

即使试图将它们结合起来也不是一个好主意,因为人们对文本流和二进制流的混淆已经够多了。如果他们能读写同一条流,我想你会更加困惑

一般来说,开发人员应该清楚地知道是从设备读取还是从设备写入。如果他们不清楚,你肯定会有问题


仅供参考:我已经编写了一个库,它完全符合您对内存流(如“管道”)的建议。)但是,我要说的是,这只适用于专家开发人员,即使这样,我也会尽可能保持接口的清晰性,以防止混淆。

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

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

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

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

@davidblaine,是的,它很简单,因为InputStream和OutputStream是抽象类。一旦子类以不同的方式实现了这些方法,它就会变得更加复杂。如果差异不是那么“大”,那么我们可以有一个InAndOutStream,而不必为两个类(InputStream和OutputStream)编写代码吗?@davidblaine,但是运行时你的
InAndOutStream
必须是输入还是输出,不是两个都在同一时间,所以这会令人困惑。我不知道这意味着什么。我想这就是你想说的——我们需要知道流在哪种“模式”下运行,即读还是写?因此,我们使用的是IS和OS,而不是InAndOutStream。或者,我们可以在InAndOutStream类中有一个变量,它告诉我们流的模式——即输入或输出。但我想那会很麻烦。最好不要在你的程序中混用它们,因为这些类型可以帮助你跟踪什么