我目前正在开发一个从SourceForge中抓取源代码的项目。 我想从代码库下载tarball。
下面给出了一个示例链接: http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar
我下载时遇到的问题是,我无法使用传统的URLConnection,HttpClient,HtmlUnit,Jsoup等API来下载文件。指定的链接不包含任何文件名或扩展名,这使下载过程更加复杂。
你能建议一种方法,给定一组tarball链接作为参数,我应该能够将它们下载到我的磁盘吗?此外,我能够使用wget下载它。有没有办法在Windows中以Java编程方式?
答案 0 :(得分:3)
在您继续努力之前,请仔细阅读Sourceforge Terms of Use页面。如果您不理解ToS,请联系Sourceforge并询问他们您是否被允许按照您的建议行事。
我下载时遇到的问题是,我无法使用传统的url,http,htmlunit,jsoup apis等来下载文件。
您的假设不正确。
您可以使用标准HttpURLConnection
API或Apache HttpClient
API等API来执行此类操作。如果它不起作用,那是因为
如果您在尝试这些方法时发布了有关正在发生的事情的一些细节,也许我们可以帮助您。
(HtmlUnit和Jsoup可能不合适,因为它们的目标是HTML内容。)
指定的链接不包含任何文件名或扩展名,这使下载过程更加复杂。
您可以从响应标头中获取源文件名和/或内容类型。有关详细信息,请参阅HTTP规范。
答案 1 :(得分: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,除非你自己的代码是你正在抓的(我曾经做过一次作为更新程序)。如果你这样做,我的例子有所帮助,请不要提及我。 =]
希望我帮忙!