우주코딩
바이트 스트림 데이터 입출력, FileWriter, FileReader 본문
바이트 스트림으로 텍스트 출력하기
데이터를 내보내는 곳
데이터를 가져오는 곳
파일 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 |