2010-04-16 298 views
3

我有一个HTTP请求调度程序类,大多数情况下都能正常工作,但我注意到它在收到更大的请求时“停止”。在研究这个问题后,我想我可能没有为缓冲区分配足够的字节。之前,我是这样做的:Java HTTP请求缓冲区大小

byte[] buffer = new byte[10000]; 

将其更改为20000后,它似乎已经停止拖延:

String contentType = connection.getHeaderField("Content-type"); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

      InputStream responseData = connection.openInputStream(); 
      byte[] buffer = new byte[20000]; 
      int bytesRead = responseData.read(buffer); 
      while (bytesRead > 0) { 
       baos.write(buffer, 0, bytesRead); 
       bytesRead = responseData.read(buffer); 
      } 
      baos.close(); 
      connection.close(); 

我这样做对吗?无论如何,我可以根据请求的大小动态设置缓冲区的字节数?

谢谢...

回答

1

这是从输入流输出的错误的方式。正确的做法是:

byte[] buffer = new byte[10000]; 
int bytesRead = 0; 
while ((bytesRead = responseData.read(buffer)) > 0) { 
    baos.write(buffer, 0, bytesRead); 
} 

byte[] buffer = new byte[10000]; 
for (int bytesRead = 0; (bytesRead = responseData.read(buffer)) > 0;) { 
    baos.write(buffer, 0, bytesRead); 
} 

另见Sun tutorial on the subject

1〜2K(1024〜2048)的缓冲区往往绰绰有余。

+0

感谢您的建议! – littleK 2010-04-16 13:52:58

+0

不客气。 – BalusC 2010-04-16 13:55:35

3

如果你打开使用外部库,该库Apache IOUtilstoByteArray,将输入流转换为字节数组,而不需要您做任何工作。

很简单:

byte[] buffer = IOUtils.toByteArray(connection.openInputStream()); 
+0

不幸的是,我正在研究一个对外部库不提供很好支持的平台。不过,我感谢你的帮助! – littleK 2010-04-16 13:52:40