【发布时间】:2016-03-22 14:54:19
【问题描述】:
我通过代理从www.example.com/example.pdf 之类的网址下载文件并将其保存在java 中的文件系统上时遇到问题。有人对这如何工作有想法吗?如果我得到 InputStream,我可以简单地将其保存到文件系统:
final ReadableByteChannel rbc = Channels.newChannel(httpUrlConnetion.getInputStream());
final FileOutputStream fos = new FileOutputStream(file);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
但是如何通过代理获取 url 的输入流? 如果我这样做:
SocketAddress addr = new InetSocketAddress("my.proxy.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
URL url = new URL("http://my.real.url.com/");
URLConnection conn = url.openConnection(proxy);
我遇到了这个异常:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at app.model.mail.crawler.newimpl.FileLoader.getSourceOfSiteViaProxy(FileLoader.java:167)
at app.model.mail.crawler.newimpl.FileLoader.process(FileLoader.java:220)
at app.model.mail.crawler.newimpl.FileLoader.run(FileLoader.java:57)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
使用这个:
final HttpURLConnection httpUrlConnetion = (HttpURLConnection) website.openConnection(proxy);
httpUrlConnetion.setDoOutput(true);
httpUrlConnetion.setDoInput(true);
httpUrlConnetion.setRequestProperty("Content-type", "text/xml");
httpUrlConnetion.setRequestProperty("Accept", "text/xml, application/xml");
httpUrlConnetion.setRequestMethod("POST");
httpUrlConnetion.connect();
我可以下载一个网站的源代码,它是 html,但不是文件,也许有人可以帮助我设置下载文件的属性。
【问题讨论】:
-
如果您只需要设置代理设置,请参阅 Oracle 的 this document,或者如果您想切入正题,请参阅 this old StackOverflow question。
-
系统属性不起作用,因为我想在执行下载的每个线程中使用不同的代理。所以我必须为每个连接设置代理
-
上面的 Oracle 文档指定了如何执行此操作。我添加了一些示例代码的答案。
-
对我不起作用它给了我一个例外
-
可能不是代理的问题。有关此错误的原因列表,请参阅 stackoverflow.com/questions/585599/…。我的猜测是超时,并检查是否尝试下载一个非常小的文件。
标签: java http proxy stream connection