2014-09-23 66 views
1

我嘗試使用下面的代碼從網址下載PDF文件。它在文件大小小於8k時工作正常,如果文件大小達到8k,它會下載PDF文件,但文件不可讀。java下載文件不工作文件大小是否超過8K?

代碼

InputStream in = new BufferedInputStream(url.openStream()); 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       byte[] buf = new byte[1024]; 
       int n = 0; 
       while (-1!=(n=in.read(buf))) 
       { 
        out.write(buf, 0, n); 
       } 
       out.close(); 
       in.close(); 
       byte[] response = out.toByteArray(); 

       FileOutputStream fos = new FileOutputStream(new File("C:\\temp\\TEST.pdf")); 
       fos.write(response); 
       fos.close(); 
       System.out.println("Download Finished"); 
+0

可能重複的[如何在java中沒有內存問題下載大文件](http://stackoverflow.com/questions/7106775/how-to-download-large-files-without-memory-issues-in -java) – StackFlowed 2014-09-23 18:25:41

+0

-1!=(n = in.read(buf)對我來說看起來很奇怪因爲它是c風格,我猜?爲什麼不是(n = in.read(buf)!= -1 – 2014-09-23 18:25:47

+2

我用過你的代碼下載http://www.pdf995.com/samples/pdf.pdf(424 K),它運行良好。如果你的URL需要某種重定向,你最終會下載一個html頁面而不是你的pdf 。所以檢查你保存的文件,並檢查它是不是一個HTML文件。 – Leo 2014-09-23 18:31:18

回答

0

您可能嘗試使用IOUtils.copy(InputStream的輸入,輸出的OutputStream) 可以最小化的代碼行。 Apache IOUtils

+2

這種方式更容易,但爲什麼它會解決他/她的問題? – Leo 2014-09-23 18:29:14

+0

或者,使用[Files.copy](http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#copy-java.io.InputStream-java.nio。 file.Path-java.nio.file.CopyOption ...-)並避免依賴於第三方庫。 – VGR 2014-09-23 19:07:47

+0

我忘了解釋我如何得到的網址,這是在硒測試中,我點擊一個鏈接下載文件。所以這裏缺少的代碼:driver.findElement(By.linkText(DownloadPDFlink))。click();然後我嘗試使用System.out.println(「HREF =」+ driver.findElement(By.linkText(DownloadPDF))。getAttribute(「href」));並在我使用thr url對象來下載文件後。 – 2014-09-23 19:21:39