Java 为什么InputStream通过网络连接使用,而不是通过阵列使用?

Java 为什么InputStream通过网络连接使用,而不是通过阵列使用?,java,inputstream,Java,Inputstream,我有以下问题 我理解当我们处理文件或一些外部源时为什么使用is InputStream。 但是,当我们处理网络连接时,使用流有什么意义呢 假设一个带有附件的POST请求被发送到某个应用服务器(Tomcat或其他),附件被发送,所以JVM已经在内存中保存了它 那么使用InputStream而不是ByteArray有什么意义呢 数据已经在内存中,所以将InputStream转换为ByteArray不会对JVM产生任何影响 因为我认为InputStream用于外部源(如文件)时是合理的,但从内存读取数

我有以下问题

我理解当我们处理文件或一些外部源时为什么使用is InputStream。 但是,当我们处理网络连接时,使用流有什么意义呢

假设一个带有附件的POST请求被发送到某个应用服务器(Tomcat或其他),附件被发送,所以JVM已经在内存中保存了它

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

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

因为我认为InputStream用于外部源(如文件)时是合理的,但从内存读取数据时则不合理

更新


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

InputStream
之所以使用,是因为网络流量来自数据包(或其他数据位)它从一开始就不是完全可用的——它肯定不是完全在内存中(想象一个youtube视频流)。因此,它是一个流,在java中被视为一个流。

InputStream
之所以被使用,是因为网络流量来自数据包(或其他数据位),它从一开始就不是完全可用的-它不一定完全在内存中(想象一个正在流化的youtube视频)。所以它是一个流,在java中是这样处理的。

你说的是错的

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

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

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

它实际上是关于管道和水的(因此就有了“流”、“冲”、“沉”的术语)


p、 您可能还希望研究由整个管道系统处理数据流入/流出的反应流(这样您就不会使系统中的某个部分过载)。

您所说的是错误的

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

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

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

它实际上是关于管道和水的(因此就有了“流”、“冲”、“沉”的术语)


p、 您可能还希望查看由整个管道系统处理数据流入/流出的反应流(这样您就不会使系统中的某个部分过载)。

如果我在我的机器上运行Tomcat,并且您从您的机器发出请求,即使数据在我的机器内存中,我无法想象除了网络上的流之外,还有什么方法可以将数据从一台机器传递到另一台机器。您可以向我的Tomcat发送请求,但不能直接访问我机器上的内存


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

如果我在我的机器上运行Tomcat,并且你从你的机器发出请求,即使数据在我的机器内存中,我无法想象除了网络上的流之外,还有什么方法可以将数据从一台机器传递到另一台机器。您可以向我的Tomcat发送请求,但不能直接访问我机器上的内存


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

为什么您认为数据已经在内存中?@biziclop,因为当我通过mutlipart表单发送附件时,然后http post请求是包含Tomcat接收的整个附件的多部分请求。对不起,我一定是遗漏了什么,但我不知道这如何保证数据在内存中。如果我上传一个4GB文件,你可能不想把它保存在内存中,你直接把它流到磁盘上。为什么你认为数据已经在内存中了?@biziclop因为当我通过mutlipart表单发送附件时,http post请求是包含Tomcat接收到的整个附件的多部分请求。对不起,我肯定遗漏了什么,但我不知道这如何保证数据在内存中。如果我上传一个4GB的文件,你可能不想把它保存在内存中,你直接把它流到磁盘上。我通过http post请求发送附件。当通过多部分表单发送附件时,整个附件将被发送到服务器!它是由许多数据包发送的,这是真的,但是所有的数据包都被发送了!我还没有决定是否读取带有附件的InputStream,但我已经收到了它,Tomcat会保存它们。发送的数据包不会立即到达,同一传输中的所有数据包也不会同时到达。我通过http post请求发送附件。当通过多部分表单发送附件时,整个附件将被发送到服务器!它是由许多数据包发送的,这是真的,但是所有的数据包都被发送了!我还没有决定是否阅读带有附件的InputStream,但我已经收到了它,Tomcat持有它