자바/입출력 IO

표준 입출력과 File: File(2)

백_곰 2022. 4. 28. 10:28

1-3. File을 이해하기 위한 예제(3)

: 1-2 예제(2)에서 했던 코드에 추가로 서브 디렉토리의 파일과 디렉토리까지 보여주는 예제이다.

 

package File;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;

public class Exercise003 {
	static int totalFiles = 0;
	static int totalDirs = 0;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String input = sc.nextLine();
		
		if(input == null) {
			System.out.println("USAGE : java FileEx3 DIRECTORY");
			System.exit(0);
		}

		File dir = new File(input);

		if(!dir.exists() || !dir.isDirectory()) {
			System.out.println("유효하지 않은 디렉토리입니다.");
			System.exit(0);
		} 

		printFileList(dir);

		System.out.println();
		System.out.println("총 " + totalFiles + "개의 파일");
		System.out.println("총 " + totalDirs + "개의 디렉토리");
	} // main

	public static void printFileList(File dir) {
		System.out.println(dir.getAbsolutePath()+" 디렉토리");
		File[] files = dir.listFiles();

		ArrayList subDir = new ArrayList();

		for(int i=0; i < files.length; i++) {
			String filename = files[i].getName();

			if(files[i].isDirectory()) {
				filename = "[" + filename + "]";
				subDir.add(i+"");
			}
			System.out.println(filename);
		}

		int dirNum  = subDir.size();
		int fileNum = files.length - dirNum;

		totalFiles += fileNum;
		totalDirs  += dirNum;

		System.out.println(fileNum + "개의 파일, " + dirNum + "개의 디렉토리");
		System.out.println();

		for(int i=0; i < subDir.size(); i++) {
			int index = Integer.parseInt((String)subDir.get(i));
			printFileList(files[index]);
		}
	} // printFileList
}

 

 

 

 

1-4. File을 이해하기 위한 예제(4)

: 현재 디렉토리에 속한 파일과 디렉토리의 이름, 크기 등 상세정보를 보여주는 예제이다.

 

package File;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Exercise004 {
	public static void main(String[] args) {
		String currDir = System.getProperty("user.dir");
		File dir = new File(currDir);

		File[] files = dir.listFiles();

		for(int i=0; i < files.length; i++) {
			File f = files[i];
			String name = f.getName();
			SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mma");
			String attribute = "";
			String size = "";

			if(files[i].isDirectory()) {
				attribute = "DIR";
			} else {
				size = f.length() + "byte";
				attribute  = f.canRead()  ? "R" : " ";	
				attribute += f.canWrite() ? "W" : " ";
				attribute += f.isHidden() ? "H" : " ";	
			}

			System.out.printf("%s %3s %6s %s%n", df.format(new Date(f.lastModified())), attribute, size, name );
		}
	}
}

 

 

 

 

1-5. File을 이해하기 위한 예제(5)

: 1-4 예제(4)에서 했던 코드에 정렬 기능을 추가한 코드이다.

 

package File;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.Scanner;

public class Exercise005 {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		System.out.println("   SORT_OPTION :                   ");
		System.out.println("   t     Time ascending sort.      ");
		System.out.println("   T     Time descending sort.     ");
		System.out.println("   l     Length ascending sort.    ");
		System.out.println("   L     Length descending sort.   ");
		System.out.println("   n     Name ascending sort.      ");
		System.out.println("   N     Name descending sort.     ");
		
		String input = sc.nextLine();
		
		if(input ==null || "tTlLnN".indexOf(input) == -1) {
			System.out.println("USAGE : java FileEx5 SORT_OPTION   ");
			System.exit(0);
		}

		final char option = input.charAt(0);

		String currDir = System.getProperty("user.dir");
		File dir = new File(currDir);
		File[] files = dir.listFiles();

		Comparator comp = new Comparator(){
			public int compare(Object o1, Object o2) {
				long time1 = ((File)o1).lastModified();
				long time2 = ((File)o2).lastModified();

				long length1 = ((File)o1).length();
				long length2 = ((File)o2).length();

				String name1 = ((File)o1).getName().toLowerCase();
				String name2 = ((File)o2).getName().toLowerCase();

				int result = 0;

				switch(option) {
					case 't' :
						if(time1 - time2 > 0)  result =  1;
						else if(time1 - time2 == 0) result =  0;
						else if(time1 - time2 < 0)  result = -1;
						break;   
					case 'T' :
						if(time1 - time2 > 0)  result = -1;
						else if(time1 - time2 == 0) result =  0;
						else if(time1 - time2 < 0)  result =  1;
						break;
					case 'l' :
						if(length1 - length2 > 0)  result =  1;
						else if(length1 - length2 == 0) result =  0;
						else if(length1 - length2 < 0)  result = -1;
						break;   
					case 'L' :
						if(length1 - length2 > 0)  result = -1;
						else if(length1 - length2 == 0) result =  0;
						else if(length1 - length2 < 0)  result =  1;
						break;
					case 'n' :
						result = name1.compareTo(name2);
						break;
					case 'N' :
						result = name2.compareTo(name1);
						break;
				}
				return result;
			} // compare

			public boolean equals(Object o) { return false; } // not used.
		}; // end of Comparator

		Arrays.sort(files, comp);

		for(int i=0; i < files.length; i++) {
			File f = files[i];
			String name = f.getName();
			SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mm");
			String attribute = "";
			String size = "";

			if(files[i].isDirectory()) {
				attribute = "DIR";
			} else {
				size = f.length() + "";
				attribute  = f.canRead()  ? "R" : " "; 
				attribute += f.canWrite() ? "W" : " ";
				attribute += f.isHidden() ? "H" : " "; 
			}

			System.out.printf("%s %3s %6s %s%n", df.format(new Date(f.lastModified())),attribute,size,name );
		} // for
	} // main
} // end of class

 

 

 

 

1-6. File을 이해하기 위한 예제(6)

: 지정된 디렉토리와 그와 포함된 서브 디렉토리에 포함된, 확장자가 'java', 'txt', 'bak'인 모든 파일의

내용을 읽어서 지정한 키워드가 포함된 라인을 출력하는 예제이다.

 

package File;

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

public class Exercise006 {
	static int found = 0;
	
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		String[] input = new String[2];
		
		System.out.println("경로: ");
		input[0] = sc.nextLine();
		System.out.println("키워드: ");
		input[1] = sc.nextLine();
		
		if(input.length != 2) {
			System.out.println("USAGE : java FileEx6 DIRECTORY KEYWORD");
			System.exit(0);
		}

		File dir = new File(input[0]);
		String keyword = input[1];

		if(!dir.exists() || !dir.isDirectory()) {
			System.out.println("유효하지 않은 디렉토리입니다.");
			System.exit(0);
		} 

		try {
			findInFiles(dir, keyword);
		} catch(IOException e) {
			e.printStackTrace();
		}

		System.out.println();
		System.out.println("총 " + found + "개의 라인에서 '" + keyword + "'을/를 발견하였습니다. ");
	} // main

	public static void findInFiles(File dir, String keyword) throws IOException
     {
		File[] files = dir.listFiles();

		for(int i=0; i < files.length; i++) {
			if(files[i].isDirectory()) {
				findInFiles(files[i], keyword);
			} else {
				String filename  = files[i].getName();
				String extension = filename.substring(filename.lastIndexOf(".")+1);
				extension = "," + extension + "," ;

				if(",java,txt,bak,".indexOf(extension) == -1) continue;

				filename = dir.getAbsolutePath() + File.separator + filename;

				FileReader     fr = new FileReader(files[i]);
				BufferedReader br = new BufferedReader(fr);

				String data = "";
				int lineNum = 0;

				while((data=br.readLine())!=null) {
					lineNum++;
					if(data.indexOf(keyword)!=-1) {
						found++;
						System.out.println("["+filename+ "("+lineNum+")" + "]" + data);
					}
				} // while
				
				br.close();
			}
		} // for
	} // findInFiles
} // class

 

(  File.separator은 File의 static 멤버변수이므로, 구분자를 사용할 때 쓰인다. )

( extension의 뒤쪽이나 앞 쪽에만 구분자를 붙이면 확장자가 'ava'와 같이 부분적으로 일치하는 경우에

문제가 생긴다. )

 

 

 

다음장

표준 입출력과 File: File(3) (tistory.com)

 

표준 입출력과 File: File(3)

1-7. File을 이해하기 위한 예제(7) : 해당 디렉토리에 입력된 문자열과 일치한 파일의 목록을 보여주는 예제이다. package File; import java.io.File; import java.io.FilenameFilter; import java.util.Scanner..

kind-coding.tistory.com