0

Lucene を使用してドキュメントのインデックスを作成しようとしています...しかし、StreamClosed 例外が発生します..

LuceneよりもJavaに関連していると思います....

誰かがガイドしてください..コードスニペットは次のとおりです。

 static void indexDocs(File file,boolean flag,Directory dir,IndexWriterConfig iwc)
  throws IOException {
  // do not try to index files that cannot be read

      FileInputStream fis = null;
 if (file.canRead()) {

    if (file.isDirectory()) 
    {

     String[] files = file.list();
     System.out.println("list "  + files.length);
      if (files != null) {
        for (int i = 0; i < files.length; i++) {
            System.out.println("Invoked for  "  +  i  +  "and  "  +   files[i]);            
          indexDocs(new File(file, files[i]),flag,dir,iwc);
        }
      }
   } 
    else {

        boolean flags=true;

      try {
        fis = new FileInputStream(file);

     } catch (FileNotFoundException fnfe) {

       fnfe.printStackTrace();
     }
      try {
          Document doc = new Document();         

          LineNumberReader lnr=new LineNumberReader(new FileReader(file));

          Field pathField = new StringField("path", file.getPath(), Field.Store.YES);
          doc.add(pathField);


          String line=null;
          int i=0;      

          doc.add(new StringField("TT",file.getName(),Field.Store.YES)); 

          BufferedReader br=new BufferedReader(new InputStreamReader(fis));

           doc.add(new TextField("DD", br));

           System.out.println("Looping Again");

          while(flags)
          {                      
              IndexWriter iwcTemp1=new IndexWriter(dir,iwc);

          while( null != (line = lnr.readLine()) ){  

            i++;   

          StringField sf=new StringField("EEE",line.trim(),Field.Store.YES);
            doc.add(sf);

            if(i%10000==0)
            {      
                System.out.println("Breaking   " +  i);
                lnr.mark(i);
                break;
            }               
            sf=null;
          }        
          if(line==null)
          {
              System.out.println("FALSE "   );
              flags=false;
          }               

          System.out.println("FILE NAME IS FTP "  +   file.getName());


          if (iwcTemp1.getConfig().getOpenMode() == OpenMode.CREATE_OR_APPEND) {

              try
              {               
                iwcTemp1.addDocument(doc);
                iwcTemp1.commit();                                      
                iwcTemp1.close();

              }catch(Throwable t)
              {
                  lnr.close();
                    br.close();
                    fis.close(); 
                  t.printStackTrace();
              }

          } else {
              try
              {

            System.out.println("updating " + file);
            iwcTemp1.updateDocument(new Term("path", file.getPath()), doc);
              }catch(Exception e)
              {
                  e.printStackTrace();
              }
          }        
          System.out.println("END OF WHILE");
          lnr.reset();
          }//end of While 
      }catch (Exception e) {
         e.printStackTrace();
      }finally {
       fis.close();
      }
    }
  }
}

私が取得している例外は、Document を Writer に追加している行にあります... 例外トレース:

java.io.IOException: Stream closed
        at java.io.BufferedReader.ensureOpen(BufferedReader.java:114)
        at java.io.BufferedReader.read(BufferedReader.java:270)
        at org.apache.lucene.analysis.standard.StandardTokenizerImpl.zzRefill(StandardTokenizerImpl.java:923)
        at org.apache.lucene.analysis.standard.StandardTokenizerImpl.getNextToken(StandardTokenizerImpl.java:1133)
        at org.apache.lucene.analysis.standard.StandardTokenizer.incrementToken(StandardTokenizer.java:171)
        at org.apache.lucene.analysis.standard.StandardFilter.incrementToken(StandardFilter.java:49)
        at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:102)
        at org.apache.lucene.index.DocFieldProcessor.processDocument(DocFieldProcessor.java:245)
        at org.apache.lucene.index.DocumentsWriterPerThread.updateDocument(DocumentsWriterPerThread.java:265)
        at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:432)
        at org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:1513)
        at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1188)
        at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1169)
        at com.rancore.MainClass2.indexDocs(MainClass2.java:236)

誰かが案内してくれませんか...どこが間違っているのですか...親切に案内してください...

4

1 に答える 1

0

例外処理の構造が正しくありません。new FileInputStream() が例外をスローした場合、読み取りコードを続行することはできません。

于 2013-09-01T10:24:10.607 に答える