2015. 1. 20. 12:05
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

FileReader는 파일로부터 문자를 읽을 때 편리하게 사용되는 클래스이다. 이 클래스는 InputSreamReader의 서브 클래스이며 클래스의 생성자에서는 InputSreamReader의 InputStreamReader(InputSream)생성자를 호출한다. 이 클래스의 인스턴스에서는 다음 코드와 같은 작업을 수행한다.


FileInputStream fis=new FileInputSream(pathname);

InputStreamReader isr;

isr=new InputSteamReader(fis, System.getProperty("file.encoding"));



특정 문자열을 포함하고 있는 파일 찾기


package FileReader;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

class FindAll {
    public static void main(String[] args){
        if(args.length!=2){
            System.err.println("usage: java FindAll start search-string");
            return;
        }
        if(!findAll(new File(args[0]),args[1]))
            System.err.println("not a directory");
       
    }
   
    static boolean findAll(File file, String srchText){
        File[] files=file.listFiles();
        if(files==null)
            return false;
       
        for(int i=0;i<file.length();i++)
            if(files[i].isDirectory())
                findAll(files[i], srchText);
            else
                if(find(files[i].getPath(), srchText))
                    System.out.println(files[i].getPath());
           
        return true;
        }
       
       
    static boolean find(String filename, String srchText){
       
        try(BufferedReader br=new BufferedReader(new FileReader(filename))) {
            int ch;
            outer_loop:
            do{
                if((ch=br.read())==-1)
                    return false;
                if(ch==srchText.charAt(0)){
                    for(int i=1;i<srchText.length();i++){
                        if((ch=br.read())==-1)
                            return false;
                        if(ch!=srchText.charAt(i))
                            continue outer_loop;
                    }
                    return true;
                }
            }
            while(true);
           
        } catch (IOException ioe) {
                System.err.println("I/O error: "+ioe.getMessage());
        }
        return false;
    }
}
   
   
=========


FIndAll()클래스에서는 main(), findAll(), find() 클래스 메소드를 선언하고 있다.


main()에서는 두 개의 커맨드 라인 인자가 전달되었는지 확인하는데 첫 번째 인자에는 검색할 파일 시스템의 시작 위치를 지정하며 이 인자는 File 객체의 생성자에서 사용된다. 두 번째 인자는 검색할 텍스트가 지정되며 이 문자열이 포함된 파일들을 찾기 위해 File객체와 함께 findAll() 메소드로 전달된다.


재뒤 호출을 하는 findAll()메소드에서는 제일 먼저 File객체의 listFiles()메소드를 호출하여 현재 디렉터리에 있는 모든 파일들의 이름을 획득한다. 만일 listFiles() 메소드가 null을 반환하면 File 객체가 디렉터리를 참조하지 않는다는 의미이므로 findAll()은 false를 반환하고 적절한 에러 메시지를 출력한다.


리스트에서 반환되는 각각의 이름을 확인해서 반환된 이름이 디렉터리면 findAll()을 재귀호출하고 파일이면 지정한 문자열이 파일에 포함되어 있는지 확인하기 위해 BufferedReader 생성자에 전달하여 BufferedReader 인스턴스를 생성한다. 다음, 반복문을 통해 파일의 처음부터 파일의 끝에 도달할 때까지 문자들을 읽어들인다.


만일 현재 읽은 문자와 검색 텍스트의 첫번째 문자가 같으면 내부에 있는 반복문에서 나머지 문자들을 비교한다. 문자들이 일치하면 find() 메소드는 true를 반환하고 아니면 outer_loop 레이블로 이동하여 외부 반복문에서 다음 문자들의 비교를 시작한다. 마지막 문자를 읽을 때까지 일치하는 문자가 없으면 find()메소드는 false를 반환한다.















'Java' 카테고리의 다른 글

Scanner  (0) 2015.01.20
ObjectInputStream / ObjectOutputStream  (0) 2015.01.20
PrintWriter  (0) 2015.01.20
new ByteArrayInputStream(byte[] buf)  (0) 2015.01.17
BufferedWriter : flush()  (0) 2015.01.17
Posted by af334