Java - data I/O

진경천·2024년 9월 26일

Java

목록 보기
8/9

I/O stream

데이터

어떤 데이터를 출력하느냐에 따라 byte 또는 문자 단위로 전송이 된다.

바이트 입/출력

바이트 입/출력 스트림은 이진 데이터를 입력 받거나 출력할 때 사용된다.

이미지, 오디오, 비디오 등의 이진 데이터를 처리할 때 유용하다

바이트 입력 스트림

FileInputStream fis = new FileInputStream([파일 경로]);

InputStream 클래스를 상속 받는다.
파일, 네트워크 등의 다양한 소스로부터 데이터를 읽을 수 있다.

주요 메서드

리턴 타입 메서드 설명
int read() 데이터 소스로부터 다음 1바이트를 읽고 바이트를 리턴, 바이트가 없으면 -1 반환
int read(byte[] b) 읽은 바이트를 매개값의 배열에 저장 후 읽은 바이트 수를 리턴
void close() 스트림을 닫고 관련된 자원 해제
int available() 읽기 가능한 바이트의 추정치를 반환

예제

public class ByteStreamInput {
    public static void main(String[] args) {
    	// 인스턴스 생성, 생성자를 통해 파일의 경로 전달
    	try(FileReader fis = new FileReader("test.txt")) {
            int i;
            // read()메서드를 사용해 바이트 단위 읽기
            while ((i = fis.read()) != -1){
                System.out.print((char) i);
            }
        } catch (IOException e) {
            e.getStackTrace();
        }
        // try with resource를 통한 자동 자원 해제
    }
}

바이트 출력 스트림

FileOutputtStream fos = new FileOutputStream([파일경로]);

OutputStream 클래스를 상속 받는다.
파일, 네트워크 등 다양한 대상에 데이터를 쓸 수 있다.

주요 메서드

리턴 타입 메서드 설명
void write(int b) 1byte 출력
void write(byte[] b) 매개값의 배열 b의 모든 바이트를 출력
void write(byte[] b, int off, int len) 매개값의 배열 b[off]부터 len개의 바이트를 출력
void flush() 출력 버퍼에 잔류하는 모든 바이트를 출력
void close() 스트림을 닫고 관련된 자원 해제

문자 입/출력

파일의 문자열을 읽거나 쓸 때 사용한다.

입출력 단위가 문자인 것을 제외하고 바이트 입/출력 스트림과 사용방법이 동일하다.

인코딩이 자동으로 처리 되어 별도의 인코딩 처리가 필요 없다. 또한 UTF-16 인코딩을 기본으로 사용하여 여러 언어를 처리할 수 있다.

Reader

주요 메서드

리턴 타입 메서드 설명
int read() 데이터 소스로부터 다음 문자 1개를 읽고 문자를 리턴, 바이트가 없으면 -1 반환
int read(char[] cbuf) 읽은 문자를 매개값의 배열에 저장 후 읽은 문자 수를 리턴
void close() 스트림을 닫고 관련된 자원 해제

Writer

주요 메서드

리턴 타입 메서드 설명
void write(int c) 매개값의 문자 출력
void write(char[] cbuf) 매개값의 배열안의 모든 문자 출력
void write(char[] cbuf, int off, int len) 매개값의 배열 cbuf[off]부터 len개의 바이트를 출력
void write(String str) 매개값의 문자열 출력
void write(String str, int off, int lne) 매개값의 문자열을 off 순번부터 len개까지의 문자를 출력
void flush() 출력 버퍼에 잔류하는 모든 바이트를 출력
void close() 스트림을 닫고 관련된 자원 해제

예제

public class FileWriterTest {
    public static void main(String[] args) {
        try (FileWriter writer = new FileWriter("example.txt")){
            writer.write("ddd");
            writer.write("\njava is fun");
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

자원이 해제되지 않으면 파일 삭제 및 수정이 안되니 꼭 close()를 해주자

File/Files

자바에서 파일 시스템을 다루기 위해 쓰이는 클래스이다.
파일 및 디렉토리를 생성, 관리, 조회 등 다양한 파일 시스템 작업을 위해 사용한다.

File

File file = new File([파일 경로]);

파일 객체를 생성해도 파일이나 디렉토리가 생성되는 것이 아니다.

파일 객체를 생성하며 입력한 경로에 실제 파일이나 디렉토리가 없더라도 예외가 발생하지 않는다.
그렇기 때문에
boolean file.exists() 메서드를 이용해 실제 파일이 있는지 확인을 해야한다.

file.exists()가 false일 경우
파일 및 디렉토리를 생성할 수 있다.

주요 메서드

files.exists() == true일 경우

출처 : 이것이 자바다
files.exists() == false일 경우

출처 : 이것이 자바다

Files

Files 클래스는 정적 메서드로 구성되어있기 때문에 객체를 생성할 필요가 없다.

메서드들은 매개값으로 Path 객체를 받아 파일 생성, 복사, 삭제 등의 기능을 수행한다.

주요 메서드

출처 : 이것이 자바다

예제

public class FileTest {
    public static void main(String[] args) {
        /* 파일 읽기 */
        Path filePath = Paths.get("C:/a/example.txt");

        try {
            // 파일을 바이트 배열로 읽기
            byte[] fileBytes = Files.readAllBytes(filePath);
            String fileContent = new String(fileBytes);
            System.out.println("파일 내용: \n" + fileContent);
        } catch (IOException e) {
            e.printStackTrace();
        }



        /* 파일 쓰기 */
        filePath = Paths.get("C:/a/output.txt");
        String content = "이 파일에 쓰여진 내용입니다.";

        try {
            // 문자열을 파일에 쓰기 (기존 파일이 있으면 덮어씌워짐)
            Files.write(filePath, content.getBytes(StandardCharsets.UTF_8));
            System.out.println("파일에 내용이 성공적으로 쓰였습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }



        /* 파일 복사 */
        Path source = Paths.get("C:/a/example.txt");
        Path target = Paths.get("C:/a/example_copy.txt");

        try {
            Files.copy(source, target);
            System.out.println("파일이 성공적으로 복사되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }



        /* 파일 이동 */
        source = Paths.get("C:/a/example.txt");
        target = Paths.get("C:/a/moved_example.txt");

        try {
            Files.move(source, target);
            System.out.println("파일이 성공적으로 이동되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }



        /* 파일 삭제 */
        filePath = Paths.get("C:/a/example.txt");

        try {
            Files.delete(filePath);
            System.out.println("파일이 성공적으로 삭제되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }



        /* 파일 존재 확인 */
        filePath = Paths.get("C:/a/example.txt");

        if (Files.exists(filePath)) {
            System.out.println("파일이 존재합니다.");
        } else {
            System.out.println("파일을 찾을 수 없습니다.");
        }
    }
}
profile
어중이떠중이

0개의 댓글