0

C:\現在ハードコーディングされているディレクトリ内の文字列を見つけようとしています。このC:\ディレクトリ内で、ルート/およびサブディレクトリ内の入力された文字列(inputString)を再帰的に検索し、最終的にそれらの文字列を含むファイルの名前を出力しようとしています。

上記が私の最初の質問を明確にすることを願っています

私は現在assess.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);

    }

}

inputStringsetDirによって設定されたディレクトリ内のの値を再帰的に検索するにはどうすればよいですか?

(Java-初心者はこちら-建設的にしてください)

4

2 に答える 2

2

あなたが新しいことを考えると、これは単純な再帰的ソリューションです(ただし、決して最も効率的ではありません)。

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を使用して、新しいスレッドでこれを起動する必要があります。

于 2012-10-14T23:52:30.687 に答える
0

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

この例では、テキストファイルのみを読み取り(バイナリファイルを読み取りますが、有用性は交渉可能です)、値が見つかったファイルと行を出力します。

理想的には、この情報をある種のコールバックメソッドを介してクライアントに返したり、後で使用するために情報をモデル化または収集したりできます...

于 2012-10-15T02:18:53.330 に答える