达到指定的文件大小后停止HtmlUnit下载

时间:2013-12-05 13:20:02

标签: java inputstream htmlunit

在达到一定的大小后,我试图停止使用HtmlUnit启动下载。 InputStream

InputStream input = button.click().getWebResponse().getContentAsStream();

正确下载完整文件。但是,似乎在使用

OutputStream output = new FileOutputStream(fileName);
int bytesRead;
int total = 0;
while ((bytesRead = input.read(buffer)) != -1 && total < MAX_SIZE) {
  output.write(buffer, 0, bytesRead);
  total += bytesRead;
  System.out.print(total + "\n");
}
output.flush();
output.close();
input.close();

以某种方式将文件下载到不同的位置(我不知道),并在完成后将最大大小复制到文件“fileName”中。在此过程中不会打印System.out。有趣的是,在Netbeans中运行调试器并逐步进行缓慢运行时,打印总数并得到MAX_SIZE文件。

将缓冲区大小改变在1024到102400之间的范围内没有任何区别。

我也尝试过Commons'

BoundedInputStream b = new BoundedInputStream(button.click().getWebResponse().getContentAsStream(), MAX_SIZE);

没有成功。

this 2,5 years old post,但我无法弄清楚如何实施建议的解决方案。

为了在MAX_SIZE停止下载,我有什么遗漏吗?

(为简洁省略了例外处理和其他等等)

1 个答案:

答案 0 :(得分:0)

没有必要为此使用HTMLUnit。实际上,将它用于这样一个简单的任务是一个非常过度的解决方案,并会使事情变得缓慢。我能想到的最佳方法如下:

final String url = "http://yoururl.com";
final String file = "/path/to/your/outputfile.zip";
final int MAX_BYTES = 1024 * 1024 * 5;  // 5 MB

URLConnection connection = new URL(url).openConnection();
InputStream input = connection.getInputStream();
byte[] buffer = new byte[4096];
int pendingRead = MAX_BYTES;
int n;
OutputStream output = new FileOutputStream(new File(file));
while ((n = input.read(buffer)) >= 0 && (pendingRead > 0)) {
    output.write(buffer, 0, Math.min(pendingRead, n));
    pendingRead -= n;
}
input.close();
output.close();

在这种情况下,我将最大下载大小设置为5 MB,缓冲区设置为4 KB。该文件将在while循环的每次迭代中写入磁盘,这似乎是您正在寻找的。

当然,请确保处理所有必需的例外情况(例如:FileNotFoundException)。