방송대 Java프로그래밍 9강: 스트림 선택과 파일 입출력 파이프라인
파일을 읽는다는 말만으로는 어떤 클래스를 써야 할지 정할 수 없다. 데이터가 들어오는지 나가는지, 바이트인지 문자인지, 처음부터 순서대로 처리할지 특정 위치로 이동할지, 버퍼나 변환 기능이 필요한지를 차례로 판정해야 한다. 이 글은 이 네 결정을 하나의 입출력 파이프라인으로 연결해 클래스 선택과 코드 실행 흐름을 스스로 재현하도록 돕는다.
입출력은 생산자와 소비자 사이에 통로를 놓는 일이다
스트림(stream)은 데이터 생산자와 프로그램, 또는 프로그램과 데이터 소비자를 연결하는 순서 있는 데이터 흐름이다. 프로그램을 기준으로 외부에서 데이터가 들어오면 입력 스트림, 프로그램이 만든 데이터가 외부로 나가면 출력 스트림이다. 같은 파일도 읽을 때는 입력의 원천이고 쓸 때는 출력의 목적지가 된다.
| 프로그램 기준 방향 | 데이터 이동 | 대표 동작 | 최상위 계열 |
|---|---|---|---|
| 입력 | 생산자 → 프로그램 | 읽기 | InputStream, Reader |
| 출력 | 프로그램 → 소비자 | 쓰기 | OutputStream, Writer |
여기서 방향은 파일의 관점이 아니라 현재 프로그램의 관점으로 정한다. 예를 들어 파일 복사 프로그램은 원본 파일에 대해서는 입력 스트림을, 사본 파일에 대해서는 출력 스트림을 동시에 가진다. 스트림은 파일뿐 아니라 주변 장치와 네트워크 소켓 등에도 같은 방식으로 적용할 수 있으며, 관련 클래스는 주로 java.io 패키지가 제공한다.
첫 번째 오개념: 입력과 출력을 키보드와 화면의 별칭으로 외우면 파일 복사에서 막힌다. 올바른 기준은 “데이터가 프로그램 안으로 들어오는가, 밖으로 나가는가”이다.
스트림 선택은 방향·단위·연결 대상·보조 기능의 네 단계다
클래스 이름을 하나씩 암기하기보다 파이프라인을 네 단계로 조립하면 선택 범위가 빠르게 좁아진다. 먼저 방향을 정하고, 데이터의 의미에 맞는 처리 단위를 고른다. 그다음 실제 데이터 원천이나 목적지에 연결되는 기본 스트림을 만든 뒤, 필요한 기능이 있으면 보조 스트림으로 감싼다.
- 방향: 읽기라면 입력, 쓰기라면 출력이다.
- 처리 단위: 이미지·오디오처럼 원시 바이트를 보존해야 하면 바이트 계열, 텍스트를 문자로 해석해야 하면 캐릭터 계열이다.
- 연결 대상: 파일, 바이트 배열, 문자열, 콘솔 등 실제 원천·목적지에 맞는 기본 스트림을 고른다.
- 보조 기능: 버퍼링, 기본 자료형 입출력, 출력 형식, 행 처리, 바이트-문자 변환 등이 필요하면 보조 스트림을 덧붙인다.
| 처리 단위 | 입력의 뿌리 | 출력의 뿌리 | 파일 연결 예 | 적합한 데이터 |
|---|---|---|---|---|
| 바이트 | InputStream | OutputStream | FileInputStream, FileOutputStream | 이미지, 오디오, 실행 파일 등 |
| 문자 | Reader | Writer | FileReader, FileWriter | 문자 단위로 다룰 텍스트 |
판단 핵심: “파일이니까 File 클래스를 쓴다”가 아니라, 경로 정보만 다루는지 실제 내용을 읽고 쓰는지부터 구분한다. 내용 입출력에는 스트림이 필요하다.
네 최상위 추상 클래스가 읽기와 쓰기의 공통 동작을 정한다
InputStream과 OutputStream은 바이트 단위 입출력 계열의 최상위 추상 클래스다. Reader와 Writer는 문자 단위 입출력 계열의 최상위 추상 클래스다. 실제 프로그램에서는 파일이나 배열에 연결되는 하위 클래스를 만들지만, 공통 메서드는 상위 클래스의 규약을 따른다.
| 계열 | 핵심 메서드 | 반환값·효과 | 주의할 상태 |
|---|---|---|---|
InputStream | read(), read(byte[]) | 한 바이트 또는 읽은 바이트 수를 반환 | 더 읽을 데이터가 없으면 -1 |
OutputStream | write(int), write(byte[]) | 한 바이트 또는 배열의 바이트를 출력 | 버퍼가 있다면 flush() 고려 |
Reader | read(), read(char[]), ready() | 한 문자 또는 읽은 문자 수를 반환 | 문자 입력의 끝도 -1 |
Writer | write(int), write(char[]), write(String) | 문자·문자 배열·문자열을 출력 | 완료 뒤 flush()와 close() |
배열을 받는 메서드에는 일부 구간만 처리하는 형태도 있다. off는 배열에서 시작할 위치, len은 처리할 원소 수다. 입력 계열의 skip(n)은 일정량을 건너뛰며, mark()와 reset()은 지원되는 스트림에서 위치를 표시했다가 되돌리는 데 쓰인다.
두 번째 오개념: read()가 반환한 정수를 곧바로 유효한 데이터로 가정하면 입력 끝의 -1까지 써 버릴 수 있다. 먼저 -1인지 검사하고, 그다음 필요한 형으로 해석한다.
한 바이트 복사는 읽기·판정·쓰기·다음 읽기의 순환이다
다음 코드는 강의의 파일 복사 흐름을 학습용으로 단순화한 예다. 원본과 사본을 바이트 스트림으로 연결하고, read()가 반환한 값을 검사한 뒤 그대로 write()에 넘긴다. 이미지처럼 바이트가 변형되면 안 되는 자료에도 같은 원리가 적용된다.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteCopy {
public static void main(String[] args) {
try (FileInputStream in = new FileInputStream("source.bin");
FileOutputStream out = new FileOutputStream("copy.bin")) {
int value;
while ((value = in.read()) != -1) {
out.write(value);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
실행 상태를 세 칸으로 추적해 보자. 첫 읽기에서 value가 65라면 입력 위치가 한 바이트 앞으로 이동하고 65가 출력된다. 다음 값이 66이면 같은 일이 반복된다. 마지막 읽기에서 -1이 반환되면 조건이 거짓이 되어 쓰지 않고 반복을 끝낸다. 즉 -1은 파일 내용이 아니라 종료 신호다.
try 괄호 안에서 자원을 만든 형태는 블록을 벗어날 때 스트림을 닫는다. 출력 스트림의 flush()는 남아 있는 데이터를 최종 목적지로 보내고, close()는 자원을 반환한다. 닫기와 비우기는 역할이 다르므로 “화면에 보였다”만으로 자원 정리가 끝났다고 판단하지 않는다.
File 객체는 경로를 표현하지만 파일 내용을 운반하지 않는다
File은 파일이나 디렉터리의 상대·절대 경로를 표현하고, 존재 여부와 종류·이름·크기 같은 정보를 조회하거나 생성·삭제를 요청한다. 그러나 입력과 출력 메서드는 제공하지 않는다. 파일의 표찰과 위치 정보는 File이 맡고, 내용의 이동은 스트림이 맡는다고 나누면 된다.
| 판단 목적 | 주요 메서드 | 결과를 읽는 법 |
|---|---|---|
| 존재·종류 확인 | exists(), isFile(), isDirectory() | 경로가 가리키는 대상의 상태를 불리언으로 확인 |
| 이름·경로·크기 조회 | getName(), getPath(), length() | 파일 크기는 바이트 단위이며 디렉터리 판단과 분리 |
| 생성·삭제 | createNewFile(), delete(), mkdir(), mkdirs() | mkdir()는 마지막 디렉터리, mkdirs()는 필요한 상위 경로까지 생성 |
| 목록·상위 경로 | list(), listFiles(), getParent(), getParentFile() | 문자열 목록인지 File 객체 목록인지 반환형으로 구분 |
File target = new File("reports/week9.txt");
if (target.exists() && target.isFile()) {
System.out.println(target.getName() + ": " + target.length());
}
이 코드는 내용을 읽지 않는다. 경로가 실제 파일을 가리키는지 확인한 뒤 이름과 크기만 조회한다. 내용을 읽으려면 이 File 객체를 FileInputStream이나 FileReader의 생성자에 전달해야 한다.
순차 접근과 임의 접근은 파일 위치를 움직이는 방식이 다르다
기본 파일 스트림은 현재 위치에서 다음 데이터를 순서대로 읽거나 쓴다. 반면 RandomAccessFile은 하나의 파일 포인터를 두고 seek(long pos)로 임의의 바이트 위치로 이동한 다음 읽기 또는 쓰기를 수행한다. 생성 모드 "r"은 읽기 전용, "rw"는 읽기·쓰기 겸용이다.
직접 구성한 추적 예로 파일의 첫 네 바이트가 차례대로 10, 20, 30, 40이라고 하자. 파일을 연 직후 포인터는 위치 0이다.
read()를 한 번 실행하면 값 10을 얻고 포인터는 위치 1로 이동한다.seek(3)을 실행하면 중간 데이터를 읽지 않고 위치 3으로 이동한다.- 다시
read()를 실행하면 값 40을 얻고 포인터는 위치 4가 된다.
try (RandomAccessFile file = new RandomAccessFile("scores.dat", "rw")) {
file.seek(3);
int fourth = file.read();
System.out.println(fourth);
}
판단 핵심: 데이터 형식이 텍스트인지보다 “원하는 위치로 직접 이동해야 하는가”가 RandomAccessFile 선택의 결정적 질문이다. seek()의 위치는 문자 번호가 아니라 바이트 위치로 해석한다.
텍스트 파일은 Reader와 Writer 계열로 의미를 드러낸다
FileReader와 FileWriter는 텍스트 파일을 문자 단위로 읽고 쓰는 기본 스트림이다. 바이트를 그대로 보존하는 일이 목적이면 파일 바이트 스트림을, 프로그램에서 문자로 다루는 일이 목적이면 파일 캐릭터 스트림을 선택한다.
try (FileReader reader = new FileReader("message.txt");
FileWriter writer = new FileWriter("message-copy.txt")) {
int ch;
while ((ch = reader.read()) != -1) {
writer.write(ch);
}
}
여기서 ch의 형이 int인 이유는 실제 문자 값뿐 아니라 입력 끝을 나타내는 -1도 표현해야 하기 때문이다. FileWriter(File, boolean append)처럼 두 번째 인수로 이어 쓰기 여부를 지정하는 생성자도 있다. 새 내용을 기존 내용 뒤에 붙일 것인지, 새 출력으로 다룰 것인지는 파일을 열기 전에 의도적으로 결정해야 한다.
보조 스트림은 기본 스트림을 감싸 기능을 한 겹 추가한다
보조 스트림은 그 자체로 파일이나 장치와 직접 연결되어 입출력을 완성하지 않는다. 먼저 원천·목적지에 연결되는 기본 스트림을 만들고, 그 객체를 보조 스트림 생성자의 인수로 전달한다. 바깥쪽 보조 스트림을 통해 읽고 쓰면 내부 기본 스트림까지 연결된 파이프라인이 작동한다.
FileInputStream fileIn = new FileInputStream("records.bin");
BufferedInputStream bufferedIn = new BufferedInputStream(fileIn);
int value = bufferedIn.read();
bufferedIn.close();
호출 방향은 bufferedIn.read()에서 시작하지만 데이터는 파일 → FileInputStream → BufferedInputStream → 프로그램 순서로 전달된다. 생성 순서와 데이터 이동 방향을 혼동하지 않는 것이 중요하다.
| 추가하려는 기능 | 대표 보조 스트림 | 기본 스트림과의 관계 |
|---|---|---|
| 버퍼링 | BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter | 같은 처리 단위의 기본 스트림을 감쌈 |
| 기본 자료형 입출력 | DataInputStream, DataOutputStream | 바이트 스트림에 자료형 단위 기능을 추가 |
| 형식 있는 출력 | PrintStream, PrintWriter | 다양한 값을 출력하기 편한 메서드를 제공 |
| 행 단위 처리·행 번호 | LineNumberReader | BufferedReader의 기능을 바탕으로 행 정보 추가 |
| 바이트-문자 변환 | InputStreamReader, OutputStreamWriter | 두 스트림 계열 사이를 연결 |
LineNumberReader는 행을 읽는 흐름에 번호 상태를 더한다
LineNumberReader는 BufferedReader의 하위 클래스로, 텍스트를 행 단위로 읽는 readLine()과 현재 행 번호를 확인하는 getLineNumber() 등을 제공한다. 행 중심의 로그나 소스 파일을 처리할 때 문자 하나씩 읽는 것보다 작업 의도가 분명하다.
try (FileReader fileReader = new FileReader("tasks.txt");
LineNumberReader lines = new LineNumberReader(fileReader)) {
String line;
while ((line = lines.readLine()) != null) {
System.out.println(lines.getLineNumber() + " | " + line);
}
}
readLine()의 종료 신호는 정수 -1이 아니라 참조값 null이다. 한 문자·바이트를 읽는 read()와 한 행을 읽는 readLine()은 반환형이 다르므로 종료 조건도 함께 바뀐다. 메서드 이름만 보고 같은 조건을 복사하면 오류가 생기는 지점이다.
InputStreamReader는 바이트 입력을 문자 해석 단계로 바꾼다
InputStreamReader는 바이트 입력 스트림을 캐릭터 입력 스트림으로 변환하는 연결 클래스다. 바이트가 어떤 문자로 해석되는지는 문자 인코딩과 함께 결정되므로, 콘솔이나 바이트 기반 원천에서 텍스트를 읽을 때 변환 단계를 명시할 수 있다. 반대 방향의 출력 변환에는 OutputStreamWriter가 대응한다.
import java.io.IOException;
import java.io.InputStreamReader;
try (InputStreamReader reader =
new InputStreamReader(System.in, "euc-kr")) {
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
이 파이프라인은 키보드에서 들어온 바이트 → 지정한 문자 인코딩에 따른 변환 → Java 문자라는 세 단계를 가진다. 바이트 계열과 문자 계열을 단순히 이름만 바꾸는 것이 아니라, 해석 규칙을 적용하는 경계가 생긴다.
세 번째 오개념: 텍스트라면 언제나 FileReader 하나면 충분하다고 생각하기 쉽다. 원천이 이미 InputStream으로 주어졌거나 인코딩을 명시해 변환해야 한다면 InputStreamReader가 파이프라인의 연결점이 된다.
Console은 명령 프롬프트에서 대화형 입력과 출력을 묶는다
Console은 명령 프롬프트 같은 콘솔 환경에서 키보드 입력과 화면 출력을 지원한다. System.console()로 객체를 얻고, readLine()으로 한 행을 읽거나 readPassword()로 화면에 드러내지 않은 채 비밀번호를 입력받는다. writer()와 reader()는 콘솔에 연결된 PrintWriter와 Reader를 돌려준다.
Console console = System.console();
if (console != null) {
String user = console.readLine("name: ");
char[] password = console.readPassword("password: ");
console.printf("welcome, %s%n", user);
}
콘솔 객체를 사용할 때에는 실행 환경도 조건에 포함해 판정해야 한다. 위 예는 객체를 얻지 못한 경우를 먼저 검사해 그 뒤의 메서드 호출을 피한다. 비밀번호는 char[]로 반환된다는 점도 문자열 입력과 구분해야 한다.
새 입출력 문제는 파이프라인 조립표로 해결한다
처음 보는 요구사항에서도 다음 순서를 지키면 클래스 이름을 무작정 떠올릴 필요가 없다.
- 데이터의 이동 방향을 화살표로 쓴다. 프로그램으로 들어오면 입력, 나가면 출력이다.
- 내용을 바이트 그대로 보존할지 문자로 해석할지 정한다. 이 결정으로 두 클래스 계열이 갈린다.
- 실제 원천·목적지를 고른다. 파일이면 파일 기본 스트림, 콘솔이면 콘솔 연결을 선택한다.
- 접근 방식을 확인한다. 순차 처리인지
seek()가 필요한 임의 접근인지 구분한다. - 추가 기능을 바깥쪽에 감싼다. 버퍼, 행 단위 읽기, 자료형 처리, 형식 출력, 인코딩 변환 중 필요한 것만 선택한다.
- 종료 신호와 자원 정리를 코드에 넣는다.
read()의-1,readLine()의null,close()시점을 확인한다.
예를 들어 “키보드 바이트 입력을 UTF-8 문자로 읽는다”면 입력 → 문자 → System.in → 변환 기능이므로 InputStreamReader가 맞다. “이진 파일의 네 번째 바이트를 바로 읽는다”면 파일 → 바이트 → 임의 접근이므로 RandomAccessFile과 seek(3)을 선택한다. 요구사항의 단어를 각 단계에 배치하면 선택 근거가 코드 구조로 그대로 이어진다.
핵심 개념 정리
- 스트림 방향은 프로그램을 기준으로 입력과 출력을 판정한다.
- 바이트 계열의 뿌리는
InputStream·OutputStream, 문자 계열의 뿌리는Reader·Writer다. File은 경로와 상태를 표현하고, 실제 내용 이동은 파일 스트림이 맡는다.RandomAccessFile은 파일 포인터와seek()로 바이트 위치를 직접 선택한다.- 보조 스트림은 기본 스트림을 생성자 인수로 받아 버퍼링·행 처리·형식 출력·변환 같은 기능을 추가한다.
- 한 단위
read()의 끝은-1,readLine()의 끝은null이며, 사용을 마친 자원은 닫는다.
입출력 문제를 만나면 클래스 이름부터 찾지 말고 방향 → 처리 단위 → 연결 대상 → 접근 방식 → 보조 기능 → 종료와 닫기 순서로 요구사항을 분해한다. 이 순서가 정해지면 안쪽에는 실제 데이터와 연결되는 기본 스트림이, 바깥쪽에는 필요한 기능을 더하는 보조 스트림이 놓이고, 실행 흐름까지 자연스럽게 설명할 수 있다.
예상문제 10선
1. Java 프로그램을 기준으로 입력 스트림을 가장 정확히 설명한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 입력은 데이터가 외부의 생산자에서 현재 프로그램 안으로 들어오는 방향이다.
- ② 오답: 프로그램에서 외부 소비자로 나가는 흐름은 출력 스트림이다.
- ③ 오답: 경로와 파일 상태를 표현하는 것은
File의 역할이지 스트림의 정의가 아니다. - ④ 오답: 파일 포인터 이동은
RandomAccessFile의seek()가 수행하는 특정 동작이다.
2. 이미지 파일을 내용 변형 없이 복사할 때 가장 알맞은 기본 스트림 조합은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 두 클래스는 문자를 해석하는 텍스트 파일용 캐릭터 스트림이다.
- ② 오답: 추상 문자 입력 계열과 형식 출력 기능을 섞었으며 원시 이미지 바이트 보존이라는 조건에 맞지 않는다.
- ③ 오답: 콘솔 입력과 문자 파일 출력은 이미지 파일 사이의 복사 경로를 구성하지 못한다.
- ④ 정답: 이미지의 바이트를 그대로 읽고 쓰는 파일 바이트 스트림 조합이다.
3. 입력 스트림의 read() 결과를 파일에 쓰는 반복문에서 가장 먼저 검사해야 할 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 한 번의
read()는 데이터 한 단위나 종료 신호를 반환하지 전체 파일 크기를 반환하지 않는다. - ② 정답:
-1은 더 쓸 데이터가 없다는 종료 신호이므로 쓰기 전에 판정해야 한다. - ③ 오답: 출력 대상 검사는 파일 준비 단계의 문제이며 각 읽기 결과의 유효성 판정은 아니다.
- ④ 오답: 행 번호는 행 단위 문자 처리에서 의미가 있고 바이트 반복의 종료 조건이 아니다.
4. File target = new File("data/report.txt")만 실행한 직후 확실히 말할 수 있는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답:
File생성은 내용 읽기를 수행하지 않으며 입력 스트림도 만들지 않는다. - ② 오답: 객체 생성과 실제 파일 생성은 다르며 파일 생성에는 별도 메서드가 필요하다.
- ③ 정답: 이 문장은 상대 경로를 담은 파일 표현 객체를 구성한다.
- ④ 오답: 문자 출력에는
FileWriter같은 스트림을 별도로 생성해야 한다.
5. mkdir()와 mkdirs()를 구분하는 기준으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답:
mkdir()는 지정 경로의 마지막 디렉터리를,mkdirs()는 필요한 상위 경로까지 만드는 데 사용한다. - ② 오답: 처리 단위의 구분은 바이트 스트림과 캐릭터 스트림 사이의 문제다.
- ③ 오답: 두 메서드는 모두
File의 디렉터리 생성 동작이며 스트림 방향을 정하지 않는다. - ④ 오답: 접근 위치 선택은 기본 파일 스트림과
RandomAccessFile을 비교할 때의 기준이다.
6. 네 바이트가 10, 20, 30, 40인 파일에서 seek(2) 후 read()를 한 번 실행하면 읽는 값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 값 10은 바이트 위치 0에 있으므로
seek(0)뒤에 읽힌다. - ② 오답: 값 20은 바이트 위치 1에 있으며 위치를 1부터 센 결과다.
- ③ 정답: 파일 포인터 위치는 0부터 시작하므로 위치 2에는 세 번째 값 30이 있다.
- ④ 오답: 값 40은 위치 3에 있으므로
seek(3)이 필요하다.
7. “보조 스트림은 파일 이름만 주면 단독으로 입출력할 수 있다”라는 설명을 바로잡은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답:
File은 경로 표현이고 보조 스트림은 입출력 파이프라인에 기능을 더하는 객체다. - ② 오답: 파일 포인터 이동은
RandomAccessFile의 역할이며 보조 스트림 전체의 정의가 아니다. - ③ 오답: 보조 기능을 붙여도 입력 종료를 판정해야 한다는 규칙은 사라지지 않는다.
- ④ 정답: 먼저 기본 스트림을 만들고 이를 보조 스트림 생성자에 전달해 버퍼링·변환 같은 기능을 추가한다.
8. LineNumberReader.readLine()을 반복 호출할 때 입력 종료를 판정하는 값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답:
readLine()은 문자 하나가 아니라String참조를 반환하므로 문자값으로 끝을 판정하지 않는다. - ② 정답: 더 읽을 행이 없을 때
readLine()은null을 반환한다. - ③ 오답: 숫자 0은 유효한 수치일 수 있고 문자열 반환 메서드의 종료 신호가 아니다.
- ④ 오답: 준비 상태를 확인하는
ready()와 혼동한 것으로,readLine()의 반환형은 불리언이 아니다.
9. System.in으로 들어오는 바이트를 지정한 문자 인코딩에 따라 문자로 읽으려면 가장 알맞은 클래스는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 바이트 입력 스트림을 캐릭터 입력 스트림으로 변환하며 문자 인코딩을 적용할 수 있다.
- ② 오답: 이 클래스는 바이트를 파일로 내보내는 출력 스트림이라 방향과 목적지가 모두 다르다.
- ③ 오답: 임의 위치의 파일 바이트를 읽고 쓰는 클래스이며 콘솔 바이트의 문자 변환 기능이 아니다.
- ④ 오답: 경로를 표현하는 클래스이므로
System.in의 데이터를 해석하지 않는다.
10. “텍스트 파일을 행 단위로 읽으며 행 번호도 함께 출력한다”는 요구에 가장 알맞은 파이프라인은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 출력 방향의 바이트 스트림 조합이므로 텍스트 행을 입력받는 요구와 반대다.
- ② 오답: 임의 바이트 위치 이동은 필요하지 않고
FileWriter도 출력용이라 행 입력 파이프라인이 되지 않는다. - ③ 오답: 콘솔 비밀번호 입력 기능은 파일의 행과 행 번호를 처리하지 못한다.
- ④ 정답: 파일 문자 입력을 기본 스트림으로 연결하고 행 처리·행 번호 기능을 보조 스트림으로 추가한 조합이다.
참고 자료와 작성 기준
이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 개념 관계, 코드 추적과 문제 해설은 학습자의 이해를 돕도록 직접 구성하고 검토했습니다.
- 작성·편집: 올에이클래스 학습연구팀
- 주요 근거: 한국방송통신대학교 Java프로그래밍 9강 「java.io 패키지와 스트림」 강의록 :codex-file-citation{path="K1. 컴퓨터과학과/1. 재검토필요/2-1 Java프로그래밍/1. 강의록/java프로그래밍 강의록 9강.pdf" purpose="source"}
- 편집 원칙: 올에이클래스 편집 정책
- 최종 내용 검토: 2026-09-01
댓글
댓글 쓰기