0

Lucene を使用して XML ファイルのインデックスを作成しています。ファイルは入力ディレクトリに入ってきて、インデックスが作成され、出力ディレクトリに移動されます。

場合によっては正常に動作し、いくつかのファイルでは失敗しています。

Windowsコマンドプロンプトを使用してファイルを更新しようとすると、ファイルが既に使用されていると表示され、Javaプロセスがまだファイルに接続されていることがわかります。

インデックス作成後に Lucene Java プロセスがファイルから離れていることを確認するのを手伝ってくれる人はいますか?

これが私が試しているコードです

        int originalNumDocs = writer.numDocs();

        for (File f : queue) {
            FileReader fr = null;
            try {
                Document doc = new Document();              
                //===================================================
                // add contents of file
                //===================================================
                fr = new FileReader(f);
                doc.add(new TextField("contents", fr));

                String targetFileStr = IOUtils.toString(new FileInputStream(f), "UTF-8");
                doc.add(new StringField("xmlContent", targetFileStr, Field.Store.YES));

                doc.add(new StringField("path", f.getPath(), Field.Store.YES));
                doc.add(new StringField("filename", f.getName(), Field.Store.YES));

                writer.addDocument(doc);
                System.out.println("Added: " + f);                              
            } catch (Exception e) {
                System.out.println("Could not add: " + f);
                e.printStackTrace();
            } finally {
                fr.close();

                File afile = f;
                if(afile.renameTo(new File("C:/Personal/Logging/OutputDir/" + afile.getName()))){
                    System.out.println("File is moved successful!");
                }else{
                    System.out.println("File is failed to move!");
                }
            }
        }

        int newNumDocs = writer.numDocs();
        System.out.println("");
        System.out.println("************************");
        System.out.println((newNumDocs - originalNumDocs) + " documents added.");
        System.out.println("************************");
        writer.commit();
        queue.clear();

このコードを 30 秒ごとに呼び出しています。Tomcatで実行しています。

4

1 に答える 1

0

次の行でできますかFileInputStream

String targetFileStr = IOUtils.toString(new FileInputStream(f), "UTF-8");

開いたままですか?おそらく、次のように変更してみてください。

FileInputStream fileStream = new FileInputStream(f);
String targetFileStr = IOUtils.toString(fileStream, "UTF-8");

fileStream.close()あなたのfinallyブロックを呼び出します。

于 2013-10-09T09:27:08.587 に答える