2011-06-13 50 views
1

我正在向servlet中的瀏覽器發送文件。我可以使用的最高JDK是1.4.2,我也必須通過URL檢索文件。我也試圖使用「guessContentTypeFromStream」,但我一直收到null,在下面的代碼示例中使用時會引發異常。我目前必須編寫硬編碼或編寫自己的內容類型。需要幫助優化緩衝讀取器輸出

我想知道的是,我如何重新分解這段代碼,以便文件傳輸儘可能快並且還使用guessContentTypeFromStream? (注意「res」是HttpServletResponse)。

URL servletUrl = new URL(sFileURL); 
URLConnection conn = servletUrl.openConnection(); 
int read; 
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); 

String sContentType =conn.guessContentTypeFromStream(conn.getInputStream()); 

res.setContentType(sContentType); 
//res.setContentType("image/jpeg"); 

PrintWriter os = res.getWriter(); 

while((read = bis.read()) != -1){ 
    os.write(read); 
} 
//Clean resources 
os.flush(); 
+1

不要逐字讀取字符。順便說一句,你爲什麼從輸入流中讀取數據,但寫入作者? – Kaj 2011-06-13 10:48:51

+0

@Kaj。是的,我知道char-by-char是慢的。只需尋找一個使用緩衝區的乾淨實現。 – giulio 2011-06-13 11:10:42

+0

看到我的答案,它顯示瞭如何讀取/寫入塊。 – Kaj 2011-06-13 11:15:59

回答

2

這就是您通常讀/寫數據的方式。

in = new BufferedInputStream(socket.getInputStream(), BUFFER_SIZE); 
byte[] dataBuffer = new byte[1024 * 16]; 
int size = 0; 
while ((size = in.read(dataBuffer)) != -1) { 
    out.write(dataBuffer, 0, size); 
} 
+0

爲了讓這個示例更友好,「in」也是一個BufferedInputStream?和「out」是HttpServletRespsonse.getOutputStream()?是否有「BUFFER_SIZE」的首選大小或BUFFER_SIZE是1024 * 16? – giulio 2011-06-13 22:25:44

+0

正確,in是'BufferedInputStream',out可以是任何'OutputStream'。您可以嘗試使用不同的緩衝區大小,但我會使用比字節數組大的緩衝區大小。沒有最適合所有情況的最佳緩衝區大小。 – Kaj 2011-06-14 06:57:13

+0

感謝您的提示。您能否詳細說明爲什麼緩衝區大小應該比字節數組大一些。我曾想過讓它們都變成相同的尺寸。 – giulio 2011-06-14 07:50:28