개발/JAVA

Java 입출력 스트림 이해하기: Buffered 및 CharStream 사용 예제

예니03 2025. 1. 21. 10:55
반응형

안녕하세요! 이번 글에서는 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();
        }
    }
}

 

코드 분석

  1. BufferedReader와 BufferedWriter 사용:
    • BufferedReader는 텍스트 파일을 줄 단위로 읽는 데 최적화되어 있습니다.
    • BufferedWriter는 텍스트를 빠르게 파일에 기록할 수 있습니다.
  2. 특정 단어 필터링:
    • line.toLowerCase().contains("leaf"): 현재 줄에 "leaf" 또는 "leaves"라는 단어가 포함되었는지 확인합니다.
    • 조건을 만족하는 줄만 새 파일에 기록합니다.
  3. 예외 처리:
    • 파일이 없는 경우 FileNotFoundException을 처리하고, 입출력 중 오류 발생 시 IOException을 처리합니다.
  4. 자동 자원 해제:
    • 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();
        }
    }
}

 

코드 분석

  1. FileWriter를 이용한 파일 쓰기:
    • writer.write("내용"): 텍스트 파일에 데이터를 기록합니다.
    • flush(): 내부 버퍼를 비워 기록이 누락되지 않도록 보장합니다.
  2. FileReader를 이용한 파일 읽기:
    • reader.read(): 파일에서 한 번에 한 문자(char)를 읽어옵니다.
    • 읽은 데이터는 문자로 변환해 출력합니다.
  3. 문자 스트림 사용 이유:
    • FileReader와 FileWriter는 텍스트 데이터를 효율적으로 처리하기 위해 설계되었습니다.
    • 바이트 스트림(FileInputStream, FileOutputStream)과 달리 문자 데이터를 직접 처리할 수 있습니다.

프로그램 실행 결과

  1. BufferedCharStreamEx 실행 결과:
    원본 파일 last-leaf.txt에서 "leaf" 또는 "leaves"가 포함된 줄만 필터링해 새 파일 last-leaf-filtered.txt에 저장됩니다.
  2. CharStreamEx 실행 결과:
    • 파일 쓰기:
      아카데미
      Java Programming
      2024.04
    • 파일 읽기:
      아카데미
      Java Programming
      2024.04

요약

  1. 스트림(Stream)이란?
    • 데이터가 이동하는 통로를 의미합니다.
    • 입력 스트림: 데이터를 읽는 데 사용됩니다.
    • 출력 스트림: 데이터를 쓰는 데 사용됩니다.
  2. BufferedReader/BufferedWriter의 장점:
    • 데이터를 줄 단위로 처리해 효율적입니다.
    • 대용량 데이터를 다룰 때 성능이 뛰어납니다.
  3. FileReader/FileWriter의 특징:
    • 텍스트 데이터를 읽고 쓸 때 간편하게 사용할 수 있습니다.

마무리

이번 글에서는 BufferedCharStreamCharStream을 활용해 Java에서 파일을 다루는 방법을 알아봤습니다.
BufferedReader/BufferedWriter는 줄 단위 데이터 처리에, FileReader/FileWriter는 간단한 텍스트 읽기/쓰기에 적합합니다.

파일 입출력은 다양한 상황에서 사용되므로, 예제를 직접 따라 해보며 익숙해지세요! 😊

반응형