-> 블로그 이전

[Java] 문자 스트림

2021. 12. 17. 15:43Language`/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() 

  • 출력 스트림을 닫고 관련된 시스템 자원 해제