我正在尝试使用java中的套接字从互联网上下载文件。我的程序似乎正常工作并编译,但当我去检查文件后,然后它的0字节大小。我不确定我在哪里出错了。
BufferedInputStream download = new BufferedInputStream(socket.getInputStream());
FileOutputStream newFile = new FileOutputStream(fileName);
output.print("GET " + address + " HTTP/1.0\r\n\n");
output.flush();
byte[] input = new byte[10240];
int finished = download.read(input, 0, 10240);
然后我有一个while循环,确保finish不等于-1并在使用以下方法将数据写入文件时调用更多字节的数据:
newFile.write(input, 0, finished);
我知道我的套接字配置正确,因为我可以下载并读取HTTP标头。我的程序从不进入while循环来写入数据,read()函数立即返回-1。我该如何修复我的代码?
谢谢!
编辑:我看到这个被标记为重复的答案使用了URL类来做同样的事情。我不能使用URL或URLConnection。
答案 0 :(得分:2)
您没有正确阅读标题。您需要阅读它们,直到得到一个空行,而不是空行。当您只是尝试读取标题时,您正在读取整个响应,因此在第二部分中没有剩余的响应正文。
但是BufferedReader
还有另一个问题。它可能会从以下机构窃取数据。这是DataInputStream.readLine()
的罕见情况,是的,我知道它已被弃用。
您也没有检查是否有HTTP错误代码,这意味着响应中没有正文。
您无需在line
循环之前初始化while
。
您在两个\r
之间也缺少\n
。
所有这些都是为什么最好使用HttpURLConnection
,如果你不能,那就是为什么它不是一个好的任务。
编写这些循环的简便方法是:
// headers
while ((line = in.readLine()) != null
{
if (line.length() == 0)
break; // end of headers
// ...
}
// body
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}