【问题标题】:Search Recursively for a value provided within a set directory递归搜索设置目录中提供的值
【发布时间】:2012-10-04 22:55:26
【问题描述】:

我正在尝试在目录C:\ 中查找当前已硬编码的字符串。在这个C:\ 目录中,我希望在根/和子目录中递归查找输入的字符串(inputString),最后输出包含这些字符串的文件的名称。

我希望以上内容能澄清我最初的问题

我目前有 asses.java

import javax.swing.JFrame;

/* Notes: Event - user clicking button, moving mouse
 *  EventHandler - code that response to users action
 * 
 */

class assess {
    public static void main(String args[]){

        assesshelper assessment1 = new assesshelper();
        assessment1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        assessment1.setSize(500,500); // set size of window
        assessment1.setVisible(true);
    }
}

assesshelper.java

import java.awt.FlowLayout; // orientation of screen
import javax.swing.JFrame; // JFrame all basic windows features (min/maximize), title
import javax.swing.JTextField; // Typing text
import javax.swing.JLabel; // output text / images


public class assesshelper extends JFrame {

    private JLabel item1;

    private JTextField theUrl;

    public assesshelper(){ // anything within assesshelper is within window
        super("Assess"); // title of window
        setLayout(new FlowLayout()); // gives us default label

        //item1
        item1 = new JLabel("Welcome!");
        add(item1); // add item1 to the screen


        String setDir = "C:/";
        JTextField inputString = new JTextField();

        inputString.setText("ENTER DIR TO PROCESS");
        /// BEGIN SEARCHING FOR INPUTTED STRING HERE WITHIN ROOT/SUBDIRECTORIES, OUTPUT FILE NAMES CONTAINING STRING

        add(inputString);

    }

}

如何在setDir设置的目录中递归搜索inputString的值?

(这里是 Java 新手——请保持建设性)

【问题讨论】:

  • 您是在搜索文件名还是文件内容??
  • @MadProgrammer 他的问题很模糊,但看看他的消息来源,有一条评论说output file names containing string
  • 我正在文件内容中搜索 inputString var 中输入的单词
  • 我已经修改了我原来的问题,以便用我所问的具体问题。
  • @CodeTalk 在这种情况下,请参阅我的编辑。

标签: java user-interface search directory


【解决方案1】:

考虑到您是新手,这是一个简单的递归解决方案(但绝不是最有效的):

public static final FileFilter DIRS = new FileFilter() {

  public boolean accept(File file) {
    return file.isDirectory();
  }

};

public static final FileFilter FILES = new FileFilter() {

  public boolean accept(File file) {
    return file.isFile();
  }

}

public void walkTree(File start) throws IOException {

  File[] dirs = start.listFiles(DIRS);
  File[] files = start.listFiles(FILES);

  for (File file : files) {
    if (file.canRead()) {
      if (readAndCheck(file, "string")) {
        // Do Whatever
      }
    }
  }

  for (File dir : dirs) {
    walkTree(dir);
  }

}

public boolean readAndCheck(File file, String string) throws IOException {

  BufferedReader br = null;
  StringBuilder total = new StringBuilder();

  try {

    // If line separators matter in your pattern, consider reading every character
    br = new BufferedReader(new FileReader(file));
    String line;
    while ((line = br.readLine()) != null) {
      total.append(line);
    }

  } finally {
    if (br != null) {
      br.close();
    }
  }

  return total.toString().contains(string);

}

注意:当我在答案框中写下此内容时,可能存在一些语法错误。


另外,您必须在新线程上启动它,最好使用SwingWorker

【讨论】:

    【解决方案2】:

    考虑到LanguagesNamedAfterCofee的回答,你可以相对轻松地阅读文件...

    public void searchFile(File file, String value) throws IOException {
    
        FileReader fr = null;
        BufferedReader br = null;
        try {
    
            fr = new FileReader(file);
            br = new BufferedReader(fr);
    
            int line = 1;
            String text = null;
            while ((text = br.readLine()) != null) {
                if (text.toLowerCase().contains(value.toLowerCase())) {
                    System.out.println("found " + text + " in " + file + " @ [" + line + ":" + text.toLowerCase().indexOf(value.toLowerCase()) + "]");
                }
                line++;
            }
        } finally {
            try {
                fr.close();
            } catch (Exception e) {
            }
            try {
                br.close();
            } catch (Exception e) {
            }
        }
    }
    

    现在这个例子只会读取文本文件(它会读取二进制文件,但用处可商量)并打印出找到值的文件和行。

    理想情况下,您可以将此信息通过某种回调方法、模型或收集信息以供以后使用...

    【讨论】:

    • 请注意,关闭BufferedReader 也会关闭底层FileReader,因此您不必自己显式关闭它。
    • @LanguagesNamedAfterCofee 注意偏执狂(是的,您是对的,但我对任何流都没有做正确的事情感到偏执;))
    • 为什么只能读取文本文件?我可以以某种方式向它添加一个数组,列出扩展名,例如0=>'.jsp' 1=>'.java'2='.php' ...等等?你能告诉我怎么做吗??
    • 它会读取任何文件,但如果你读取二进制文件(例如png),任何搜索结果的含义都是值得怀疑的。您可以查看File#listFiles(FileFilter),了解有关如何过滤目录列表的更多信息
    • 上面的代码什么都可以读取,根据文件内容有多大意义值得商榷。
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 2013-06-17
    • 1970-01-01
    • 2010-12-01
    • 2012-04-07
    • 2011-08-15
    相关资源
    最近更新 更多