1

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

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

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

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

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

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

4

3 回答 3

2

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

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

于 2012-05-28T17:52:05.703 回答
1

发送 java.io.File 对象将无济于事,因为它将是一个非常特定于 java 的二进制对象,并且它将要求接收系统在 java 中。

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

一种可行的方法如下。

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

这是使用 servlet下载 PDF 文件的示例。

于 2012-05-28T18:15:25.107 回答
1

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

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

于 2012-05-28T18:15:42.520 回答