Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 达到指定文件大小后停止HtmlUnit下载_Java_Inputstream_Htmlunit - Fatal编程技术网

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

Java 达到指定文件大小后停止HtmlUnit下载,java,inputstream,htmlunit,Java,Inputstream,Htmlunit,在达到一定大小后,我一直试图停止使用HtmlUnit启动的下载。输入流 InputStream input=button.click.getWebResponse.getContentAsStream; 正确下载完整的文件。然而,似乎使用 OutputStream输出=新文件OutputStreamFileName; int字节读取; int-total=0; 而bytesRead=input.readbuffer!=-1&总

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

InputStream input=button.click.getWebResponse.getContentAsStream; 正确下载完整的文件。然而,似乎使用

OutputStream输出=新文件OutputStreamFileName; int字节读取; int-total=0; 而bytesRead=input.readbuffer!=-1&总<最大尺寸{ output.writebuffer,0,字节读取; 总计+=字节读取; System.out.printtotal+\n; } 输出.flush; 输出。关闭; 输入。关闭; 以某种方式将文件下载到我不知道的其他位置,完成后将最大大小复制到文件名中。在此过程中不打印System.out。有趣的是,当在Netbeans中运行调试器并一步一步地缓慢运行时,总数被打印出来,我得到了最大大小的文件

在1024到102400之间改变缓冲区大小没有任何区别

我也试过Commons的

BoundedInputStream b=新建BoundedInputStreambutton.click.getWebResponse.getContentAsStream,最大大小; 没有成功

有,但我不知道如何实施建议的解决方案

为了停止最大大小的下载,我缺少了什么吗


为简洁起见,省略了异常处理和其他诸如此类的内容

无需为此使用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();
在本例中,我将最大下载大小设置为5MB,缓冲区设置为4KB。该文件将在while循环的每次迭代中写入磁盘,这似乎就是您正在寻找的


当然,请确保处理所有需要的异常,例如:FileNotFoundException。

谢谢。我之所以包含HtmlUnit,是因为首先我需要单击一个按钮,它会发送一个POST请求,然后将我重定向到实际下载。因为我有一些使用HtmlUnit的经验,所以我没有真正寻找没有它的解决方案。我会尝试一下,然后再报告。你能发布你设置下载文件的整个解决方案以及它应该具有的限制吗?关于第二条评论,我认为它是指限制HTMLUnit本身的下载量,简短的回答是不,你不能。答案很长:它是开源的,所以你可以用你能用的方式扩展它。您可以将您的定制连接到WebClient并从那里执行请求。。。确保不是所有的请求都被切断,对吗?HttpClient做到了。客户端生成为CloseableHttpClient client=HttpClientBuilder.create.setRedirectStrategynew LaxRedirectStrategy.build;以便可以随意关闭,并在发布后处理重定向。I/O例程保持不变,但先关闭CloseableHttpResponse,然后关闭InputStream@莫斯蒂:我也会试试,我想把HtmlUnit保留在我的项目中,让所有的互补点击变得更容易。