본문 바로가기
Backend/Java

[자바의 신] 26장 (ongoing)

by unknownomad 2022. 8. 18.

26장 - 파일에 있는 것을 읽고 쓰려면 아이오를 알아야죠


I/O 역할

  • 파일 읽거나 저장할 때
  • 다른 서버나 디바이스로 보낼 때

 

I/O

I = Input / O = Output

입력과 출력 통칭하는 용어

JVM을 기준으로 읽을 때 Input / 파일로 쓰거나 외부로 전송 시 Output 용어 사용

여기서의 Input과 Output : JVM 기준임을 꼭 기억해두기

 

초기 I/O JDK 1.4 ~ Java 7 ~
java.io 패키지에 있는 클래스만 제공
바이트 기반의 데이터 처리 위해 여러 종류의 스트림(Stream) 클래스 제공
읽기 = InputStream / 쓰기 = OutputStream
자바의 스트림 = 끊기지 않는 연속적인 데이터

바이트 아닌 char 기반 문자열로만 된 파일 작업 시
Reader / Writer 클래스 사용
보다 빠른 I/O 처리 위해 NIO (New I/O) 추가됨
스트림 기반이 아닌 버퍼(Buffer)와 채널(Channel) 기반으로 데이터 처리
NIO2 추가됨

 

자바의 File과 Files 클래스

File 클래스 Files 클래스
java.io 패키지
파일 뿐만 아니라 파일 경로(path) 정보도 포함
정체가 불분명하고, 심볼릭 링크(symbolic ink)와 같은 유닉스 계열의 파일에서 사용하는 몇 기능 제대로 제공 못함
Java 7 ~ NIO2 등장
java.nio.file 패키지
File 클래스의 메서드 대체하여 제공

객체 생성해서 데이터 처리 모든 메서드가 static으로 선언됨 ➡ 별도의 객체 생성 필요 x

 

File 클래스

파일 및 경로 정보 통제하기 위한 클래스

File 클래스로 생성한 파일 객체가 가리키고 있는 것이

  • 존재하는지
  • 파일인지 경로인지
  • 읽거나 쓰거나 실행할 수 있는지
  • 언제 수정되었는지

확인하는 기능과 해당 파일의

  • 이름 변경
  • 삭제
  • 생성
  • 전체 경로 확인

등 기능 제공

이외에 File 객체가 가리키는 것이 파일이 아닌 경로일 때 해당 경로에 있는

  • 파일의 목록 가져오거나
  • 경로 생성하고
  • 경로 삭제하는

등의 기능도 있음

 

File 클래스의 생성자

생성자 설명
File(File parent, String child) 이미 생성된 File 객체(parent)와 그 경로의 하위 경로 이름으로 새로운 File 객체 생성
child: 값의 경로 or 파일 이름
File(String pathname) 지정한 경로 이름으로 File 객체 생성
전체 경로와 파일 이름이 pathname으로 지정된 경우 파일을 가리키는 File 객체가 됨
File(String parent, String child) 상위 경로(parent)와 하위 경로(child)로 File 객체 생성
child: 값의 경로 or 파일 이름
File(URI uri) URI에 따른 File 객체 생성

 

URI (Uniform Resource Identifier)

어떤 리소스 가리키기 위한 경로

 

File 클래스로 파일 경로 및 상태 확인

package e.io;

import java.io.File;

public class FileSample {
    public static void main(String[] args) {
        FileSample sample = new FileSample();
        String pathName = "C:\\godofjava\\text";
        sample.checkPath(pathName);
    }
    
    public void checkPath(String pathName) {
        File file = new File(pathName);
        System.out.println(pathName + " exists? = " + file.exists());
    }
}
//결과 : C:\\godofjava\\text exists? = false
//해당 디렉터리 존재하지 않으므로 false

존재하지 않는 디렉터리를 File 클래스로 만들려면 mkdir() / mkdirs() 사용

mkdir()

디렉터리 하나 생성

mkdirs()

여러 개의 하위 디렉터리 생성

C:\godofjava\text1\text2
//위의 경로 만들려면

mkdirs()
//text1, test2 디렉터리 생성

mkdir()
//디렉터리를 하위 디렉터리 하나만 만들기에 해당 경로의 디렉터리 생성되지 x
public void makeDir(String pathName) {
    File file = new File(pathName);
    System.out.println("Make " + pathName + " result = " + file.mkdir());
}

 

Escape character

String 안에 역슬래시 한 번만 쓰면 그 뒤에 있는 단어에 따라 미리 약속한 특수 기호로 인식

➡ 역슬래시 나타내려면 \\ 사용해야 함

ex) tab = \t, 다음줄 = \n

 

OS마다 각 디렉터리 구분 기호 다름

유닉스 계열 : /로 디렉터리 구분

➡ 이런 모호함 없애기 위해 File 클래스에 separator이라는 static 변수 존재

String pathName = File.separator + "godofjava" + File.separator + "text";

 

isDirectory() isFile() isHidden()
File 객체를 매개 변수로 받을 때 해당 객체가 파일인지 경로인지 알 수 있음 파일인지 확인 시 숨긴 파일인지 확인 시
public void checkFileMethods(String pathName) {
    File file = new File(pathName);
    System.out.println(pathName + " is directory? = " + file.isDirectory());
    System.out.println(pathName + " is file? = " + file.isFile());
    System.out.println(pathName + " is hidden? = " + file.isHidden());
}

 

canRead() canWrite() canExecute()
현재 수행하고 있는 자바 프로그램이 해당 File 객체를 읽거나 쓰거나 실행할 수 있는 권한이 있는지 확인
Java 6 ~
public void canFileMethods(String pathName) {
    File file = new File(pathName);
    System.out.println(pathName + " can read? = " + file.canRead());
    System.out.println(pathName + " can write? = " + file.canWrite());
    System.out.println(pathName + " can execute? = " + file.canExecute());
}

 

lastModified()
파일이나 경로가 언제 생성되었는지 확인
long 타입의 현재 시간을 리턴하기에 java.util 패키지의 Date 클래스 사용해 시간 확인
public void lastModified(String pathName) {
    File file = new File(pathName);
    System.out.println(pathName + " last modified = " + new Date(file.lastModified()));
}

 

delete()
파일 삭제 / 정상적으로 파일 삭제 후 true 리턴

 

 

p.711 ~

'Backend > Java' 카테고리의 다른 글

[자바의 신] 28장 (ongoing)  (0) 2022.08.31
[자바의 신] 27장 (ongoing)  (0) 2022.08.18
[자바의 신] 25장 (ongoing)  (0) 2022.08.18
[자바의 신] 24장  (0) 2022.08.09
[자바의 신] 23장  (0) 2022.08.09

댓글