Java 发送文件或输出流更好

Java 发送文件或输出流更好,java,file,rest,hbase,fileoutputstream,Java,File,Rest,Hbase,Fileoutputstream,在我的项目中,我们正在保存一些文件。 当请求文件时,我从HBase表中获取该文件,然后将其发送到浏览器 数据以字节形式保存在HBase中。因此,当我获取文件时,我将以字节为单位获取它 现在我必须将这些字节转换成文件对象或输出流 我想知道的是,通过文件对象发送文件是更好还是输出流更好 文件大小可以从1 MB到10毫秒不等 我正在使用RESTAPI发送数据。不完全清楚您在做什么,但事实是,java.io.File只是路径上的抽象,因此它不包含任何数据。因此,如果您想做的是发送实际的文件内容,那么发送

在我的项目中,我们正在保存一些文件。 当请求文件时,我从HBase表中获取该文件,然后将其发送到浏览器

数据以字节形式保存在HBase中。因此,当我获取文件时,我将以字节为单位获取它

现在我必须将这些字节转换成文件对象或输出流

我想知道的是,通过文件对象发送文件是更好还是输出流更好

文件大小可以从1 MB到10毫秒不等


我正在使用RESTAPI发送数据。

不完全清楚您在做什么,但事实是,
java.io.File
只是路径上的抽象,因此它不包含任何数据。因此,如果您想做的是发送实际的文件内容,那么发送
java.io.File
对象对您没有任何帮助


发送
OutputStream
也没有意义,它只是一个类,用于控制进入给定接收器的字节流。您发送的是字节,而不是流(即,如果您的接收器是一个套接字,那么使用与此给定接收器关联的
OutputStream
通过套接字发送文件内容的字节是有意义的)。

不完全清楚您在做什么,但事实是,
java.io.File
只是路径上的抽象,因此它不包含任何数据。因此,如果您想做的是发送实际的文件内容,那么发送
java.io.File
对象对您没有任何帮助


发送
OutputStream
也没有意义,它只是一个类,用于控制进入给定接收器的字节流。您发送的是字节,而不是流(即,如果您的接收器是套接字,那么使用与此给定接收器关联的
OutputStream
通过套接字发送文件内容的字节是有意义的).

发送java.io.File对象不会有帮助,因为它将是一个非常特定于java的二进制对象,并且它将要求接收系统使用java

您提到,您正在使用REST。现在,这需要一种独立于任何技术/平台的东西

一个可行的办法如下

  • 让RESTAPI返回一个URL,该URL指向用户希望下载的文件
  • 对于此URL
  • 当这个servlet接收到请求时,它读取数据库并写入响应流(输出流)
  • 用户将收到请求下载文件的提示
    下面是一个使用servlet的示例

    发送java.io.File对象不会有帮助,因为它将是一个非常特定于java的二进制对象,并且它将要求接收系统使用java

    您提到,您正在使用REST。现在,这需要一种独立于任何技术/平台的东西

    一个可行的办法如下

  • 让RESTAPI返回一个URL,该URL指向用户希望下载的文件
  • 对于此URL
  • 当这个servlet接收到请求时,它读取数据库并写入响应流(输出流)
  • 用户将收到请求下载文件的提示
    下面是一个使用servlet的示例

    我假设问题是询问是直接写入输出流还是先将字节[]保存到本地文件。我能想到的首先保存到本地文件的唯一原因是将检索与HBase和用户下载分离。如果希望从HBase返回字节[]的每个请求在响应中将整个文件返回给用户,请使用OutputStream


    话虽如此,以字节[]形式检索10 MB似乎可能会在每个请求中消耗大量内存。您可能想看看是否可以让HBase为您提供一个InputStream,这样您就不需要每个请求最多10 MB的RAM。

    我假设问题是,是直接写入到OutStream还是先将字节[]保存到本地文件。我能想到的首先保存到本地文件的唯一原因是将检索与HBase和用户下载分离。如果希望从HBase返回字节[]的每个请求在响应中将整个文件返回给用户,请使用OutputStream


    话虽如此,以字节[]形式检索10 MB似乎可能会在每个请求中消耗大量内存。您可能想看看是否可以让HBase为您提供一个InputStream,这样您就不需要每个请求最多10 MB的RAM。

    在我看来,这是不正确的。我通过REST将图像作为文件对象发送,并且我可以在浏览器上查看它们。@Juniad我通过REST将图像作为文件对象发送,并且我可以在浏览器上查看它们。你把他们看作什么?1.显示为图像的图像。2.指向URL的图像src。3.还有别的。从其他网络调用REST api并测试它是否工作。@Ravinder-一个显示为图像的图像,是的,它在所有网络中都工作。@edalorzo-您的答案是没有工作。你能告诉我什么有用吗?我想让用户下载文件和/或在浏览器上查看。@Juniad将字节的文件内容作为附件发送到输出流中,以便客户端可以下载。我认为这不是真的。我通过REST将图像作为文件对象发送,并且我可以在浏览器上查看它们。@Juniad我通过REST将图像作为文件对象发送,并且我可以在浏览器上查看它们。你把他们看作什么?1.显示为图像的图像。2.指向URL的图像src。3.还有别的。从其他网络调用REST api并测试它是否工作。@Ravinder-一个显示为图像的图像,是的,它在所有网络中都工作。@edalorzo-您的答案是没有工作。你能告诉我什么有用吗?我想让用户下载文件和/或在浏览器上查看。@Juniad Send b