为什么InputStream是通过网络连接使用的,而不是ByteArray?

时间:2016-07-21 08:03:40

标签: java inputstream

我有以下问题。

我理解为什么在使用文件或某些外部源时会使用InputStream。 但是当我们使用网络连接时,使用流是什么意思?

假设带有附件的POST请求被发送到某个应用程序服务器(Tomcat或其他),附件被发送,因此JVM已将其保存在内存中。

那么使用InputStream有什么意义,而不是ByteArray?

数据已经在内存中,因此JVM将InputStream转换为ByteArray不会产生任何影响。

因为我认为当InputStream用于文件之类的外部源时是合理的,但是当从内存中读取数据时则不行。

更新

我说的是通过多部分表单发送附件,并且正在许多包中发送附件,但即使我不读取输入流,也会发送所有包。

3 个答案:

答案 0 :(得分:3)

当你说

时,你错了
  

数据已经在内存中,因此JVM将InputStream转换为ByteArray不会产生任何影响。

并非所有数据都必须在内存中已经"它正以字节流的形式进入内存。您可以在它们到达时处理字节(并且不将它们保留在内存中,除了可能的缓冲区)。

写作时也一样。您将流上的字节推向接收器(例如,浏览器)。你可能会再次使用缓冲区来执行此操作。只有缓冲区的内容在内存中。在每次刷新时,这些字节通过流发送,缓冲区再次“#34;空”#34;准备填充下一个字节块。

真的是所有关于管道和水(因此行话刷新接收器

P.S。您还可能希望查看反应流,其中数据流入/流出的处理由整个管道系统处理(因此您永远不会使系统中的部件过载)。

答案 1 :(得分:2)

使用

InputStream是因为网络流量来自数据包(或其他数据位),从一开始就没有完全可用 - 它确实没有完全在内存中(想象一下流媒体的YouTube视频) 。所以它是一个流,它在java中被对待。

答案 2 :(得分:0)

好吧,如果我在我的机器上运行Tomcat,并且你从你的机器发出请求,即使数据在我的机器的内存中,我也无法想象除了通过网络的流以外的方式来传递数据从一台机器到另一台机器。您可以向我的Tomcat发送请求,但您无法直接访问我的计算机上的内存。

即使两个程序在同一台机器上运行,它们也可能在不同的JVM上运行,而JVM也无法直接从另一个JVM访问内存。