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();
}
text = text.replaceAll("\t", "");
text = text.replaceAll("(\r?\n(\\s*\r?\n)+)", "\r\n");  

return text;
}我在循环读取HTML文件中的文本内容时 大概到1000+个文件以后
每个HTML文件大小是1M
parser.visitAllNodesWith(visitor);这行会内存溢出
不知道大家有碰到没? 或者给点解决的思路吧?
TOMCAT的内存已经一个G啦
或者谁有htmlparser提取文本内容更好的方法 希望不吝指教  谢谢

解决方案 »

  1.   

    能否复用 HtmlPage对象呢?
      

  2.   

    应该不行吧 
    每次解析的HTML是不同的文件
      

  3.   


            for (int i = 0; i < size; i++) {
                Node node = nodes.elementAt(i);
                text += node.toPlainTextString();
            }
            text = text.replaceAll("\t", "");
            text = text.replaceAll("(\r?\n(\\s*\r?\n)+)", "\r\n");  
            
            return text;应该是以上的语句造成的溢出,楼主应该先判断是循环造成的溢出,还是replace造成的溢出。
    怀疑极有可能是循环造成的溢出。楼主改用stringbuffer或者stringbuilder试试。
    如果还不行,那么还是分成几个小循环,一部分一部分操作才好。
      

  4.   


    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)以上是溢出时的异常
    stringbuffer或者stringbuilder 已经试过了 没有什么关系···
      

  5.   


       at org.htmlparser.Parser.visitAllNodesWith(Parser.java:726)
    竟然是它溢出,你的html页面有多大?
      

  6.   

    前面说了 每个页面大小1M
    我用Lucene写的代码 跑10W个文件都没事
    改成solr 1K个以后 就越来越慢 最后 OUT了···
      

  7.   

    看来只能把jvm干到512M以上,或者直接上jrokit吧。