[Java] 문자 스트림
2021. 12. 17. 15:43ㆍLanguage`/Java
문자 스트림 클래스
- Reader/Writer 형식
- FileReader/FileWriter
- FileInputStream(InputStreamReader)/FileOutputStram(OutputStreamWriter)
- 2byte의 유니코드 문자를 단위로 입출력하는 스트림
- 이미지, mp3 같은 바이너리 바이트 값들은 처리 X
- 문자 입력 스트림 : 바이트들을 전달 받음 → 해당 바이트들을 '로컬 문자 집합(MS949)'에 있는 문자인지 비교하여 문자로 변환
FileReader
- 문자열 단위의 자료처리
- FileReader(File file) : file로부터 읽는 FileReader 생성
- FileReader(String name) : name이름의 파일로부터 읽는 FileReader 생성
FileReader fin = new FileReader("src/test.txt");
FileReader 메소드
- int read()
- 1개의 문자를 읽어서 정수형으로 리턴
- int read(char[] buf)
- 문자들을 읽어서 buf 배열에 저장하고, 읽은 개수 리턴
- int read(char[] buf, int off, int len)
- 최대 len개수의 문자들을 읽어서 buf 배열의 off위치부터 저장하고 실제 읽은 개수 리턴
파일 입출력과 예외 처리(try-catch)
- 예외 1) 파일의 경로명이 틀린 경우 → FileNotFoundException 예외 발생
- 예외 2) 파일 읽기(read()), 쓰기(write()), 닫기(close())를 하는 동안 입출력 오류 발생 → IOException 예외 발생
- ∴ 파일 입출력 코드에는 try-catch 블록이 필요하다
※ read() 메소드 관련
int c = fin.read() // 한 바이트를 읽어서 int 타입으로 리턴
while((c = fin.read()) != -1){ // 파일의 끝을 만나면 -1을 리턴
System.out.print((char)c);
}
- 파일의 끝을 만나면 read()는 -1을 리턴한다
- int 타입의 -1(파일의 끝) : 0xFFFFFFFF
- 만약에 파일에 0xFF값이 있다고 예를 들어보면
- 0xFF는 -1이고 파일의 끝도 -1인데 구분하는 방법이 있나
- read()는 int타입으로 리턴하기 때문에 0xFF는 32비트로 0x000000FF를 리턴한다
- 따라서 0xFF와 파일의 끝을 의미하는 -1은 int타입으로 비교하면 완전히 다른 값
- ∴ read()의 리턴 타입을 int로 해서 파일의 끝을 정확하게 파악하려고 한다
FileInputStream → InputStreamReader
- 바이트(0,1) 단위의 자료처리 → 바이트 데이터를 문자 집합을 통해서 문자로 변환
- InputStreamReader(InputStream in) : in으로부터 읽는 기본 문자 집합 InputStreamReader 생성
- InputStreamReader(InputStream in, Charset cs) : in으로부터 읽는 cs 문자 집합 InputStreamReader 생성
- InputStreamReader(InputStream in, String charsetName) : in으로부터 읽는 charsetName 문자 집합 InputStreamReader 생성
- 읽어 들인 바이트들이 문자 집합에 없으면, 해독할 수 없는 글자가 된다
- FileInputStream과 항상 같이 사용
FileInputStream fin = new FileInputStream("src/test.txt");
InputStreamReader in = new InputStreamReader(fin, "MS949");
- FileInputStream : 파일에 존재하는 문자들을 바이트 데이터로 읽기
- InputStreamReader : 바이트 데이터들을 문자로 변환
InputStreamReader 메소드
- int read()
- 1개의 문자를 읽어서 정수형으로 리턴
- int read(char[] buf)
- 문자들을 읽어서 buf 배열에 저장하고, 읽은 개수 리턴
- int read(char[] buf, int off, int len)
- 최대 len개수의 문자들을 읽어서 buf 배열의 off위치부터 저장하고 실제 읽은 개수 리턴
- String getEncoding()
- 스트림이 사용하는 문자 집합의 이름(ASCII, UTF-8, CP949,...) 리턴
- void close()
- 입력 스트림을 닫고 관련된 시스템 자원 해제
FileWriter
- 텍스트 파일에 직접 문자 데이터를 작성
- FileWriter(File file) : file에 데이터를 저장할 FileWriter 생성
- FileWriter(String name) : name 파일에 데이터를 저장할 FileWriter 생성
- FileWriter(File file, boolean append) : append가 true이면 파일의 마지막부터 데이터 저장
- FileWriter(String name, boolean append) : append가 true이면 파일의 마지막부터 데이터 저장
FileWriter/OutputStreamWriter 메소드
- void write(int c)
- c를 char로 변환해서 파일에 작성
- void write(String str)
- 문자열 str를 파일에 작성
- void write(String str, int off, int len)
- 문자열 str의 인덱스 off부터 len개의 문자를 파일에 작성
- void write(char[] buf, int off, int len)
- 배열 buf의 인덱스 off부터 len개의 문자를 파일에 작성
FileOutputStream → OutputStreamWriter
- 문자들을 문자 집합을 통해서 바이트들로 디코딩해서 스트림으로 출력
- OutputStreamWriter(OutputStream out) : out에 출력하는 기본 문자 집합의 OutputStreamWriter 생성
- OutputStreamWriter(OutputStream out, Charset cs) : out에 출력하는 cs 문자 집합의 OutputStreamWriter 생성
- OutputStreamWriter(OutputStream out, String charsetName) : charsetName 문자 집합의 OutputStreamWriter 생성
- FileOutputStream과 항상 같이 사용
- FileOuputStream : 프로그램 내의 바이너리 값을 그대로 파일에 저장
- OuputStreamWriter : 파일에 있는 바이너리 값을 문자 스트림으로 변경해서 출력
OutputStreamWriter 메소드
void write(int c)
- c를 char로 변환해서 파일에 작성
void write(String str)
- 문자열 str를 파일에 작성
void write(String str, int off, int len)
- 문자열 str의 인덱스 off부터 len개의 문자를 파일에 작성
void write(char[] buf, int off, int len)
- 배열 buf의 인덱스 off부터 len개의 문자를 파일에 작성
void flush()
- 스트림에 남아있는 데이터들을 버퍼에서 없애기
String getEncoding()
- 스트림이 사용하는 문자 집합의 이름 리턴
void close()
- 출력 스트림을 닫고 관련된 시스템 자원 해제