使用Java在目录中递归搜索文本文件?

5
我需要在目录及其子目录中搜索文本,有什么聪明的想法吗?
5个回答

19

使用Apache commons-ioorg.apache.commons.io.FileUtils.iterateFiles()方法。

根据javadoc:

允许迭代给定目录中(及其子目录,可选)与扩展名数组匹配的文件。

例如:

Iterator iter =  FileUtils.iterateFiles(directory, 
    new String[]{"txt","java"}, true);

while(iter.hasNext()) {
    File file = (File) iter.next();
    searchInFile(file);
}

5
Runtime.getRuntime().exec("grep", "-r", <searchText>);

+1,但应该是new String[]{"-r"}的好例子。 - Alex Ivasyuv

4

这是我的解决方案。它在Java项目目录中搜索“searchingText”字符串。希望能对某些人有所帮助。

package textSearch;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.sql.Connection;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import java.util.Scanner;

    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.filefilter.DirectoryFileFilter;
    import org.apache.commons.io.filefilter.RegexFileFilter;
    import org.apache.commons.io.filefilter.TrueFileFilter;


    public class TextSearchingInFilesInDirectory {

        private static String filePath ="";
        static int fileCount = 0;   
        static String fileName ;
        static int lineNumber=0;

        private static final String folderPath = "C:\\Users\\omertasci\\EclipseWorkspace\\AnyProjectName\\src";

        public static void main(String[] args) throws FileNotFoundException{

        File dir = new File(folderPath);
        List<File> files =(List<File>) FileUtils.listFiles( dir, TrueFileFilter.INSTANCE, DirectoryFileFilter.DIRECTORY);

        for (File file : files) {
            try {
                System.out.println(file.getCanonicalPath()+ " is scanned.");
                filePath=file.getCanonicalPath();

                if (file.isFile()) {
                    //System.out.println(file.getName());
                    fileName=file.getName();
                    try {
                        FileReader reader = new FileReader(filePath );
                        BufferedReader br = new BufferedReader(reader); 
                        String s; 
                        while((s = br.readLine()) != null) { 
                            lineNumber++;
                            if(s.contains("searchingText")){  // you can change searchText with any keyword .
                                    System.out.println("searchingText is found in "+ file.getName()+ " at "+lineNumber+". line.\n"+ "----"+s.trim()+ "----");
                                                    }                           
                        } 
                        reader.close(); 
                    }
                    catch(Exception e){
                        e.printStackTrace();
                    }
                    }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
}

}


4

尝试使用递归方法编写类似以下代码的程序:

public class Searcher {

    private String toFind, toReplace;
    // whatever other info you need

    public void searchInTextFiles(File dir) {
        File[] a = dir.list();
        for (File f : a) {
            if (f.isDirectory()) {
                searchInTextFiles(f);
            } else if (f.name().endsWith(".txt")) {
                searchInFile(f);
            }
        }
    }

    private void searchInFile(File f) {
        // do whatever you need to do on f using fields from this class
    }
}

0

//编辑,你必须定义 CheckFile 函数...

void Found(String dir,Vector flist){
File srchdir(dir);
File[] listf=listFiles();
    for(int i=0;i<srchdir.listf.length;i++){
        if(listf[i].isDirectory()){ Found(dir+"/"+listf[i].getName(),flist); 
        }else{ if(CheckFile(listf[i])) flist.add(dir+"/"+listf[i].getName()); }
    }
}


Vector Found(String dir){
File srchdir(dir);
Vector flist=new Vector();
File[] listf=listFiles();
    for(int i=0;i<srchdir.listf.length;i++){
        if(listf[i].isDirectory()){ Found(dir+"/"+listf[i].getName(),flist); 
        }else{ if(CheckFile(listf[i])) flist.add(dir+"/"+listf[i].getName()); }
    } 
    return flist;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接