2013-11-22 78 views
1

我正在編寫一個小程序來檢索大量的XML文件。該程序的工作類型,但無論從我使用的stackoverflow的解決方案,我本地保存的每個XML文件都會遺漏文件的末尾。通過「文件的結尾」,我的意思是大約5-10行xml代碼。這些文件長度不同(~500-2500行),總長度似乎對丟失位的大小沒有影響。目前,代碼如下所示:從URL複製XML文件返回不完整的文件

package plos; 
import static org.apache.commons.io.FileUtils.copyURLToFile; 
import java.io.File; 

    public class PlosXMLfetcher { 
     public PlosXMLfetcher(URL u,File f) { 
      try { 
       org.apache.commons.io.FileUtils.copyURLToFile(u, f); 
      } catch (IOException ex) { 
       Logger.getLogger(PlosXMLfetcher.class.getName()).log(Level.SEVERE, null, ex); 
      } 
    } 
} 

我一直在使用BufferedInputStreamReadableByteChannel也試過。我曾嘗試在線程中運行它,我嘗試使用readreadLine。每個解決方案都給我一個不完整的XML文件作爲返回。

在我的一些測試中(我不記得是哪個,抱歉),我得到了一個套接字連接重置錯誤 - 但上面的代碼執行時沒有錯誤消息。

我手動下載了一些XML文件,以檢查它們是否在遠程服務器上實際完成 - 它們是哪一個。

+0

嘗試copyURLToFile(URL來源,文件目的地,詮釋connectionTimeout,INT readTimeout),也許是連接超時。 – reese

+0

我剛剛嘗試過,超時時間爲10000,結果完全相同。 – ipoga

回答

1

我在猜測某處BufferedWriter或BufferedOutputStream還沒有調用flush()

爲什麼不寫自己的複製功能,以排除FileUtils.copyURLToFile(u, f)

public void copyURLToFile(u, f) { 
    InputStream in = u.openStream();   
    try { 
     FileOutputStream out = new FileOutputStream(f); 
     try {     
      byte[] buffer = new byte[1024]; 
      int count; 
      while ((count = in.read(buffer) > 0) { 
      out.write(buffer, 0, count); 
      } 
      out.flush(); 
     } finally { 
      out.close(); 
     } 
    } finally { 
     in.close(); 
    } 
} 
+0

我也想過,至少在我的一些其他測試中,但使用copyURLtoFile()不應該有這個問題。還是我誤會了? – ipoga

+0

也許生成XML文件的過程不是'''flush()'''? –

+0

我相信XML文件是在線的靜態文檔。如果我在瀏覽器中輸入文檔的URL,我會得到整個文件。 – ipoga