1

我目前正在从事一个从 SourceForge 抓取源代码的项目。我想从代码库下载 tarball。

下面给出了一个示例链接: http ://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar

我在下载时遇到的问题是,我无法使用常规的 URLConnection、HttpClient、HtmlUnit、Jsoup 等 API 来下载文件。指定的链接不包含任何文件名或扩展名,这使得下载过程更加复杂。

你能建议一种方法,通过给定一组 tarball 链接作为参数,我应该能够将它们下载到我的磁盘上吗?另外,我可以使用 wget 下载它。有没有一种方法可以在 Windows 中的 Java 中以编程方式完成?

4

2 回答 2

3

在进一步努力之前,请仔细阅读 Sourceforge使用条款页面。如果您不了解 ToS,请联系 Sourceforge 并询问他们是否允许您按照您的建议进行操作。


我在下载时遇到的问题是,我无法使用常规的 url、http、htmlunit、jsoup apis 等来下载文件。

你的假设是不正确的。

您可以使用标准HttpURLConnectionAPI 或 Apache HttpClientAPI 等 API 来执行此类操作。如果它不起作用,那是因为

  • 你做错了事情(例如你没有配置你的 Java 应用程序来使用你的本地 HTTP 代理),或者
  • Sourceforge 正在使用一些技术手段来阻止你这样做;请参阅服务条款。

如果您发布一些有关尝试这些方法时发生的事情的详细信息,也许我们可以为您提供帮助。

(HtmlUnit 和 Jsoup 可能不合适,因为它们针对的是 HTML 内容。)

指定的链接不包含任何文件名或扩展名,这使得下载过程更加复杂。

您可以从响应标头中获取源文件名和/或内容类型。有关详细信息,请参阅 HTTP 规范。

于 2011-05-22T03:05:37.640 回答
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,除非您正在抓取您自己的代码(我曾经作为更新程序这样做过)。如果你这样做了,我的例子有帮助,请不要提及我。=]

希望我有所帮助!

于 2012-03-20T22:36:30.680 回答