📌 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 |