当前位置: 首页 > 面试题库 >

在Java IOException Premature EOF中阅读网页

拓拔坚
2023-03-14
问题内容

阅读网页时,我经常收到“过早的EOF”异常。

以下是StackTrace

java.io.IOException: Premature EOF
    at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:556)
    at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:600)
    at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:687)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2968)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:154)
    at java.io.BufferedReader.readLine(BufferedReader.java:317)
    at java.io.BufferedReader.readLine(BufferedReader.java:382)
    at Utilities.getPage(Utilities.java:24)  while ((line = rd.readLine()) != null) {
    at TalkPage.<init>(TalkPage.java:15)
    at Updater.run(Updater.java:65)

以下是getPage()方法

public static String getPage(String urlString) throws Exception {
    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    StringBuffer sb = new StringBuffer();
    String line;
    while ((line = rd.readLine()) != null) {  // LINE 24
        sb.append(line);
    }
    return sb.toString();
}

什么是持久性EOFException?为什么在这种特殊情况下会发生这种情况?如何避免呢?

其他一些信息:正在读取的页面大小约为20 KB,并且我正在程序中读取许多此类页面(大约20 000)


问题答案:

这可能是因为您正在逐行读取内容,而对于最后一行,文件可能缺少返回值以表示行结束。将此替换为:

int BUFFER_SIZE=1024;
char[] buffer = new char[BUFFER_SIZE]; // or some other size, 
int charsRead = 0;
while ( (charsRead  = rd.read(buffer, 0, BUFFER_SIZE)) != -1) {
  sb.append(buffer, 0, charsRead);
}


 类似资料:
  • 使用KissXML和正则表达式解析虎嗅网的RSS。代码还用了AFNetworking类库。 [Code4App.com]

  • 问题内容: 我是一名iOS开发人员,我尝试构建一个具有自动激活功能的移动应用程序,我发现了不仅仅可以读取短信的方法,而且仅使用私有API会导致Apple拒绝我的应用程序。我有两个问题,不胜感激任何反馈都可以帮助我。 1-有什么方法可以在iOS平台上阅读SMS消息而不会遭到Apple拒绝?2-有人可以向我提供Apple开发人员文档中的相关部分,该部分描述了该部分不允许在iOS平台上读取SMS消息吗?

  • 我有以下类,它从/到包裹读取和写入对象数组: 在上面的代码中,我在读取< code>readParcelableArray时得到一个< code>ClassCastException: 错误/AndroidRuntime(5880):原因:Java . lang . classcastexception:[land roid . OS . parcelable; 上面的代码有什么错误?在编写对象数

  • 我想在入以外的类中的特定位置读取消息。我无法在 方法中找到读取预期内容的方法,该方法从 netty 框架调用。 例如: 如果这是不可能的,我如何将我在方法中获得的结果映射到我在另一个类中进行的特定调用?

  • 我在Android v4中读取APN时遇到问题。2(是读,不是写APN),它抛出了一个安全异常: 没有写入APN设置的权限:用户10068和当前进程都没有android。准许写入APN设置。 以前所有平台上都使用相同的代码,有人知道有什么解决方法吗? 谢谢

  • 我想创建一个独立的scala代码,使用自定义设置在MongoDB网站上使用该代码从MongoDB读取。 当我运行SBT包时,我会遇到一些错误。我猜这与SparkSession的错误创作方法有关。你能给我一个提示来修理它吗? 我的内容 Firstapp.scala代码 以及运行后的错误 编辑1: 我尝试了这个解决方案,但没有正确编译。内容同上。我改变了转换为: 汇编结果如下: 编辑2: 我添加了to