[Java] File 클래스

JTI·2023년 1월 17일
0

☕️  Java

목록 보기
52/59
post-thumbnail

📁 File 클래스


❗️ File
: File인스턴스는 파일 일수도 있고 디렉토리일 수 도 있다.

  • File
  • Directory

java.io 패키지는 기존의 파일이나 디렉토리에 대한 제어를 하는 데 사용하는 File 클래스를 제공한다.

import java.io.*;

public class FileEx1 {
	public static void main(String[] args) {
		// c:\some\test.txt
		File f = new File("c:\\some\\test.txt"); // \\ Window는 두번 써줘야함
		File f2 = new File("c:\\some", "test.txt");
		
		File dir = new File("c:\\some");
		File f3 = new File(dir, "test.txt");
		//f1, f2, f3는 같은 파일을 나타낸다.
	}

}

📎 File 생성자

✏️ File(String fileName)

  • 주어진 문자열(fileName)을 이름으로 갖는 파일을 위한 File인스턴스를 생성.
  • 파일 뿐만 아니라 디렉토리도 같은 방법.
  • fileName은 주로 경로를 포함해서 지정해주지만, 파일 이름만 사용해도 프로그램이 실행되는 위치가 경로로 간주된다.

✏️ File(String pathName, Stirng fileName) / File(File pathName, Stirng fileName)

  • 파일의 경로와 이름을 따로 분리해서 지정할 수 있다.

✏️ File(URL url)

  • 저징된 uri로 파일 생성.

📎 경로와 관련된 메서드

✏️ String getName()

  • 파일이름을 String으로 반환

✏️ String getPath()

  • 파일 경로를 String으로 반환

✏️ String getAbsolutePath() / File getAbsoluteFile()

  • 파일의 절대경로를 String / File로 반환

✏️ String getParent() / File getParentFile()

  • 파일의 조상 디렉토리를 String / File로 반환

✏️ String getCanonicalPath() / File getCanonicalPath()

  • 파일의 정규경로를 String / File로 반환

📎 경로와 관련된 File 멤버변수

✏️ static String pathSeparator / static char pathSeparatorChar

  • 윈도우 ➡️ ;
  • 리눅스 ➡️ :
  • OS에서 사용하는 경로 구분자.

✏️ static String separator / static char separatorChar

  • 윈도우 ➡️ \
  • 리눅스 ➡️ /
  • OS에서 사용하는 이름 구분자.

❗️ OS를 독립적으로 프로그램을 작성하기 위해서는 반드시 멤버변수를 이용해야 한다.

파일의 경로와 디렉토리나 파일의 이름을 구분하는데 사용되는 구분자가 OS마다 다를 수 있기 때문이다.

✏️ File 정보 예제

File인스턴스를 생성하고 메서드를 이용해서 파일의 경로와 구분자 등의 정보를 출력.

 import java.io.*;

 class FileEx1{
	public static void main(String[] args) throws IOException {
		
        File f = new File("c:\\jdk1.8\\work\\ch15\\FileEx1.java");
		
        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"));

	}

}
[결과값]

경로를 제외한 파일이름 - FileEx1.java
확장자를 제외한 파일이름 - FileEx1
확장자 - java
경로를 포함한 파일이름 - c:\jdk1.5\work\ch14\FileEx1.java
파일의 절대경로        - c:\jdk1.5\work\ch14\FileEx1.java
파일이 속해 있는 디렉토리 - c:\jdk1.5\work\ch14

File.pathSeparator - ;
File.pathSeparatorChar - ;
File.separator - \
File.separatorChar - \

user.dir=C:\jdk1.8\work\ch15
sun.boot.class.path=C:\Program Files 
(x86)\Java\jre6\lib\resources.jar;C:\Program Files 
(x86)\Java\jre6\lib\rt.jar;C:\Program Files 
(x86)\Java\jre6\lib\sunrsasign.jar;C:\Program Files 
(x86)\Java\jre6\lib\jsse.jar;C:\Program Files 
(x86)\Java\jre6\lib\jce.jar;C:\Program Files 
(x86)\Java\jre6\lib\charsets.jar;C:\Program Files 
(x86)\Java\jre6\lib\modules\jdk.boot.jar;C:\Program Files 
(x86)\Java\jre6\classes

📎 File 주요 메서드




✏️ File 생성 / 수정 / 삭제 메서드

✏️ File 체크 메서드

✏️ File 권한 메서드

💡 exists()


⭐️ 논리적 물리적 파일 구분하기

  • 물리적파일: 실제로 디스크 상에 존재한다.
  • 논리적파일: 실제로 디스크 상에는 없고 코드상에 존재한다.
    File f = new File("c:\\some\\tesla.txt"); // -> 논리적 파일

    // 논리적이냐 물리적이냐 확인할 수 있는 메서드 = 디스크상의 실제 존재 여부를 확인할 수 있다.
    if(f.exists()) {
        System.out.println("물리적 파일입니다.");
    } else {
        System.out.println("논리적 파일입니다.");
    }

💡 isFile() | isDirectory()


⭐️ 꼭 exists를 거쳐가서 구분해야 한다. 물리적 파일이여야 구분할 수 있다.

import java.io.File;

public class FileEx2 {
	public static void main(String[] args) {
		
		File whatIsThis = new File("c:\\some"); // 물리적파일: 실제로 있음
        
		// 파일인지 경로인지 알 수 있는 메서드 + 물리적 존재여부를 전제로 한다.
		if(whatIsThis.isFile()) {
			System.out.println("파일 입니다.");
		}
		if(whatIsThis.isDirectory()) {
			System.out.println("디렉토리 입니다.");
		}
		//적어도 물리적으로 존재할 때 파일인지 디렉토리인지 알 수 있다.
 }

💡 createNewFile()


createNewFile() 는 반환값이 boolean형이다.

파일을 생성하는데에 성공하면 true를 반환하고 실패하면 false를 반환한다.

if(f.exists()) {
    System.out.println("물리적 파일입니다.");

} else {
	System.out.println("논리적 파일입니다.");
	
    try {	
		f.createNewFile(); // 실제로 파일을 디스크에 생성
	} catch(IOException e) { // 운영체제한테 만들어주세요! 하는 것. 권한 문제.
		e.printStackTrace();
	}
}

💡 delete()


✔️ 파일이나 폴더를 삭제

❗️ 단 폴더가 비어있지 않으면 삭제할 수 없다.

if(f.exists()) {
	System.out.println("물리적 파일입니다.");
	f.delete(); // 물리적 디스크에서 삭제

} else {
	System.out.println("논리적 파일입니다.");
	
    try {	
		f.createNewFile(); // 실제로 파일을 디스크에 생성
	} catch(IOException e) { // 운영체제한테 만들어주세요! 하는 것. 권한 문제.
		e.printStackTrace();
	}
}

💡 mkdirs()


✔️ 파일에 지정된 경로로 디렉토리를 생성 (성공하면 true)

  • mkdirs() 는 필요하면 부모 디렉토리까지 생성한다.
import java.io.File;
import java.io.IOException;

public class FileEx4 {

	public static void main(String[] args) {
		File dir = new File("c:\\some\\a\\b\\c\\d\\e\\f\\g"); // 이렇게 되면 따로따로 일일이 다 만들어줘야되는것인가?
		dir.mkdirs(); // make Directory: 파일을 한번에 다 만들어줌
		
		File f = new File(dir, "target.txt");
		try {
			f.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

✏️ 파일 탐색기 + 정렬


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

//탐색기 : 파일 다 뽑아냄 -> 정렬: Comparator
public class FileEx7 {
	public static void main(String[] args) {
		File dir = new File("C:\\Windows");
		
		if(dir.isDirectory()) {
			File[] list = dir.listFiles();
			
//			// Comparator 정렬
//			Arrays.sort(list, new Comparator<File>() {
//				@Override
//				public int compare(File o1, File o2) {
//					if(o1.isDirectory() && !o2.isDirectory()) {
//						return -1;
//					} else if(!o1.isDirectory() && o2.isDirectory()) {
//						return 1;
//					} else {
//						return 0;
//					}
//				}
//			});
			
			Arrays.sort(list, new Comparator<File>() {
				@Override
				public int compare(File o1, File o2) {
					if(o1.isDirectory() && o2.isFile()) {
						return -1;
					} else if(o1.isFile() && o2.isDirectory()) {
						return 1;
					} else {
						return o1.getName().compareTo(o2.getName()); // 둘이 디렉일경우 이름으로 정렬하겠다.
					}
				}
			});
			
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a hh:mm");
			Date date = new Date();
			
			for(File temp : list) {
				String name = temp.getName();
				if(temp.isDirectory()) {
					name = "[" + name + "]";
				}
				
				date.setTime(temp.lastModified());
				String strDate = sdf.format(date);
				
				System.out.printf("%s\t\t\t\t%s", name, strDate);
				
				// 파일이면 길이 추가한다.
				if(temp.isFile()) {
					System.out.println("\t\t" + temp.length() + "bytes");
				} else {
					System.out.println();
				}
			}
		}
	}
}

References
: https://codedragon.tistory.com/6324 (메서드 사진 출처)
: https://cafe.naver.com/javachobostudy

profile
Fill in my own colorful colors🎨

0개의 댓글