使用
BufferedReader有误,原因有两个:
- 它将字节转换为
String
,然后再转换回字节以将其发送到输出流。转换可能(可能会)导致数据丢失; - 它解析了太多字节,您无法控制它。
您需要通过手术来解决此问题,创建一个所需大小的字节缓冲区,并使用an
InputStream根据自己的条件逐字节读取流。另外,由于您知道HTTP标头的结尾为“ r n r n”(或13 10 13
10字节),因此可以扫描自己的缓冲区以查找此模式并采取相应的措施。
最好的选择是将图像下载到文件中,然后使用ImageIO从本地文件中读取图像。
这是允许您通过剪切标题下载图像文件(或任何其他文件)的代码:
// Initialize the streams. final FileOutputStream fileOutputStream = new FileOutputStream(file); final InputStream inputStream = socket.getInputStream(); // Header end flag. boolean headerEnded = false; byte[] bytes = new byte[2048]; int length; while ((length = inputStream.read(bytes)) != -1) { // If the end of the header had already been reached, write the bytes to the file as normal. if (headerEnded) fileOutputStream.write(bytes, 0, length); // This locates the end of the header by comparing the current byte as well as the next 3 bytes // with the HTTP header end "rnrn" (which in integer representation would be 13 10 13 10). // If the end of the header is reached, the flag is set to true and the remaining data in the // currently buffered byte array is written into the file. else { for (int i = 0; i < 2045; i++) { if (bytes[i] == 13 && bytes[i + 1] == 10 && bytes[i + 2] == 13 && bytes[i + 3] == 10) { headerEnded = true; fileOutputStream.write(bytes, i+4 , 2048-i-4); break; } } } } inputStream.close(); fileOutputStream.close();


