2011-05-22 72 views
1

我目前正在從SourceForge中獲取源代碼的項目。 我想從代碼庫下載tarball。 http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar從版本庫下載tarball

我所面臨的問題,同時下載的是,我無法用常規的URLConnection,HttpClient的,的HtmlUnit,Jsoup等API的下載文件:

一個例子鏈接如下。指定的鏈接不包含任何文件名或擴展名,這使得下載過程更加複雜。

你能否給出一種方法,通過給定一組作爲參數的tarball鏈接,我應該能夠將它們下載到我的磁盤上?另外,我可以使用wget下載它。有沒有一種方法可以在Windows中以編程方式在Java中執行?

+0

爲什麼要使用wget? – rzetterberg 2011-05-22 00:44:36

+0

爲什麼不能使用標準Java庫來下載文件?至於文件名,只需給它一個隨機名和一個'.tar'擴展名即可。你可以用下面的方法產生一個隨機文件名:'Long.toHexString(Double.doubleToLongBits(Math.random()));'([source](http://mynotes.wordpress.com/2009/07/23/ java的生成隨機串/))。 – Jonah 2011-05-22 00:48:24

+2

另請參閱這些[使用條款](http://sourceforge.net/apps/trac/sitelegal/wiki/Terms_of_Use)。 – trashgod 2011-05-22 01:00:35

回答

3

在您付出努力之前,請仔細閱讀Sourceforge Terms of Use頁面,然後再行動。如果您不瞭解ToS,請聯繫Sourceforge並詢問他們是否允許您執行您的建議。


的問題,我面對,而下載的是,我無法用傳統的URL,HTTP的HtmlUnit,jsoup的API等來下載文件。

你的假設是不正確的。

您可以使用API​​(例如標準HttpURLConnection API或Apache HttpClient API)來執行此類操作。如果它不工作,那是因爲

  • 你正在做的事情錯誤的方式(例如,你還沒有配置你的Java應用程序使用本地的HTTP代理),或
  • Sourceforge上使用一些技術手段阻止你這樣做;請參閱ToS。

如果您在嘗試這些方法時發佈了一些正在發生的細節,也許我們可以幫助您。

(和的HtmlUnit是Jsoup可能不適當的,因爲他們的目標HTML內容。)

指定的鏈接不包含任何文件名或擴展,這使得下載過程變得更加複雜。

您可以從響應頭獲取源文件名和/或內容類型。有關詳細信息,請參閱HTTP規範。

1

如果你真的想要或許違反SourceForges ToS,那麼這可能會有所幫助。

您需要wget.exe,如您所願。

ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy"); 
Process p = pb.start(); 

只要您在類文件所在的目錄中有wget.exe,就會工作。

您可能還需要檢查文件是否存在,在這種情況下,你會做的線路中的東西:

ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy"); 
     Process p = pb.start(); 
     int exitValue = p.waitFor(); 
     BufferedReader reader; 
     // System.out.println("Exit Value" + exitValue); 
     if (exitValue == 0) { 
       reader = new BufferedReader(new InputStreamReader(p 
           .getInputStream())); 
     } else { 
       reader = new BufferedReader(new InputStreamReader(p 
           .getErrorStream())); 
     } 
     StringBuffer sb = new StringBuffer(); 
     String temp = reader.readLine(); 
     while (temp != null) { 
       sb.append(temp); 
       temp = reader.readLine(); 
     } 

     reader.close(); 
     System.out.println(sb.toString()); 
if(sb.toString().indexOf("404") != -1) { 
//means that the file does not exist 
System.out.println("File does not exist, or access is denied"); 
} else { 
if(sb.toString().indexOf("200") != -1) { 
//file exists, download it 
System.out.println("File exists, downloading..."); 
ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy"); 
    Process p = pb.start(); 
} 

但我建議不要刮SourceForge上,除非它自己的代碼,你是刮(我曾做過一次更新程序)。如果你這樣做,並且我的例子有幫助,請不要提及我。 =]

希望我幫了忙!