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

标签 java inputstream htmlunit

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

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?

(为简洁起见,省略了异常处理和其他内容)

最佳答案

无需为此使用 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)。

关于java - 达到指定文件大小后停止 HtmlUnit 下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20401106/

相关文章:

java - 在spring中配置mongodb,application.properties还是AbstractMongoConfiguration?

Java String.split() 失控

c# - 如何根据Request.InputStream判断调用了哪个WS方法?

java - 将包含多个文件的Inputstream放入一个ZipEntry中

java - 如何在java中将Map<Object, Object>转换为Map<String, String>?

java - 需要一些关于这个 Java 入门程序的指导

java - 使用 Java 在 Linux 上执行 DHCP

javascript - 尝试使用 HtmlUnit 解析 ember 应用程序时出错

javascript - 使用 HtmlUnit 提交表单

eclipse - 如何在每次运行 htmlUnit 或 Selenium 测试之前始终设置正确数量的标签? eclipse