본문 바로가기
학교 수업/컴프 2

스트림 이해하기

by JJong | 쫑 2022. 12. 9.
import java.io.*;

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

        // 문자기반의 보조스트림 = new 문자기반의 보조스트림(new 문자기반 스트림 (new File))
        BufferedReader br = new BufferedReader(new FileReader((new File("C:\\Users\\user\\IdeaProjects\\JavaStudy\\text.txt")).getName()));
        String a;
        while ((a = br.readLine()) != null)
            System.out.println(a);
        
        // 문자기반의 보조스트림 = new 문자기반의 보조스트림(new InputStreamReader(new 바이트기반 스트림))
        // InputStreamReader은 바이트기반스트림->문자기반스트림 연결역할
        BufferedReader br2 = new BufferedReader(new InputStreamReader(new FileInputStream("text.txt")));
        String b;
        while ((b = br2.readLine()) != null)
            System.out.println(b);

    }
}

>>123456789156789134567890234567890456789064321`1234567890654321`12345678
>>안녕
>>hello
>>테스트
>>text
>>이게 맞나

--- test.txt 파일 ---
123456789156789134567890234567890456789064321`1234567890654321`12345678
안녕
hello
테스트
text
이게 맞나

스트림을 제대로 이해하기 위해 시작한 공부이다.

'스트림 -> 보조스트림' 과 같이 스트림을 생성하고, 보조 스트림을 만들어 사용하는 것은 잘 알았다. 하지만 이것을 직접 해보려니 인코딩도 안 되어 있어서 파일안에 무언가를 써놓고 이것을 읽어들여 출력을 해도 제대로 된 결과를 보고 있는 건지도 잘 몰랐다. 그 이유는 내가 사용했던 스트림과 보조스트림은 바이트기반 스트림이기 때문인데 바이트기반은 1byte를 읽고 써내려가는 반면, 우리가 흔히 사용하는 문자는 2byte이기 때문에 바이트 스트림으로는 제대로 확인이 어려운 것이다. 그래서 문자기반의 스트림을 이용하기로 마음 먹었다.

하지만 문자기반 스트림을 공부할 때에 이해하기가 정말 난해했던 점이 있었다.

문자기반 스트림은 특이하게 '(문자기반)스트림->(문자기반)보조스트림' 관계 뿐만 아니라 '바이트기반 스트림->문자기반 스트림' 관계를 가질수도 있다. 그 이유는 바이트에서 문자로 변환해주는, 인코딩(encoding) 해주는 중간다리 역할을 누군가 수행해주고 있기 때문이다.

그리고 이 코드에서 그 역할은 InputStreamReader가 해주고 있다. (출력의 경우에는 OutputStreamWriter 또한 그 역할을 해준다.)

그리고 우리가 흔히 사용할 문자기반 스트림을 원활하게 사용하기 위해서는 무엇이 바이트기반 (보조)스트림이고 무엇이 문자기반 (보조)스트림인지 잘 알아야 한다.

InputStream, OutputStream 은 모두 바이트기반

Reader, Writer 는 모두 문자기반

InputStream-Reader는 입력, OutputStream-Writer은 출력이다. 이건 헷갈리지 않도록 하자.

 

'학교 수업 > 컴프 2' 카테고리의 다른 글

Thread.join()동작  (0) 2022.12.02

댓글