1

必要に応じて、新しく追加されたファイルのリストをディレクトリに返すJavaプログラムが必要です。私の新しいファイルの定義は、ディレクトリの最後のチェック/スキャンでは存在しなかったものです。

JNotifyやJavaディレクトリ監視サービスhttp://docs.oracle.com/javase/tutorial/essential/io/notification.htmlなどのライブラリがあることは知っています。ただし、私の理解では、これらのライブラリは、ディレクトリを監視し、ファイルイベント(追加、削除、削除など)が発生するとすぐに通知するリスナーを実装します。しかし、私が必要としているのは、オンデマンドで新しく追加されたファイルのリストをディレクトリに返すメソッドです。

4

5 に答える 5

1

これは、呼び出し元で最後の要求のタイムスタンプを維持することで簡単に実現できます。次に、そのタイムスタンプの後に作成されたファイルのディレクトリをスキャンする Java クラスにそのタイムスタンプを渡します。

何かのようなもの:

public List<File> getNewFiles(Date lastRequestedDate)
{
//Iterate the directory for files newer than the date passed in as parameter
}
于 2013-03-18T11:19:35.577 に答える
1

さまざまなアプローチがあります。

アプローチ 1: ファイルの作成日

すべてのファイルを一覧表示し、各ファイルの作成タイムスタンプを確認することができます。このトピックについては、すでに深い議論があります。タイムスタンプが、ディレクトリを最後にチェックしたときに保存したタイムスタンプよりも大きいかどうかを確認してください。

アプローチ 2: ファイルのリストを作成して維持する

メモリと時間に余裕がある場合は、ディレクトリにファイルのリストを作成します。ディレクトリを反復処理し、まだリストにないすべてのファイルを別のリストに追加します。必要なことは何でもして、メイン リストに追加してください。

また、ファイルのチェックと作業が成功するたびに、メイン リストをシリアル化し、ディスクに保存する必要があります。

于 2013-03-18T11:19:49.263 に答える
0

Javaディレクトリ監視サービスを利用することをお勧めします。ウォッチサービスを実装するのはかなり速いはずです。バックグラウンドで実行します。addイベントが発生したときにremove、イベントをキューに入れ続けますdelete。オンデマンドAPIで追加されたファイルのリストが必要な場合は、次の手順を実行するだけです。

  • これまでにキューに入れられたすべてのイベントをポーリングします
  • addそれらを繰り返し、イベントタイプを探し、返されるリストを作成します
  • ポーリングしたイベントをクリアして、次のポーリングに表示されないようにします(resetこれを行うためのAPIがあります)

このアプローチの利点は次のとおりです。

  1. 問題が少ない:ディレクトリをスキャンして、追加されているファイルを追跡する必要があります。Javaがあなたに代わってそれを行うので、その部分にバグはありません。
  2. メモリ消費量の削減:タイムスタンプアプローチでは、最後のスキャン以降に変更されたファイルを取得するため、追加されたファイルを識別するために、遭遇したすべてのファイルのリストを保持する必要があります。しかし、ディレクトリ監視サービスでは、そのようなデータ構造を維持する必要があります。
  3. パフォーマンスの向上:オンデマンドメソッドの実行中は、ディレクトリリストやファイル名の比較は実行されません。すでにキューに入れられているイベントを繰り返し処理して、戻り値を作成します。
于 2013-03-20T16:31:28.643 に答える
0

ファイル名のリストを維持し、それに対して新しいファイルをチェックできます

于 2013-03-18T11:16:47.900 に答える
0

ファイルポインタを別々のファイルに保持できます..そして、新しい/古いファイルが必要になるたびに、以下のメソッドに渡すことができます.

package test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;

import org.apache.commons.io.comparator.LastModifiedFileComparator;
import org.apache.commons.io.filefilter.AgeFileFilter;

public class AgeFileFilterTest {

    public static void main(String[] args) throws IOException {
    String directoryPath = "/home/vikas";
    String fileName = "fileName";
    File directory = new File(directoryPath);


    File[] files = directory.listFiles();
    System.out.println("\nBefore ");
    displayFiles(directory, new AgeFileFilter(new File(directoryPath+FileName) , true));
    System.out.println("\nAfter " );
    displayFiles(directory, new AgeFileFilter(new File(directoryPath+FileName),false));

}

public static void displayFiles(File directory, FileFilter fileFilter) {
    File[] files = directory.listFiles(fileFilter);
    Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
    for (File file : files) {
        Date lastMod = new Date(file.lastModified());
        System.out.println("File: " + file.getName() + ", Date: " + lastMod + "");
    }
}

}

于 2014-06-11T09:23:34.340 に答える