public static String getDocument(File html) { String htmlPath = html.getAbsolutePath(); String text = ""; Parser parser = null; try { parser = new Parser(htmlPath); } catch (ParserException e) { e.printStackTrace(); } try { parser.setEncoding("UTF-8"); // parser.setEncoding("gbk"); } catch (ParserException e) { e.printStackTrace(); } HtmlPage visitor = new HtmlPage(parser); try { parser.visitAllNodesWith(visitor); } catch (ParserException e) { e.printStackTrace(); } NodeList nodes = visitor.getBody(); int size = nodes.size(); for (int i = 0; i < size; i++) { Node node = nodes.elementAt(i); text += node.toPlainTextString(); } return text; }我在循环读取HTML文件中的文本内容时 大概到1000+个文件以后
完整异常信息如下:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at org.htmlparser.lexer.Stream.fill(Stream.java:162) at org.htmlparser.lexer.Stream.read(Stream.java:266) at java.io.InputStream.read(InputStream.java:163) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at org.htmlparser.lexer.InputStreamSource.fill(InputStreamSource.java:345) at org.htmlparser.lexer.InputStreamSource.read(InputStreamSource.java:395) at org.htmlparser.lexer.Page.getCharacter(Page.java:704) at org.htmlparser.lexer.Lexer.parseTag(Lexer.java:1009) at org.htmlparser.lexer.Lexer.nextNode(Lexer.java:368) at org.htmlparser.scanners.CompositeTagScanner.scan(CompositeTagScanner.java:110) at org.htmlparser.util.IteratorImpl.nextNode(IteratorImpl.java:91) at org.htmlparser.Parser.visitAllNodesWith(Parser.java:726) at ch2.lucenedemo.lucene29.SolrjClient8080.getDocument(SolrjClient8080.java:323) at ch2.lucenedemo.lucene29.SolrjClient8080.createIndex(SolrjClient8080.java:243) at ch2.lucenedemo.lucene29.SolrjClient8080.main(SolrjClient8080.java:139)######
我认为可能的解决方案有:
第一、
不用String,改为用StringBuffer试试。
第二、
调大Java VM的内存,不过当读取的内容增大到一定程度还会发生同样的问题。
第三、
可以采用分段读取或者读一段存一段(比如存到硬盘中),有点类似操作系统中的缓存(缓存大小有限度,当满了则全部写入,再读)。
不知道能否解决你的问题~
######别用这东西了,用jsoup吧,简单方便
######谢谢2位的回答
我都试试
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。