在达到一定的大小后,我试图停止使用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停止下载,我有什么遗漏吗?
(为简洁省略了例外处理和其他等等)
答案 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
循环的每次迭代中写入磁盘,这似乎是您正在寻找的。 p>
当然,请确保处理所有必需的例外情况(例如:FileNotFoundException
)。