Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

우주코딩

바이트 스트림 데이터 입출력, FileWriter, FileReader 본문

자바 본 강의

바이트 스트림 데이터 입출력, FileWriter, FileReader

우주코딩 2021. 9. 10. 10:09

바이트 스트림으로 텍스트 출력하기

데이터를 내보내는 곳
데이터를 가져오는 곳

파일 FileOutputStream
배열 ByteArrayOutputStream
프로세스 PipedOutputStream
입출력 담당하는 클래스들을 Sink Stream 클래스라고 부른다.

String 객체의 데이터를 출력하려면 문자열을 담은 byte[] 배열을 리턴 받아야 한다. 명확하게 UTF-8 을 지정해주어야한다.

byte[] bytes = str.getBytes("UTF-8");
for (byte b : bytes) {
System.out.printf("%x ", b);
}

getBytes(문자집합)

바이트 스트림 텍스트 데이터 읽기

File(UTF-8) 텍스트파일
FileInputStream -> 바이트배열 -> new String (byte[], 문자집합)

JVM 문자열(UTF-16BE) char 타입
JVM이 문자를 다룰 때 UTF-16BE 문자표를 사용한다.
변환할 때 file.encoding 환경 변수에 설정된 문자표에 따라 변환한다.

new String (byte[], 시작값, 읽을 바이트 수, "문자표");
바이트 배열에 들어있는 문자 코드가 어떤 문자표로 인코딩 되었는지 알려주면 제대로 변환될 것이다.

JVM 환경 변수 'file.encoding'에 설정된 문자표에 상관없이 String 객체를 만들 때 바이트 배열의 인코딩 문자 집합을 정확하게 알려준다면, UCS2 코드 값으로 정확하게 변환해 줄 것이다.

자바 I/O 스트림 클래스

Data Processing Stream Classes

바이트 스트림 / 캐릭터 스트림
DataOutputStream / BufferedReader
DataInputStream / BufferedWriter
ObjectInputStream / LineNumberReader
ObjectOutputStream / PrintWriter
BufferedInputStream
BufferedOutputStream

Decorator : 다른 스트림에 연결해서 기능을 덧붙이는 역할

프로세스 간 pipe 연결

프로세스 - 실행 중인 프로그램

A -- data 전송 -- > B
한 쪽에서 데이터를 주고 한 쪽에서 받는 것을 파이프라고 한다.

파이프로 연결해야 프로그램을 실행한다.
파이프를 연결하는 방법 : $ A | B

FileWriter

FileWriter -> 출력 -> 파일
개발자가 문자열을 특정 문자표에 따라서 바이트배열로 직접 변환할 필요가 없다.

출력 스트림 클래스에서 file.encoding 에 지정된 문자표에 따라 자동으로 인코딩하여 출련한다.

FileOutputStream (바이트스트림)-- write() 출력 -> 1바이트만 변환 작업 없이 그대로 출력

FileWriter (캐릭터스트림) -- write() 출력 -> UTF-16 => UTF-8 변환

FileReader

텍스트파일 -> 읽기 -> FileReader
읽을 때 UTF-8을 UTF-16BE 방식으로 변환하여 리턴한다.
영어는 1byte씩 한글은 3byte씩 읽는다

UCS2 문자 코드 값을 저장할 배열을 준비한다.
=> 이렇게 임시 데이터를 저장하기 위해 만든 바이트 배열을 보통 "버퍼(buffer)"라 한다.
char[] buf = new char[100];

read(버퍼의주소)
=> 버퍼가 꽉 찰 때까지 읽는다. 물론 버퍼 크기보다 파일의 데이터가 적으면 파일을 모두 읽어 버퍼에 저장한다.
=> 리턴 값은 읽은 문자의 개수이다. 바이트의 개수가 아니다!!!!!
FileInputStream.read()의 리턴 값은 읽은 바이트의 개수였다. 파일을 읽을 때 JVM 환경 변수 'file.encoding'에 설정된 문자코드표에 따라 바이트를 읽는다.

그리고 2바이트 UCS2 코드 값으로 변환하여 리턴한다. JVM의 문자코드표가 UTF-8이라면, 파일을 읽을 때, 영어나 숫자, 특수기호는 1바이트를 읽어 UCS2으로 변환할 것이고 한글은 3바이트를 읽어 UCS2으로 변환할 것이다.

인코딩과 디코딩

Data -> 가공 -> Data' 로 만드는 일
여기서 가공을 encoding 이라고 한다. ~화 한다 => 코드화 한다 => 특정 규칙에 따라 변환한다.

Data' -> 원래 데이터로 복원 -> Data
여기서 복원을 decoding이라고 한다. de : 반대

예시 > data --- 압축 ---> .zip
비트맵 --- 인코딩 ---> .gif

'자바 본 강의' 카테고리의 다른 글

File 입출력 클래스  (0) 2021.09.10
예외처리하기 Exception  (0) 2021.09.01
List와 Set, HashSet, HashMap  (0) 2021.08.26
인터페이스 정리, Stack 클래스, Stack과 Deque  (0) 2021.08.26
람다 문법  (0) 2021.08.25
Comments