파일 입출력
외부 파일을 읽고 쓰거나 저장해야 할 경우, 파일을 코드로 입력받고 출력할 수 있도록 처리해야 한다. 입력 파일을 읽고 필요한 작업을 수행한 후, 결과를 새로운 파일로 저장하는 방식을 사용한다. 파일로 저장하는 이유 중 하나는 데이터를 스토리지에 저장하여 반영구적으로 보존할 수 있기 때문이다.
컴퓨터의 기억장치는 주기억장치와 보조기억장치로 크게 나눌 수 있는데, 주기억장치는 흔히 말하는 RAM이고, 보조기억장치는 SSD, HDD 등을 말한다. 주기억장치는 휘발성 메모리를 사용하기 때문에 전원이 꺼지면 데이터가 사라진다. 반면 보조기억장치는 비휘발성 메모리를 사용하기에 전원 공급 없이도 데이터 보존이 가능하다. 단 데이터 처리에서 RAM이 빠르기에 RAM에서 일반적으로 데이터를 처리한다.
파일 입출력은 크게 연결, 입출력, 해제 순으로 동작한다. 원하는 파일과 실행중인 프로그램 사이 데이터 흐름을 생성하는 연결을 통해 데이터 흐름으로 값을 주고받는 입출력을 가능하게 하고, 이러한 작업이 끝난 후에 데이터 흐름을 해제함으로써 파일과의 연결을 종료한다. 기본적으로 하나라도 이상이 생긴다면 제대로된 입출력이 이뤄지지 않는다.
자바에서는 기본적인 파일 입출력을 위한 API로 java.io
패키지를 제공한다. 가장 기본이 되는 클래스는 File, FileWriter, FileReader 등이 있다. 기본적으로 FileReader 를 통해 파일을 읽고 FileWriter를 통해 파일을 작성한다.
File 클래스(참고 링크)를 이용하여 물리적 파일을 참조하기 위한 클래스로 파일 경로를 지정해서 객체를 만들 수 있고, 이를 통해 파일을 생성하고, 삭제하고, 이름을 변경하는 등 다양한 기능을 사용할 수 있다.
FileWriter 클래스(참고 링크)는 파일에 문자 출력을 가능하게 해주는 클래스로 File 객체 또는 파일 경로를 지정하여 객체를 만들 수 있고, 문자열 쓰기 등 다양한 기능을 사용할 수 있다.
FileReader 클래스(참고 링크)는 파일로부터 문자 입력을 받아오는 클래스로 File 객체 또는 파일 경로를 지정하여 객체를 만들 수있고, 문자열 입력받아 쓰기, 정수로 읽어오기 등 다양한 기능을 사용할 수 있다.
예시
간단하게 책과 관련된 정보를 저장하는 클래스를 만들고, 객체를 만든 후에 이 내용을 텍스트 파일로 저장해보자면 다음과 같은 코드를 활용할 수 있다.
import java.io.*;
public class ExWrite {
public static void main(String[] args) {
Book book_a = new Book("자바 프로그래밍 입문", "김자바", 25000, "이 책은 자바 프로그래밍의 기초부터 고급 개념까지 다루고 객체 지향 개념을 설명하며 실습 예제와 함께 자바 언어의 핵심 문법을 학습할 수 있음");
Book book_b = new Book("알고리즘 문제 해결 전략", "구종만", 32000, "이 책은 알고리즘을 단계별로 학습할 수 있도록 문제 해결 기법과 예제를 제공하고 각 알고리즘의 원리를 이해하며 실제 코딩 문제에 적용할 수 있는 능력을 키우기 위한 지침서");
File file = new File("C:\\Users\\Username\\Downloads\\data.txt");
try (FileWriter fw = new FileWriter(file)) {
fw.write(book_a.toString() + "\n");
fw.write(book_b.toString() + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Book {
String title;
String writer;
int price;
String contents;
public Book(String title, String writer, int price, String contents) {
this.title = title;
this.writer = writer;
this.price = price;
this.contents = contents;
}
public String toString() {
return String.format("%s,%s,%d,%s", title, writer, price, contents);
}
}
이때 파일 경로는 원하는 위치로 설정 후 사용하면 되고, data.txt 파일이 없는 경우 임의로 만들어서 사용한다.
반대로 이렇게 쓴 파일을 문자열로 다음 코드를 이용하여 읽어올 수 있다.
import java.io.*;
public class ExRead {
public static void main(String[] args) {
File file = new File("C:\\Users\\Username\\Downloads\\data.txt");
try (FileReader fr = new FileReader(file)) {
StringBuilder content = new StringBuilder();
int ch;
while ((ch = fr.read()) != -1) {
content.append((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
입출력시 IOException을 발생시킬 가능성이 있기 때문에 try-catch
혹은 throws
키워드를 통한 예외 처리가 강제된다.
'Language > Java' 카테고리의 다른 글
[Java] 예외(exception)와 예외 처리(exception handling) (0) | 2024.11.19 |
---|---|
[Java] 인터페이스(interface) 및 디폴트(default) 메소드와 정적(static) 메소드 (0) | 2024.11.16 |
[Java] abstract 키워드를 통한 추상 클래스와 추상 메소드 (0) | 2024.11.14 |
[Java] 업캐스팅(upcasting)과 다운캐스팅(downcasting) (0) | 2024.11.12 |
[Java] 클래스 상속(inheritance) (0) | 2024.11.12 |