Java - 7. I/O: 파일 인코딩

갓김치·2020년 9월 26일
0

고급자바

목록 보기
24/47
post-custom-banner

참고자료

https://d2.naver.com/helloworld/76650

인코딩 방식

  • 한글 인코딩 방식은 크게 UTF-8과 EUC-KR
  • CP949(MS949)는 EUC-KR의 확장이며 하위호환성이 있음
  • MS949: 윈도우의 기본 한글 인코딩 방식(ANSI계열)
  • UTF-8: 유니코드 UTF-8인코딩 방식
    • 영문자 및 숫자: 1byte, 한글: 3byte -> 가변식
  • US-ASCII: 영문전용 인코딩 방식
  • ANSI는 영어를 표기하기 위해 만든 코드 규격으로 자체에 한글이 없었다가 나중에 여기에 EUC-KR(유닉스계열), CP949(윈도우)이라는 식으로 한글이 포함됨

파일 인코딩

입력

  • InputStreamReader
    • 파일의 인코딩 방식을 지정할 수 있다.
    • 바이트 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환시킨다.
// 파일 인코딩을 이용하여 읽어오기
FileInputStream fis = null;
InputStreamReader isr = null;

try {
  // FileInputStream객체를 생성한 후 이 객체를 매개변수로 받는
  // InputStreamReader 객체를 생성한다.
  // 바이트 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환시킨다.
//fis = new FileInputStream("d:/D_Other/test_utf8.txt");
  fis = new FileInputStream("d:/D_Other/test_ansi.txt");
  isr = new InputStreamReader(fis, "cp949"); // EUC-KR, MS949 (=ANSI계열)
  
  int c;
  while((c=isr.read()) != -1) {
    System.out.print((char) c);
  }
  
  System.out.println();
  System.out.println("출력 끝...");
  
  isr.close(); // 보조스트림만 닫아줘도 보조가 알아서 기반을 닫고 자기도 닫음
} catch (IOException e) {
  e.printStackTrace();
}
  • 인코딩 설정을 잘 했을 때
  • ansi파일을 utf-8로 읽었을 때
  • utf-8파일을 cp949(ms949, euc-kr)로 읽었을 때

출력

  • OutputStreamWriter
    • OutputStream(바이트기반 출력 객체)를 Writer(문자기반의 출력용 객체)로 변환해주는 객체
    • 이 객체도 출력할 때 '인코딩 방식'을 지정해서 출력할 수 있다.
// 키보드로 입력한 내용을 파일로 저장하는데
// out_utf8.txt 파일은 'utf-8' 인코딩 방식으로,
// out_ansi.txt 파일은 'ms949' 인코딩 방식으로 저장한다.

InputStreamReader isr = new InputStreamReader(System.in);

// 파일 출력용
FileOutputStream fos1 = new FileOutputStream("d:/D_Other/out_utf8.txt");
FileOutputStream fos2 = new FileOutputStream("d:/D_Other/out_ansi.txt");

OutputStreamWriter osw1 = new OutputStreamWriter(fos1, "utf-8");
OutputStreamWriter osw2 = new OutputStreamWriter(fos2, "ms949");

int c;

System.out.println("아무거나 입력하세요."); // ctrl+z 누르면 끝

while((c=isr.read()) != -1) {
  osw1.write(c);
  osw2.write(c);
}

System.out.println("작업 완료..."); // 내용은 같으나 인코딩 방식이 다르게 적용됨

isr.close();
osw1.close();
osw2.close();
profile
갈 길이 멀다
post-custom-banner

0개의 댓글