2012-05-28 51 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的內存。

相關問題