在JAVA中搜索文本文件中的名称列表

时间:2012-08-05 00:38:54

标签: java list search full-text-search directory

我有以下内容:

  1. 包含许多文件(约300000)的文件夹,名为“AllFilesFolder”
  2. 名称列表,名为“namesList”
  3. 一个名为“filteredFolder”的空文件夹
  4. 我想过滤文件夹“AllFilesFolder”,将任何包含列表中任何名称的文件移动到空文件夹“filteredFolder”。

    我通过以下代码解决了这个问题:

    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);
            }
        }
    }
    

    通过这样做,我有两个问题,我需要你的建议来解决:

    1. 我正在阅读每个文件两次,一次搜索,另一次将其放入另一个文件夹。

    2. 在搜索namesList时,我有for循环来逐个获取名称,有没有办法一次搜索列表(没有循环)。

    3. 非常感谢提前

1 个答案:

答案 0 :(得分:0)

我正在阅读每个文件两次,一次搜索,另一次将其放入另一个文件夹。

使用NIO可提高复制性能。这是code example.如果您可以使用Java 7,那么您可以使用Files.copy()

在搜索namesList时我有for循环来逐个获取名称,有没有办法一次搜索列表(没有循环)。

使用HashSet存储名称并使用contains()方法。这是 O(1)操作。或者另一个建议是使用Scanner.findWithinHorizon(pattern, horizon)