【问题标题】:Search files by text content inside按里面的文本内容搜索文件
【发布时间】:2012-12-01 06:58:54
【问题描述】:

我想创建一个程序来查找所选目录(例如:“C:/”)中包含特定单词的所有文本文件。

我想说:例如,我在“C:/”中有三个文本文件,里面有文本。

1.txt Hello world this is test

2.txtGoodbye bla bla bla

3.txtHello my name is John

如果我输入单词“Hello”,程序必须找到 1.txt 和 3.txt

你有什么可以推荐给我的吗?什么命令可以在这里帮助我?谢谢你的回答。

更新: 现在我只有选择目录的代码:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;


public class SelectDirectory extends JPanel implements ActionListener {
    JButton go;

    JFileChooser chooser;
    String choosertitle;

    public SelectDirectory() {
        go = new JButton("Select directory: ");
        go.addActionListener(this);
        add(go);
    }

    public void actionPerformed(ActionEvent e) {
        chooser = new JFileChooser(); 
        chooser.setCurrentDirectory(new java.io.File("."));
        chooser.setDialogTitle(choosertitle);
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setAcceptAllFileFilterUsed(true);

        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { 
            System.out.println("getCurrentDirectory(): " + 
                                chooser.getCurrentDirectory());
            System.out.println("getSelectedFile() : " +  chooser.getSelectedFile());
            //
            //
            //
            searchFiles(); // error here, I dont know really how to use this method
            //
            //
            //
        } 
        else {
            System.out.println("No Selection ");
        }
    }

    public Dimension getPreferredSize(){
        return new Dimension(200, 200);
    }

    public static void main(String s[]) {
        JFrame frame = new JFrame("");
        SelectDirectory panel = new SelectDirectory();
        frame.addWindowListener(
            new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            }
        );
        frame.getContentPane().add(panel,"Center");
        frame.setSize(panel.getPreferredSize());
        frame.setVisible(true);
    }

    private ArrayList<String> searchFiles(File file, String pattern, 
                        ArrayList<String> result) throws FileNotFoundException {

        if (!file.isDirectory()) {
            throw new IllegalArgumentException("file has to be a directory");
        }

        if (result == null) {
            result = new ArrayList<String>();
        }

        File[] files = file.listFiles();

        if (files != null) {
            for (File currentFile : files) {
                if (currentFile.isDirectory()) {
                    searchFiles(currentFile, pattern, result);
                } else {
                    Scanner scanner = new Scanner(currentFile);
                    if (scanner.findWithinHorizon(pattern, 0) != null) {
                        result.add(currentFile.getName());
                    }
                    scanner.close();
                }
            }
        }
        return result;
    }
}

【问题讨论】:

  • 用代码更新了我的答案。

标签: java file search find word


【解决方案1】:

这是 java 8 中的一个示例,流不是递归的

try( Stream<Path> walk = Files.walk( Paths.get( SRC ) ) ) {
        final String regex = "someregex";
        List<String> filesContainingRegex = walk.filter( path -> !Files.isDirectory( path ) ).flatMap( path -> {
            try {
                File file = path.toFile();
                Scanner scanner = new Scanner( file );
                if( scanner.findWithinHorizon( regex, 0 ) != null ) {
                    scanner.close();
                    return Stream.of( path.getFileName().toString() );
                }
                scanner.close();
            } catch( FileNotFoundException fnfe ) {
                System.out.println( fnfe.getMessage();
            }
            return Stream.empty();
        } ).collect( Collectors.toList() );
    }

【讨论】:

    【解决方案2】:

    遍历文件

    如果您使用的是 Java7,请使用 Files.walkFileTree(args) 遍历树:doc

    如果您使用的 Java 版本低于 7,只需递归使用 File.listFiles()

    在文件中查找

    使用 Scanner.findWithinHorizo​​n(String pattern, int horizo​​n) 找到您想要的任何正则表达式: doc

    下面是一个例子:

    private List<String> searchFiles(File file, String pattern, List<String> result) throws FileNotFoundException {
    
        if (!file.isDirectory()) {
            throw new IllegalArgumentException("file has to be a directory");
        }
    
        if (result == null) {
            result = new ArrayList<String>();
        }
    
        File[] files = file.listFiles();
    
        if (files != null) {
            for (File currentFile : files) {
                if (currentFile.isDirectory()) {
                    searchFiles(currentFile, pattern, result);
                } else {
                    Scanner scanner = new Scanner(currentFile);
                    if (scanner.findWithinHorizon(pattern, 0) != null) {
                        result.add(currentFile.getName());
                    }
                    scanner.close();
                }
            }
        }
        return result;
    }
    

    您可以像这样在代码中使用该方法:

     File folder = selectedFile.isDirectory() ? selectedFile : currentDirectory;
     ArrayList<String> files = new ArrayList<String>();
     try {
        files = searchFiles(folder, "Hello", files);
     } catch (FileNotFoundException e1) {
        // you should tell the user here that something went wrong
     }
     // 'files' now contains the resulting file names 
    

    【讨论】:

    • 我是java新手,你能帮我看看这些方法吗?谢谢
    • 我在你的帮助下更新了我的代码,但我不知道如何正确使用这个方法,我用现在的代码更新了我的帖子。
    • 该方法采用用户选择的目录、正则表达式模式(您的搜索词)和一个列表来存储和返回结果。返回的列表包含它找到的文件名。
    • 现在我的代码必须怎么看?我添加之前添加的方法 wearg 没用?
    • 您更新的代码甚至无法编译。我建议您花时间解决该问题,而不是让我们发布您需要的完整代码。你不会学到任何东西。我给你的代码应该足以得到你想要的结果。
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 2017-12-21
    • 2021-06-07
    • 2014-07-11
    • 2012-03-10
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多