자바의 파일 입출력은 스트림(Stream) 기반의 전통적인 방식과 NIO.2(New I/O) 기반의 현대적인 방식으로 나뉜다.
데이터의 영속성을 확보하기 위한 주요 구현 패턴을 정리한다.
전통적인 입출력 (java.io)
BufferedReader와 BufferedWriter를 사용하여 버퍼링을 통한 효율적인 텍스트 파일 조작을 수행한다.
import java.io.*;
public class ClassicIO {
public static void main(String[] args) {
File file = new File("example.txt");
// 파일 쓰기
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write("Line 1: Hello Java IO\n");
writer.write("Line 2: Buffered Writing");
} catch (IOException e) {
e.printStackTrace();
}
// 파일 읽기
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("Read: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
현대적인 입출력 (java.nio.file)
Java 7부터 도입된 NIO.2는 Files 클래스를 통해 더 간결하고 강력한 파일 조작 기능을 제공한다.
import java.nio.file.*;
import java.util.List;
import java.io.IOException;
public class ModernIO {
public static void main(String[] args) {
Path path = Paths.get("modern_example.txt");
try {
// 한 번에 쓰기
String content = "Modern Java File I/O using NIO.2";
Files.write(path, content.getBytes());
// 한 번에 모든 라인 읽기
List<String> lines = Files.readAllLines(path);
lines.forEach(System.out::println);
// 파일 정보 확인
System.out.println("Size: " + Files.size(path) + " bytes");
} catch (IOException e) {
e.printStackTrace();
}
}
}
주요 고려사항
-
자원 해제:
InputStream,OutputStream등은 사용 후 반드시 닫아야 한다.
try-with-resources구문 사용이 필수적이다. -
예외 처리: 파일이 없거나 권한이 없는 등 런타임 오류가 빈번하므로
IOException처리가 중요하다. - 성능: 대용량 파일 처리 시에는 버퍼를 사용하거나 메모리 매핑 파일(MappedByteBuffer)을 고려해야 한다.
P.S
단순한 텍스트 작업에는 java.nio.file.Files의 편의 메서드가 효율적이며, 정교한 스트림 제어가 필요한 경우에는 java.io 패키지의 클래스들을 활용한다.
시스템 환경과 데이터 규모에 적합한 API 선택이 필요하는 것 같다.