【问题标题】:Java - ParserDelegator throws exception when input is bigJava - ParserDelegator 在输入很大时抛出异常
【发布时间】:2013-09-10 02:20:17
【问题描述】:
//Parse an HTML file into text while preserving carriage returns

StringBuffer temp = new StringBuffer(html);    
final StringBuffer sb = new StringBuffer();//this will be my output
    HTMLEditorKit.ParserCallback parserCallback = new 
                                    HTMLEditorKit.ParserCallback() {
        public boolean readyForNewline;
        @Override
        public void handleText(final char[] data, final int pos) {
            String s = new String(data);
            sb.append(s.trim() + " ");
            readyForNewline = true;
        }
        @Override
        public void handleStartTag(final HTML.Tag t, 
                                  final MutableAttributeSet a, 
                                  final int pos) {
            if (readyForNewline && 
                              (t == HTML.Tag.DIV || t == HTML.Tag.BR || 
                               t == HTML.Tag.P || t == HTML.Tag.TR)) {
                sb.append("\n");
                readyForNewline = false;
            }
        }
        @Override
        public void handleSimpleTag(final HTML.Tag t, 
                                            final MutableAttributeSet a, 
                                            final int pos) {
            handleStartTag(t, a, pos);
        }
    };
try {
    new ParserDelegator().parse(new StringReader(temp.toString()),
                parserCallback, false);
} catch (IOException e) {
    return null;
}

此代码在小型 html 文件上运行良好,但当我尝试解析已转换为字符串的 ~4MB HTML 文件时,它会引发 IOException,我不知道为什么?就在那个 try 循环中,我花了一段时间才找到它,因为控制台没有打印错误。

基本上,这段代码旨在获取 HTML 文件并去除标签,同时保留行距。我在 SO 上找到了这段代码并借用了它,替代解决方案也很好,但在 JSoup 和许多其他解决方案中,这是唯一能实现我想要的(无论如何在小文件上)。当文件太大时,这段代码有什么理由会抛出 IOException 吗?解决方法?

非常感谢!

编辑:这是堆栈

javax.swing.text.ChangedCharSetException
    at javax.swing.text.html.parser.DocumentParser.handleEmptyTag(Unknown Source)
    at javax.swing.text.html.parser.Parser.startTag(Unknown Source)
    at javax.swing.text.html.parser.Parser.parseTag(Unknown Source)
    at javax.swing.text.html.parser.Parser.parseContent(Unknown Source)
    at javax.swing.text.html.parser.Parser.parse(Unknown Source)
    at javax.swing.text.html.parser.DocumentParser.parse(Unknown Source)
    at javax.swing.text.html.parser.ParserDelegator.parse(Unknown Source)
    at org.SmartTable.SmartTable.htmlToText(SmartTable.java:293)
    at org.SmartTable.SmartTable.<init>(SmartTable.java:35)

【问题讨论】:

  • 可以贴一下异常的堆栈吗?
  • 我刚刚编辑到主帖中
  • 解决方案:新 ParserDelegator().parse(new StringReader(temp.toString()), parserCallback, true); // 将最后一个 "false" 更改为 true 以忽略字符集

标签: java html-parsing jsoup htmleditorkit


【解决方案1】:

new ParserDelegator().parse(new StringReader(temp.toString()), parserCallback, true);

//将最后一个“false”改为true以忽略字符集

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多