0

私は次のものを持っています:

  1. 「AllFilesFolder」という名前の多くのファイル(約300000)を含むフォルダー
  2. 「namesList」という名前の名前のリスト
  3. 「filteredFolder」という名前の空のフォルダ

リスト内の名前のいずれかを継続するファイルを空のフォルダー「filteredFolder」に移動して、フォルダー「AllFilesFolder」をフィルター処理したいと思います。

私は次のコードでこの問題に取り組んでいます:

public static void doIt(List<String>namesList, String AllFilesFolder, String filteredFolder) throws FileNotFoundException {

    // here we put all the files in the original folder in List variable name "filesList"
    File[] filesList = new File(AllFilesFolder).listFiles();


    // went throught the files one by one 
    for (File f : filesList) {

        try {

            FileReader fr = new FileReader(f);
            BufferedReader reader = new BufferedReader(fr);
            String line = "";
            //this varibale used to test withir the files contins names or not 
            //we set it to false.
            boolean goodDoc = false;
            //go through the file line by line to chick the names (I wounder if there are a simbler whay)
            while ((line = reader.readLine()) != null) {
                for(String name:namesList){
                if ( line.contains(name)) {
                    goodDoc = true;
                }
                }
            }
            reader.close();

            // if this file contains the name we put this file into the other folder "filteredFolder"
            if (goodDoc) {
                InputStream inputStream = new FileInputStream(f);
                OutputStream out = new FileOutputStream(new File(filteredFolder + f.getName()));
                int read = 0;
                byte[] bytes = new byte[4096];
                while ((read = inputStream.read(bytes)) != -1) {
                    out.write(bytes, 0, read);
                }
                inputStream.close();
                out.flush();
                out.close();
            }
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}

これを行うことにより、解決するためにあなたのアドバイスが必要な2つの問題があります。

  1. 私は各ファイルを2回読み取っています。1回は検索用で、もう1回は別のフォルダーに配置するためです。

  2. namesListを検索するとき、名前を1つずつ取得するforループがあります。リストを1回検索する方法はありますか(ループなし)。

よろしくお願いします

4

1 に答える 1

0

私は各ファイルを2回読み取っています。1回は検索用で、もう1回は別のフォルダーに配置するためです。

NIOを使用すると、コピーのパフォーマンスが向上します。これがコード例です。Java 7を使用できる場合は、Files.copy()を使用できます。

namesListを検索するとき、名前を1つずつ取得するforループがあります。リストを1回検索する方法はありますか(ループなし)。

HashSet名前を保存し、メソッドを使用するために使用しますcontains()。これはO(1)操作です。または、Scanner.findWithinHorizo​​n(pattern、horizo​​n)を使用することをお勧めします。

于 2012-08-05T00:58:07.320 に答える