2012-05-28 52 views
0

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

数据保存在HBase的Bytes中。所以当我获取文件时,我会以字节形式获取它。

现在我必须将这些字节转换为File对象或输出流。

我想知道的是通过File对象发送文件更好还是Output Stream?

该文件可以从1 MB到10个MS不等。

我正在使用REST API发送数据。

+0

真的很重要吗?为了发送文件,你不需要一个文件,这意味着一堆IO来创建一些东西发送,然后就会消失? –

回答

1

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

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

一种可行的方法如下。

  1. 让剩下的API返回一个指向文件用户希望下载的URL。
  2. Write/Configure a Servlet为此URL。
  3. 当这个servlet接收到请求时,它读取数据库并写入响应流(输出流)。
  4. 用户将得到一个提示文件下载。

这是使用servlet的example of PDF file download

+0

发送文件只是一个*完全浪费时间。*它只是一个文件名,它只在它创建的服务器上有意义。 – EJP

1

这并不完全清楚你在做什么,但事实是,java.io.File只是一个路径的抽象,因此它不包含任何数据。因此,我不认为发送一个java.io.File对象会以任何方式帮助你,如果你想要做的是发送实际的文件内容。

发送一个OutputStream是不合理的,它只是一个类来控制字节流到给定接收器中。你发送的是字节,而不是流(即如果你的接收器是一个套接字,那么使用与这个给定接收器相关联的OutputStream通过套接字发送文件内容的字节是有意义的)。

+0

在我看来,这是不正确的。我通过REST将图像作为文件对象发送,我可以在浏览器上查看它们。 – JHS

+0

这是语义。 –

+1

@Juniad *我通过REST发送图像作为文件对象,我可以在浏览器上查看它们。*您将它们看作是什么? 1.图像显示为图像。 2.一个图片src指向一个URL。 3.别的东西。从不同的网络调用您的REST API并测试它是否正常工作。 –

1

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

话虽如此,检索10 MB作为一个字节[]似乎可能会消耗大量的内存每个请求。你可能想看看你能否让HBase给你一个InputStream,所以你不需要每个请求高达10MB的内存。

相关问题