본문 바로가기
기초 및 언어/▶ Java&JSP

37. 문자 스트림 (FileReader / FileWriter / InputStreamReader)

by 류딩이 2025. 8. 29.

📌 Java I/O : 문자 스트림 (FileReader / FileWriter / InputStreamReader)


1. 문자 스트림이란?

  • 바이트 스트림(InputStream, OutputStream)은 byte 단위 입출력
  • 문자 스트림(Reader, Writer)은 2바이트 유니코드 단위 입출력 (한글 처리에 적합)
  • BufferedReader / BufferedWriter : 버퍼 사용으로 성능 향상
  • InputStreamReader : 바이트 스트림을 문자 스트림으로 변환

2. Ex05_문자스트림 : BufferedReader / BufferedWriter

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;

public class Ex05_문자스트림 {
    public static void main(String[] args) {
        FileWriter fw = null;
        BufferedWriter bw = null; 
        FileReader fr = null;
        BufferedReader br = null;
        try {
            // 콘솔 출력 스트림 (PrintStream)
            System.out.println(123);
            PrintStream ps = System.out; 
            ps.println(456);

            // 파일 쓰기
            fw = new FileWriter("write.txt", false); 
            bw = new BufferedWriter(fw, 4); 
            bw.write("안녕하세요");
            bw.newLine();
            bw.write("안녕하세요");

            // flush() 후 읽기 가능
            bw.flush();

            // 파일 읽기
            fr = new FileReader("write.txt");
            br = new BufferedReader(fr, 4);

            // 1) 한 글자씩 읽기
            int r;
            while((r = br.read()) != -1) {
                System.out.print((char)r);
            }

            // 2) 한 줄씩 읽기
            String line;
            while((line = br.readLine()) != null) {
                System.out.println(line);
            }

        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bw.close();
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

📖 핵심 포인트

  • BufferedWriter.newLine() → 줄바꿈
  • br.read() : 한 글자씩 읽기 (int 반환, -1이면 EOF)
  • br.readLine() : 한 줄 단위로 읽기 (엔터 전까지)
  • flush() : 버퍼 내용을 강제로 파일에 기록
  • close() : 스트림 닫으면서 flush 자동 실행

2. Ex06_InputStreamReader

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Ex06_InputStreamReader {
    public static void main(String[] args) throws IOException {

        System.out.println("문자열 입력 : ");
        InputStream is = System.in; // 바이트 입력
        InputStreamReader isr = new InputStreamReader(is); // 바이트 → 문자 변환
        BufferedReader br = new BufferedReader(isr); // 버퍼로 성능 향상

        String s = br.readLine(); // 한 줄 입력받기 (공백 포함)
        System.out.println(s);
    }
}

 

📖 특징

  • System.in 은 바이트 입력 → 한글 입력 불가
  • InputStreamReader 로 감싸면 문자 입력 처리 가능
  • BufferedReader.readLine() → 한 줄 전체 입력 (공백 포함)

3. Ex07_예제1 (간단 단어장)

📝 코드 개요

  • 메뉴 선택: 1. 단어입력 2. 단어검색 3. 종료
  • word.txt 파일에 단어/뜻 저장
  • 검색 시 입력한 단어가 파일에 있으면 대응되는 뜻 출력
class Voca {
    public int inputMenu(Scanner sc){ ... }
    public void inputWord(){ ... }
    public void findword() throws Exception { ... }
}

public class Ex07_예제1 {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);	
        while(true) {
            Voca voca = new Voca();
            int menu = voca.inputMenu(sc);
            switch(menu) {
                case 1: voca.inputWord(); break;
                case 2: voca.findword(); break;		
                case 3: System.out.println("종료되었습니다."); return;
            }
        }
    }
}

📖 특징

  • FileWriter + BufferedWriter → 단어/뜻 저장
  • FileReader + BufferedReader → 파일에서 검색
  • split("/") 로 단어/뜻 분리

4. Ex08_Scanner

📝 코드

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Ex08_Scanner {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner sc = new Scanner(new File("read.txt")).useDelimiter(",");
        
        int num, sum=0, count=0;
        while(sc.hasNextInt()) {
            count++;
            num = sc.nextInt();
            System.out.println(num);
            sum += num;
        }
        System.out.println("합계 :" + sum);
        System.out.println("평균 :" + sum / (double)count);
        
        sc.close();
    }
}

 

📄 read.txt

10,20,30,40,50

💻 실행 결과

10
20
30
40
50
합계 :150
평균 :30.0

📖 특징

  • useDelimiter(",") → 구분자를 쉼표로 변경
  • nextInt() → 정수 단위 입력
  • 합계와 평균 구하기

5. Ex09_숙제2 (단어장 프로그램)

📝 코드 개요

  • 메뉴 : 1.단어입력 2.단어검색 3.종료
  • voca.txt 파일에 계속 단어 추가
  • 대소문자 구분 없이 검색 가능 (compareToIgnoreCase)
while(true) {
    System.out.print("1.단어입력 2.단어검색 3.종료 >> ");
    menu = sc.next();
    switch(menu) {
        case "1":
            // 단어/뜻 입력 받아 파일에 기록
            ...
            break;
        case "2":
            // 파일에서 검색 (ignoreCase)
            ...
            break;
        case "3":
            System.out.println("프로그램을 종료합니다.");
            System.exit(0);
    }
}

 

📖 실행 예시

1.단어입력 2.단어검색 3.종료 >>1
단어/뜻 입력>>apple/사과
1.단어입력 2.단어검색 3.종료 >>1
단어/뜻 입력>>desk/책상
1.단어입력 2.단어검색 3.종료 >>2
검색 단어 입력>>desk
단어>desk
뜻>책상
1.단어입력 2.단어검색 3.종료 >>2
검색 단어 입력>>chair
찾는 단어 없음
1.단어입력 2.단어검색 3.종료 >>3
프로그램을 종료합니다.
구분 Scanner BufferedReader
입력 단위 토큰 단위 (next(), nextInt()) 라인 단위 (readLine())
공백 처리 공백을 기준으로 분리 공백 포함해서 입력 가능
속도 상대적으로 느림 빠름 (버퍼 사용)
코드 편의성 간단 약간 복잡 (스트림 체인 필요)
공백 포함 입력 불가 가능
장점 사용 간단, 형변환 관리 성능 우수, 대용량 처리 적

 


📌 전체 요약

  • BufferedReader / BufferedWriter : 파일 입출력 시 속도 향상, 줄 단위 처리 가능
  • InputStreamReader : 바이트 입력(System.in 등)을 문자 입력으로 변환
  • Scanner : 간단한 입력 처리 (토큰 단위) / 구분자 지정 가능
  • 단어장 예제 : 파일 쓰기/읽기 + 검색 기능을 통해 실습

 

 

 

'기초 및 언어 > ▶ Java&JSP' 카테고리의 다른 글

BookJDBC  (0) 2025.09.02
38. SimpleJDBC (Select, Insert, Delete, Update)  (1) 2025.09.01
36. Buffer  (0) 2025.08.29
35. 바이트스트림  (0) 2025.08.26
34. HashMap  (1) 2025.08.26