如何解决Stream Closed错误?

时间:2015-02-02 14:54:43

标签: java lucene

我的下面的代码是获取TF-IDF值但我收到错误

Caught a class java.io.IOException with message: Stream Closed

这是我的代码。我试过寻找解决方案来解决它,但我找不到任何解决方案。

static void indexDocs(IndexWriter writer, File file)
    throws IOException {
    // do not try to index files that cannot be read
    if (file.canRead()) {
        if (file.isDirectory()) {
            String[] files = file.list();
            // an IO error could occur
            if (files != null) {
                for (int i = 0; i < files.length; i++) {
                    indexDocs(writer, new File(file, files[i]));
                }
            }
        } 
        else {
            FileInputStream fis; 

            try {                      
                fis = new FileInputStream(file);
            } 
            catch (FileNotFoundException fnfe) {
                return;
            }

            try {
                // make a new, empty document
                Document doc = new Document();

                //Field termV = new LongField("termVector", file.) ;
                Field pathField = new StringField("path", file.getPath(), Field.Store.YES);
                doc.add(pathField);
                Field modifiedField = new LongField("modified", file.lastModified(), Field.Store.NO);
                doc.add(modifiedField);
                Field titleField = new TextField("title", file.getName(), Field.Store.YES);
                doc.add(titleField);
                Field contentsField = new TextField("contents", new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8)));
                doc.add(contentsField);

                contentsField.setBoost((float)0.5);
                titleField.setBoost((float)2.5);

                doc.add(new LongField("modified", file.lastModified(), Field.Store.NO));
                doc.add(new TextField("title", file.getName(), Field.Store.YES));
                doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8))));
               //String Field.setBoost(1.2F);

               //probable error in this line
               if (writer.getConfig().getOpenMode() == OpenMode.CREATE) {
                    // New index, so we just add the document (no old document can be there):
                    System.out.println("adding " + file);
                    writer.addDocument(doc);
                } 
                else {
                    // Existing index (an old copy of this document may have been indexed) so 
                    // we use updateDocument instead to replace the old one matching the exact 
                    // path, if present:
                    System.out.println("updating " + file);
                    writer.updateDocument(new Term("path", file.getPath()), doc);
                }
            } 

            //Initially I thought fis.close() caused the error.
            finally 
            {
                fis.close();
            }
        }
    }
}
}

1 个答案:

答案 0 :(得分:0)

您正在重复使用相同的流(fis)两次。

Field contentsField = new TextField("contents", new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8)));
doc.add(contentsField);

//...

doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8))));

即使没有例外,你真的不想添加这两次。你正在复制内容。您的“标题”和“修改”字段也是如此。只需要添加一次。