[JAVA]객체지향(16): File 클래스

ho's·2022년 5월 4일
0

File 클래스

  • java.io.File클래스는 파일의 크기, 파일의 접근 권한, 파일의 삭제, 이름 변경 등의 작업을 할 수 있는 기능을 제공하여 준다.

  • 여기서 주의해야 할 것은 디렉토리(폴더) 역시 파일로써 취급한다는 것이다.

File 클래스 생성자

File(File parent, String child)

parent 디렉토리에 child라는 파일에 대한 File 객체를 생성한다.

File(String child)

child 라는 파일에 대한 File 객체를 생성한다.

File(String parent, String child)

parent 디렉토리에 child라는 파일에 대한 File 객체를 생성한다.

파일 인스턴스를 만들었다고, 실제 파일이 만들어 지는 것은 아니다.

File 퍼미션

  • 리눅스, Mac 환경에서는 퍼미션 정보가 있다.

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..
}

  • args를 설정해서 File의 위치를 찾을 수 있다.

파일 삭제 예제

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
}

1단계

파일을 만들어 보자

2단계

arguement를 설정해서, 파일을 삭제해보자

성공!

폴더에 List 를 찾는 코드

1단계 코드를 작성하자!

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

2단계 폴더의 위치를 확인하자

3단계 실행시키자.

조금 더 방어적인 프로그래밍을 해보자!

위의 코드의 문제점은,,

        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

  • 추상클래스
  • byte단위 입출력 클래스는 InputStream, OutputStream의 후손이다.

InputStream은 추상클래스이다.

InputStream이 가지는 중요 메소드

API를 살펴보자

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하는 이유

  • EOF를 표현하기 위해서!

profile
그래야만 한다

0개의 댓글