반응형
안녕하세요! 이번 글에서는 Java 입출력 스트림(Input/Output Stream)을 이용해 파일을 읽고 쓰는 방법을 알아보겠습니다. 파일을 다루는 작업은 프로그래밍에서 정말 자주 사용되며, 오늘 소개할 예제는 텍스트 파일 필터링과 파일 읽기/쓰기를 다룹니다.
1. BufferedCharStream을 사용해 텍스트 파일 필터링하기
먼저, 텍스트 파일에서 특정 단어가 포함된 줄만 골라 새로운 파일에 저장하는 작업을 해보겠습니다. 여기서는 BufferedReader와 BufferedWriter를 사용해 성능을 높이고, 줄 단위로 데이터를 처리합니다.
코드 설명
package com.javaex.io.charstream;
import java.io.*;
public class BufferedCharStreamEx {
private static String rootPath = System.getProperty("user.dir") + "\\files\\";
private static String source = rootPath + "last-leaf.txt";
private static String target = rootPath + "last-leaf-filtered.txt";
public static void main(String[] args) {
System.out.println("원본 파일: " + source);
System.out.println("필터 파일: " + target);
try (
Reader fr = new FileReader(source);
Writer fw = new FileWriter(target);
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw)
) {
String line;
while ((line = br.readLine()) != null) {
// "leaf" 또는 "leaves"가 포함된 줄만 선택
if (line.toLowerCase().contains("leaf") || line.toLowerCase().contains("leaves")) {
bw.write(line); // 필터링된 줄 쓰기
bw.newLine(); // 새 줄 추가
}
}
System.out.println("필터링 완료!");
} catch (FileNotFoundException e) {
System.err.println("파일을 찾을 수 없습니다.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
코드 분석
- BufferedReader와 BufferedWriter 사용:
- BufferedReader는 텍스트 파일을 줄 단위로 읽는 데 최적화되어 있습니다.
- BufferedWriter는 텍스트를 빠르게 파일에 기록할 수 있습니다.
- 특정 단어 필터링:
- line.toLowerCase().contains("leaf"): 현재 줄에 "leaf" 또는 "leaves"라는 단어가 포함되었는지 확인합니다.
- 조건을 만족하는 줄만 새 파일에 기록합니다.
- 예외 처리:
- 파일이 없는 경우 FileNotFoundException을 처리하고, 입출력 중 오류 발생 시 IOException을 처리합니다.
- 자동 자원 해제:
- try-with-resources 구문을 사용해 스트림을 자동으로 닫아줍니다.
2. CharStream을 사용해 텍스트 파일 읽고 쓰기
이번에는 FileReader와 FileWriter를 사용해 텍스트 파일을 읽고 쓰는 방법을 알아봅니다.
코드 설명
package com.javaex.io.charstream;
import java.io.*;
public class CharStreamEx {
private static String rootPath = System.getProperty("user.dir") + "\\files\\";
private static String filename = rootPath + "char.txt";
public static void main(String[] args) {
writeFile(); // 파일 쓰기
readFile(); // 파일 읽기
}
private static void writeFile() {
System.out.println("파일명: " + filename);
try (Writer writer = new FileWriter(filename)) {
// 텍스트 기록
writer.write("아카데미\r\n");
writer.write("Java Programming\r\n");
writer.write("2024.04");
writer.flush(); // 내부 버퍼 비우기
} catch (IOException e) {
e.printStackTrace();
}
}
private static void readFile() {
System.out.println("파일명: " + filename);
try (Reader reader = new FileReader(filename)) {
int data;
String message = "";
while ((data = reader.read()) != -1) {
System.out.print((char) data); // 읽은 데이터를 char로 변환
message += (char) data;
}
System.out.println("\n전체 내용: " + message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
코드 분석
- FileWriter를 이용한 파일 쓰기:
- writer.write("내용"): 텍스트 파일에 데이터를 기록합니다.
- flush(): 내부 버퍼를 비워 기록이 누락되지 않도록 보장합니다.
- FileReader를 이용한 파일 읽기:
- reader.read(): 파일에서 한 번에 한 문자(char)를 읽어옵니다.
- 읽은 데이터는 문자로 변환해 출력합니다.
- 문자 스트림 사용 이유:
- FileReader와 FileWriter는 텍스트 데이터를 효율적으로 처리하기 위해 설계되었습니다.
- 바이트 스트림(FileInputStream, FileOutputStream)과 달리 문자 데이터를 직접 처리할 수 있습니다.
프로그램 실행 결과
- BufferedCharStreamEx 실행 결과:
원본 파일 last-leaf.txt에서 "leaf" 또는 "leaves"가 포함된 줄만 필터링해 새 파일 last-leaf-filtered.txt에 저장됩니다. - CharStreamEx 실행 결과:
- 파일 쓰기:
아카데미 Java Programming 2024.04
- 파일 읽기:
아카데미 Java Programming 2024.04
- 파일 쓰기:
요약
- 스트림(Stream)이란?
- 데이터가 이동하는 통로를 의미합니다.
- 입력 스트림: 데이터를 읽는 데 사용됩니다.
- 출력 스트림: 데이터를 쓰는 데 사용됩니다.
- BufferedReader/BufferedWriter의 장점:
- 데이터를 줄 단위로 처리해 효율적입니다.
- 대용량 데이터를 다룰 때 성능이 뛰어납니다.
- FileReader/FileWriter의 특징:
- 텍스트 데이터를 읽고 쓸 때 간편하게 사용할 수 있습니다.
마무리
이번 글에서는 BufferedCharStream과 CharStream을 활용해 Java에서 파일을 다루는 방법을 알아봤습니다.
BufferedReader/BufferedWriter는 줄 단위 데이터 처리에, FileReader/FileWriter는 간단한 텍스트 읽기/쓰기에 적합합니다.
파일 입출력은 다양한 상황에서 사용되므로, 예제를 직접 따라 해보며 익숙해지세요! 😊

반응형
'개발 > JAVA' 카테고리의 다른 글
JDBC와 오라클 데이터베이스: 자바로 간단한 작가 관리 애플리케이션 만들기 (4) | 2025.01.23 |
---|---|
Java 입출력과 텍스트 처리: Scanner와 StringTokenizer 활용하기 (18) | 2025.01.22 |
Java 파일 입출력 처리 및 파일 복사 예제 (8) | 2025.01.20 |
자바 I/O 스트림 이해하기: BufferedStream, ByteArrayStream, DataStream 활용하기 ✨ (6) | 2025.01.17 |
JAVA의 함수형 프로그래밍과 Stream 활용하기 (7) | 2025.01.16 |