在java中读取URL的内容-重定向问题

在java中读取URL的内容-重定向问题,java,url,redirect,Java,Url,Redirect,当我执行下面的java程序时,有时会得到空响应,有时会得到真实(重定向)内容 ByteArrayOutputStream output = new ByteArrayOutputStream(); URL url = new URL( "https://stackoverflow.com/questions/84629" ); IOUtils.copy( url.openStream(), output ); System.out.println( output.toString() ); U

当我执行下面的java程序时,有时会得到空响应,有时会得到真实(重定向)内容

ByteArrayOutputStream output = new ByteArrayOutputStream();
URL url = new URL( "https://stackoverflow.com/questions/84629" );
IOUtils.copy( url.openStream(), output );
System.out.println( output.toString() );
URL是指向的重定向

我查看了其他SO问题,并尝试使用建议的
HttpUrlConnection
,但结果是一样的。响应代码总是200,但有时有正确的html输出,有时只是一个空字符串

你能解释一下这里发生了什么吗


编辑 以下是没有Apache commons的代码:

ByteArrayOutputStream output = new ByteArrayOutputStream();
URL url = new URI( "https://stackoverflow.com/questions/84629" ).toURL();
InputStream openStream = url.openStream();
byte[] buffer = new byte[ 1024 ];
int size = 0;
while( (size = openStream.read( buffer ) ) != -1 ) {
    output.write( buffer, 0, size );
}
System.out.println( output.toString() );
我正在使用Windows XP和Java 1.6.0_17


我使用wireshark捕获了流量:

GET /questions/84629 HTTP/1.1 User-Agent: Java/1.6.0_17 Host: stackoverflow.com Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive HTTP/1.1 200 OK Cache-Control: private Server: Microsoft-IIS/7.0 Date: Tue, 10 Nov 2009 22:42:42 GMT Content-Length: 0 GET/questions/84629 HTTP/1.1 用户代理:Java/1.6.0_17 主机:stackoverflow.com 接受:text/html、image/gif、image/jpeg、*;q=.2,*/*;q=.2 连接:保持活力 HTTP/1.1200ok 缓存控制:专用 服务器:Microsoft IIS/7.0 日期:2009年11月10日星期二22:42:42 GMT 内容长度:0
我以前在创建URL时遇到过一些问题,比如您发布的示例,我发现解决这个问题的最好方法是创建一个URL,然后像这样创建URL

URL url = uri.toUrl()

我不完全确定您的问题是否与我的问题相同,但当我创建一个URL(如您的示例中所示)时,每次都没有正确编码,这在某些情况下会导致错误,但使用URI为我解决了问题。

我也有类似的问题,最后不得不自己使用HttpURLConnection。我不记得你描述的HttpURLConnection有问题。这里的代码完成了这项工作(将其打印到屏幕上,但您可以根据需要进行更改)


我想这就像@carl smotricz说的:“你可能遇到了垃圾邮件过滤器之类的东西。”

IOUtils是否会刷新并关闭提供的流?我尝试“手动”循环读取流。同样的结果。太棒了——我也很喜欢!去调试,马上回来…我想:这是网站。它的行为与我使用wget-O-时的行为相同。你可能遇到了垃圾邮件过滤器之类的东西。这篇文章可能对未来的读者有用,就像对我一样:这解决了我的问题。不,这不是解决办法。我试过你描述的方式,但行为是一样的。
public void connect() {
    try {
        String url = "http://www.stackoverflow.com",
               proxy = "proxy.mydomain.com",
               port = "8080";
        URL server = new URL(url);
        Properties systemProperties = System.getProperties();
        systemProperties.setProperty("http.proxyHost",proxy);
        systemProperties.setProperty("http.proxyPort",port);
        HttpURLConnection connection = (HttpURLConnection)server.openConnection();
        connection.connect();
        InputStream in = connection.getInputStream();
        readResponse(in);
    } catch(Exception e) {
        e.printStackTrace();
    }

}
public void readResponse(InputStream is) throws IOException {
    BufferedInputStream bis = new BufferedInputStream(is);
    ByteArrayOutputStream buf = new ByteArrayOutputStream();
    int result = bis.read();
    while(result != -1) {
      byte b = (byte)result;
      buf.write(b);
      result = bis.read();
    }        
    System.out.println(buf.toString());
}