2015-10-09 59 views
1

我試圖在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循環,使確保成品不等於-1,並呼籲更多的數據字節,而使用它寫入文件:

newFile.write(input, 0, finished); 

我知道我的套接字配置正確,因爲我可以下載並使用它讀取HTTP標頭。我的程序永遠不會進入while循環來寫入數據,read()函數立即返回-1。我將如何去修復我的代碼?

謝謝!

編輯:我看到,這被標記爲重複使用URL類來做同樣的事情的答案。我無法使用URL或URLConnection。

+0

爲什麼* *描述了'while'循環中,您可能*貼的時候*呢?你在哪裏閱讀標題?你在哪裏檢查HTTP返回碼? – EJP

+0

@EJP我認爲我不需要發佈while循環,因爲它不會啓動,因爲'download.read(input,0,10240)'立即返回'-1'。 – Shozzking

+0

@EJP我發佈了與我的問題相關的其餘代碼 – Shozzking

回答

2

您沒有正確讀取標題。你需要閱讀它們,直到你得到一個空行,而不是null。當你只是想讀取標題時,你正在閱讀整個響應,因此在第二部分中沒有響應主體可供閱讀。

但是,您有BufferedReader的另一個問題。它很可能會竊取來自以下機構的數據。這是DataInputStream.readLine()的罕見情況,是的,我知道它已被棄用。

您還沒有檢查是否有HTTP錯誤代碼,這意味着響應中沒有主體。

您不需要在while循環之前初始化line

您還在兩個\n之間缺少\r s。

所有這些都是爲什麼使用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); 
} 
+0

非常感謝您的幫助! – Shozzking

相關問題