캠핑과 개발

 파일 클래스 속성 및 사용법

1. File 클래스 및 속성
package kr.pe.anaconda.test.io.file;

import java.io.File;
import java.io.IOException;

/**
 * File 클래스 사용법 및 속성
 * @author diem
 *
 */
public class FileEx1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		File f = new File("c:\\logs\\123.txt");
		
		String fileName = f.getName();
		int pos = fileName.lastIndexOf(".");
		
		System.out.println("경로를 제외한 파일 이름 : " + f.getName());
		System.out.println("확장자를 제외한 파일 이름 : " + fileName.substring(0, pos));
		System.out.println("확장자 : " + fileName.substring(pos + 1));
		System.out.println("경로를 포함한 파일이름 : " + f.getPath());
		System.out.println("파일의 절대경로 : " + f.getAbsolutePath());
		System.out.println("파일이 속해 있는 경로 : " + f.getParent());
		System.out.println();
		System.out.println("File.pathSeparator : " + File.pathSeparator);
		System.out.println("File.pathSeparatorChar : " + File.pathSeparatorChar);
		System.out.println("File.separator : " + File.separator);
		System.out.println("File.separatorChar : " + File.separatorChar);
		System.out.println();
		System.out.println("user.dir : " + System.getProperty("user.dir"));
		System.out.println("sun.boot.class.path : " + System.getProperty("sun.boot.class.path"));
	}
}


2. 파일 리스트
package kr.pe.anaconda.test.io.file;

import java.io.File;

/**
 * 디렉터리 리스트
 * @author diem
 *
 */
public class FileEx2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		if(args.length != 1){
			System.out.println("USAGE : java FileEx2 DIRECTORY");
			System.exit(0);
		}
		File f = new File("c:\\log");
		//File f = new File(args[0]);
		
		if(!f.exists() || !f.isDirectory()){
			System.out.println("유효하지 않은 디렉토리입니다.");
			System.exit(0);
		}
		
		File[] files = f.listFiles();
		
		for(int i = 0; i < files.length; i++){
			String fileName = files[i].getName();
			System.out.println(files[i].isDirectory() ? "["+ fileName +"]" : fileName);
		}
	}
}

3. 파일 디렉터리의 파일 갯수와 디렉터리 숫자 보여주기
package kr.pe.anaconda.test.io.file;

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

/**
 * 특정 디렉터리의 파일의 갯수와 디렉터리의 숫자를 보여준다.
 * @author diem
 *
 */
public class FileEx3 {

	static int totalFiles = 0;
	static int totalDirs = 0;
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub	
		
		if(args == null || args.length == 0){
			args = new String[1];
		}
		
		System.out.println(args.length);
		
		args[0] = "c:\\logs";
		
		if(args.length != 1){
			System.out.println("USAGE : java FileEx3 DIRECTORY");
			System.exit(0);
		}
		
		File dir = new File(args[0]);
		if(!dir.exists() || !dir.isDirectory()){
			System.out.println("유효하지 않은 디렉토리입니다.");
			System.exit(0);
		}
		
		printFileList(dir);
		System.out.println();
		System.out.println("총 " + totalFiles + "개의 파일");
		System.out.println("총 " + totalDirs + "개의 디렉터리");
		
	}

	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]);
		}
	}
}

4. 파일 리스트를 출력

package kr.pe.anaconda.test.io.file;

import java.io.File;
import java.text.SimpleDateFormat;

/**
 * 파일 리스트를 출력한다.
 * 출력시 파일의 속성과 수정일을 함께 출력한다.
 * @author diem
 *
 */
public class FileEx4 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub	
		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() + "";
				attribute = f.canRead() ? "R" : "";
				attribute += f.canWrite() ? "W" : "";
				attribute += f.isHidden() ? "H" : "";
			}
			
			System.out.printf("%s %3s %6s %s\n", df.format(f.lastModified()), attribute, size, name);
		}
	}
}

5. 파일 정렬
package kr.pe.anaconda.test.io.file;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;

/**
 * 파일 정렬을 한다.
 * @author diem
 *
 */
public class FileEx5 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		if (args.length != 1 || args[0].length() != 1
				|| "tTlLnN".indexOf(args[0]) == -1) {
			System.out.println("USAGE : java FileEx5 SORT_OPTION ");
			System.out.println("	SORT_OPTION : 				");
			System.out.println(" 	t Time asending 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 asending sort.		");
			System.out.println("	N Name descending sort.		");
		}

		final char option = args[0].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;
			}

			public boolean equals(Object o) {
				return false;
			}
		};

		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:mma");
			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(f.lastModified()),
					attribute, size, name);
		}
	}
}


6. 특정 확장자를 가진 파일 출력
package kr.pe.anaconda.test.io.file;

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

/**
 * 특정 확장자를 가진 파일을 출력한다.
 * @author diem
 *
 */
public class FileEx6 {

	static int found = 0;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (args.length != 2) {
			System.out.println("USAGE : java FileEx6 DIRECTORY KEYWORD");
			System.exit(0);
		}

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

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

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

	public static void findInFiles(File dir, String keyword) throws IOException {
		// TODO Auto-generated method stub
		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);
					}					
				}
				br.close();
			}
		}
	}
}

7. 특정한 이름을 포함한 파일의 목록을 출력

package kr.pe.anaconda.test.io.file;

import java.io.File;
import java.io.FilenameFilter;

/**
 * 특정한 이름을 포함한 파일의 목록을 보여준다.
 * @author diem
 *
 */
public class FileEx7 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (args.length != 1) {
			System.out.println("USAGE : java FileEx7 pattern");
			System.exit(0);
		}
		
		String currDir = System.getProperty("user.dir");
		//currDir = "c:\\logs";

		File dir = new File(currDir);
		final String pattern = args[0];
		
		
		//String[] list = (FilenameFilter filter)
		String[] files = dir.list(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				// TODO Auto-generated method stub
				return name.indexOf(pattern) != -1;
			}
		});
		
		for(int i = 0; i < files.length; i++){
			System.out.println(files[i]);
		}		
	}
}

8. 지정된 디렉터리에 정의한 확장자를 가진 파일을 삭제
package kr.pe.anaconda.test.io.file;

import java.io.File;
import java.io.FilenameFilter;

/**
 * 지정된 디렉터리에 정의한 확장자를 가진 파일을 삭제한다.
 * @author diem
 *
 */
public class FileEx8 {
	
	static int deleteFiles = 0;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (args.length != 1) {
			System.out.println("USAGE : java FileEx8 Extension");
			System.exit(0);
		}
		
		String currDir = System.getProperty("user.dir");
		currDir = "c:\\logs";

		File dir = new File(currDir);
		//final String ext = "." + args[0];
		final String ext = ".bak";
		delete(dir, ext);
		System.out.println(deleteFiles + " 개의 파일이 삭제 되었습니다.");
	}

	private static void delete(File dir, String ext) {
		// TODO Auto-generated method stub
		
		File[] files = dir.listFiles();
		
		for(int i = 0; i < files.length; i++){
			if(files[i].isDirectory()){
				delete(files[i], ext);
			}else{
				String filename = files[i].getAbsolutePath();
				
				if(filename.endsWith(ext)){
					System.out.print(filename);
					if(files[i].delete()){
						System.out.println("-삭제 성공");
						deleteFiles++;
					}else{
						System.out.println("-삭제 실패");
					}
				}				
			}
		}		
	}		
}

9. 지정된 디렉터리에 파일명이 숫자인 경우 파일명을 변경
package kr.pe.anaconda.test.io.file;

import java.io.File;

/**
 * 지정된 디렉터리에 파일명이 숫자인 경우 파일명을 변경한다.
 * ex) 1.gif -> 00001.gif
 * @author diem
 *
 */
public class FileEx9 {	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (args.length != 0) {
			System.out.println("USAGE : java FileEx9 DIRECTORY");
			System.exit(0);
		}
		
		//File dir = new File(args[0]);
		File dir = new File("c:\\logs");
		if(!dir.exists() || !dir.isDirectory()){
			System.out.println("유효하지 않은 디렉토리입니다.");
			System.exit(0);
		}
		
		File[] files = dir.listFiles();
		for(int i = 0; i < files.length; i++){
			String fileName = files[i].getName();
			//파일명
			System.out.println("파일이름 :" + fileName);
			String newFileName = "0000" + fileName;
			newFileName = newFileName.substring(newFileName.length() - 7);
			System.out.println("변경된 파일 이름 : " + newFileName );
			files[i].renameTo(new File(dir, newFileName));
		}
	}		
}