File 클래스
java.io.File클래스는 파일의 크기, 파일의 접근 권한, 파일의 삭제, 이름 변경 등의 작업을 할 수 있는 기능을 제공하여 준다.
여기서 주의해야 할 것은 디렉토리(폴더) 역시 파일로써 취급한다는 것이다.
File 클래스 생성자
parent 디렉토리에 child라는 파일에 대한 File 객체를 생성한다.
child 라는 파일에 대한 File 객체를 생성한다.
parent 디렉토리에 child라는 파일에 대한 File 객체를 생성한다.
File 퍼미션
File의 메소드들이다.
파일의 정보를 예제를 통해 알아보자.
File의 생성자에는 pathname이 들어간다.
package totojava.com.example;
import java.io.File;
import java.io.IOException;
//java FileInfo 파일이름,,
public class FileInfo {
public static void main(String[] args) {
if(args.length != 1) {
System.out.println("사용법 : java FileInfo 파일이름");
System.exit(0); // return;
} // if end
File f = new File(args[0]);
if(f.exists()){ // 파일이 존재할 경우
System.out.println("length :" + f.length());
System.out.println("canRead : " + f.canRead());
System.out.println("canWrite :" + f.canWrite());
System.out.println("getAbsolutePath : " + f.getAbsolutePath());
try{
System.out.println("getCanonicalPath:"+ f.getCanonicalPath());
}catch(IOException e){
System.out.println(e);
}
System.out.println("getName : " + f.getName());
System.out.println("getParent : " + f.getParent());
System.out.println("getPath : " + f.getPath());
}else{ // 파일이 존재하지 않을 경우
System.out.println("파일이 존재하지 않습니다.");
}
} // main end..
}
파일 삭제 예제
package totojava.com.example;
import java.io.File;
public class FileDelete {
public static void main(String[] args) {
if(args.length != 1){
System.out.println("사용법 : java FileDelete 파일이름");
System.exit(0);
} // if end
File f = new File(args[0]);
if(f.exists()){
boolean deleteflag = f.delete();
if(deleteflag)
System.out.println("파일 삭제를 성공했습니다.");
else
System.out.println("파일 삭제를 실패했습니다.");
}else{
System.out.println("파일이 존재하지 않습니다.");
}
} // main
}
파일을 만들어 보자
arguement를 설정해서, 파일을 삭제해보자
폴더에 List 를 찾는 코드
package totojava.com.example;
import java.io.File;
public class FileList {
public static void main(String[] args) {
File file = new File("/C:\\Users\\handa\\Desktop\\file");
File[] files = file.listFiles();
for(int i = 0; i<files.length;i++){
System.out.println(files[i].getName());
}
}
}
위의 코드의 문제점은,,
File file = new File("/C:\\Users\\handa\\Desktop\\file");
File의 생성자가 받는 인자가 folder일때인 것이다.
위와 같이 에러 메세지가 발생한다.
file.listFiles()는 폴더에 있는 파일목록을 구하는 것이다.
File[] files = file.listFiles();
는 Null을 저장하게 된다. 따라서 NullPointerException이 발생하게 되는 것이다.
코드를 좀 더 방어적으로 작성하자.
원래 작성되어 있던 코드를 if문 파일이 존재한다면으로 감싸고,
그 외의 것은 파일의 이름을 출력하게 한다.
코드를 드래그하고, Refactor -> ExtractMethod 를 누른다.
임시 파일 생성하기
코드를 작성해보자.
File f = File.createTempFile("tmp_", ".dat");
임시파일 f를 만든다. 파일명의 시작 이름은 tmp_ , .dat 이다.
결과는
위와 같다. 숫자는 랜덤하게 생성된다.
위 파일을 실행할 동안은 생성되고, 시간이 지나면 사라지게 하고싶을땐 어떻게 해야할까?
Thread를 이용하자!
1000밀리 세컨드 = 1초
Thread.sleep(60000);
60000ms = 60초 동안 프로그램이 멈춰 있는다.
f.deleteOnExit();
JVM이 종료 될 때, 임시 파일을 자동으로 삭제한다.
InputStream, OutputStream
InputStream이 가지는 중요 메소드
read() 메소드가 추상 메소드이다.
InputStream 예제
read()와, close()는
IOException을 발생하므로, CheckedException 이기 때문에, try catch를 이용해서 예외처리를 해준다.
Inputstream는 Byte단위이기 때문에, read()는 한 Byte를 리턴해준다.
따라서, byte data = in.read()
가 맞는 코드로 보인다.
int data = in.read();
가 맞는 표현이다.
1byte가 표현할 수 있는 값: 00000000 ~ 11111111 이다.
read()메소드가 읽어들일 수 있는 정보는 위의 값 중 하나를 읽어 들인다는 것이다.
예를 들어 100byte의 파일을 읽어 들인다고 할때, 100번의 파일을 읽어야 한다.
1byte씩 읽어들이는데, 파일의 크기를 모를때 언제까지 읽어야 할까?
더 이상 읽어들일 수 없을 때 표현하는 값은 -1 이다.
자바 개발자는 int에 1byte값을 담자! 라고 생각했다.
int는 4byte이므로,
00000000 00000000 00000000 00000000
00000000 00000000 00000000 11111111
EOF : -1
1 --> 00000000 00000000 00000000 00000001
1의 보수 11111111 11111111 11111111 11111110
2의 보수 11111111 11111111 11111111 11111111 : -1
Byte 단위로 읽어들이는 Read메소드가 Byte가 아닌 int를 return하는 이유