【问题标题】:Reading from a URL Connection Java从 URL 连接读取 Java
【发布时间】:2011-07-19 07:41:57
【问题描述】:

我正在尝试从 URL 连接读取 html 代码。在一种情况下,我尝试读取的 html 文件在实际文档类型声明之前包含 5 个换行符。在这种情况下,输入阅读器会抛出 EOF 异常。

URL pageUrl = 
    new URL(
        "http://www.nytimes.com/2011/03/15/sports/basketball/15nbaround.html"
    );

URLConnection getConn = pageUrl.openConnection();
getConn.connect();
DataInputStream dis = new DataInputStream(getConn.getInputStream());
//some read method here

有人遇到过这样的问题吗?

URL pageUrl = new URL("http://www.nytimes.com/2011/03/15/sports/basketball/15nbaround.html");
URLConnection getConn = pageUrl.openConnection();
getConn.connect();
DataInputStream dis = new DataInputStream(getConn.getInputStream());
String urlData = "";
while ((urlData = dis.readUTF()) != null)
    System.out.println(urlData);

//抛出异常

java.io.EOFException 在 java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323) 在 java.io.DataInputStream.readUTF(DataInputStream.java:572) 在 java.io.DataInputStream.readUTF(DataInputStream.java:547)

对于bufferedreader,它只是响应null并且不继续

pageUrl = new URL("http://www.nytimes.com/2011/03/15/sports/basketball/15nbaround.html");
URLConnection getConn = pageUrl.openConnection();
getConn.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(getConn.getInputStream()));
String urlData = "";
while(true)
     urlData = br.readLine();
     System.out.println(urlData);

输出为空

【问题讨论】:

  • 换行符不是 EOF。也许发布您的阅读代码及其引发的异常?
  • 我同意 Brian R. 的上述评论,如果没有堆栈跟踪,很难说出问题所在。另外,我不确定为什么需要使用 DataInputStream 来读取 HTML。那是主要用于读取 Java 原始类型(二进制)。如果你想逐行阅读,BufferedReader 是一个更好的(非弃用)选择。

标签: java url html-parsing urlconnection datainputstream


【解决方案1】:

您正在使用DataInputStream 读取未使用DataOutputStream 编码的数据。检查您致电DataInputStream#readUtf() 的记录行为; it first reads two bytes 形成一个 16 位整数,表示后面包含 UTF 编码字符串的字节数。您从 HTTP 服务器读取的数据不是以这种格式编码的。

相反,根据RFC 2616 第 6.1 和 2.2 节,HTTP 服务器发送以 ASCII 编码的标头。您需要将标头作为文本读取,然后确定消息正文(“实体”)的编码方式。

【讨论】:

    【解决方案2】:

    这很好用:

    package url;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.net.URL;
    
    /**
     * UrlReader
     * @author Michael
     * @since 3/20/11
     */
    public class UrlReader
    {
    
        public static void main(String[] args)
        {
            UrlReader urlReader = new UrlReader();
    
            for (String url : args)
            {
                try
                {
                    String contents = urlReader.readContents(url);
                    System.out.printf("url: %s contents: %s\n", url, contents);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    
    
        public String readContents(String address) throws IOException
        {
            StringBuilder contents = new StringBuilder(2048);
            BufferedReader br = null;
    
            try
            {
                URL url = new URL(address);
                br = new BufferedReader(new InputStreamReader(url.openStream()));
                String line = "";
                while (line != null)
                {
                    line = br.readLine();
                    contents.append(line);
                }
            }
            finally
            {
                close(br);
            }
    
            return contents.toString();
        }
    
        private static void close(Reader br)
        {
            try
            {
                if (br != null)
                {
                    br.close();
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      这个:

      public class Main {
          public static void main(String[] args) 
              throws MalformedURLException, IOException 
          {
              URL pageUrl = new URL("http://www.google.com");
              URLConnection getConn = pageUrl.openConnection();
              getConn.connect();
              BufferedReader dis = new BufferedReader( 
                                       new InputStreamReader(
                                           getConn.getInputStream()));
              String myString;
              while ((myString = dis.readLine()) != null)
              {
                  System.out.println(myString);
              }
          }
      }
      

      完美运行。但是,您提供的 URL 没有返回任何内容。

      【讨论】:

      • 提供的 URL 产生 301 响应(“永久移动”)。
      • 好的,谢谢大家。我没有注意到 301,但现在我修复了它
      猜你喜欢
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      相关资源
      最近更新 更多