❗️ 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(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로 반환
✏️ static String pathSeparator / static char pathSeparatorChar
- 윈도우 ➡️ ;
- 리눅스 ➡️ :
- OS에서 사용하는 경로 구분자.
✏️ static String separator / static char separatorChar
- 윈도우 ➡️ \
- 리눅스 ➡️ /
- OS에서 사용하는 이름 구분자.
❗️ OS를 독립적으로 프로그램을 작성하기 위해서는 반드시 멤버변수를 이용해야 한다.
파일의 경로와 디렉토리나 파일의 이름을 구분하는데 사용되는 구분자가 OS마다 다를 수 있기 때문이다.
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 f = new File("c:\\some\\tesla.txt"); // -> 논리적 파일
// 논리적이냐 물리적이냐 확인할 수 있는 메서드 = 디스크상의 실제 존재 여부를 확인할 수 있다.
if(f.exists()) {
System.out.println("물리적 파일입니다.");
} else {
System.out.println("논리적 파일입니다.");
}
⭐️ 꼭 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()
는 반환값이 boolean형이다.
파일을 생성하는데에 성공하면 true를 반환하고 실패하면 false를 반환한다.
if(f.exists()) {
System.out.println("물리적 파일입니다.");
} else {
System.out.println("논리적 파일입니다.");
try {
f.createNewFile(); // 실제로 파일을 디스크에 생성
} catch(IOException e) { // 운영체제한테 만들어주세요! 하는 것. 권한 문제.
e.printStackTrace();
}
}
✔️ 파일이나 폴더를 삭제
❗️ 단 폴더가 비어있지 않으면 삭제할 수 없다.
if(f.exists()) {
System.out.println("물리적 파일입니다.");
f.delete(); // 물리적 디스크에서 삭제
} else {
System.out.println("논리적 파일입니다.");
try {
f.createNewFile(); // 실제로 파일을 디스크에 생성
} catch(IOException e) { // 운영체제한테 만들어주세요! 하는 것. 권한 문제.
e.printStackTrace();
}
}
✔️ 파일에 지정된 경로로 디렉토리를 생성 (성공하면 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