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

2022. 4. 28. 10:28·자바/입출력 IO

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

 

저작자표시 (새창열림)

'자바 > 입출력 IO' 카테고리의 다른 글

표준 입출력과 File: File(4)  (0) 2022.04.28
표준 입출력과 File: File(3)  (0) 2022.04.28
표준 입출력과 File: File(1)  (0) 2022.04.27
표준 입출력과 File: RandomAccessFile  (0) 2022.04.27
표준 입출력과 File: System(in, out, err)  (0) 2022.04.27
'자바/입출력 IO' 카테고리의 다른 글
  • 표준 입출력과 File: File(4)
  • 표준 입출력과 File: File(3)
  • 표준 입출력과 File: File(1)
  • 표준 입출력과 File: RandomAccessFile
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Collections Framework
      InputStream
      불안정 정렬
      역직렬화
      스트림
      알고스팟
      소켓 프로그래밍
      자바 개념
      문자 기반 스트림
      제자리 정렬
      선택 정렬
      serializable
      TCP 소켓 프로그래밍
      코딩테스트
      안정 정렬
      다형성
      snail
      java.time 패키지
      Arrays
      유용한 클래스
      java.lang패키지
      outputstream
      안드로이드 스튜디오
      코드트리
      ServerSocket
      람다식
      file
      코딩트리조별과제
      map()
      중간연산
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    표준 입출력과 File: File(2)
    상단으로

    티스토리툴바