2011-06-13 52 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