-
보조스트림, 인코딩 -22.04.01고급자바 2022. 4. 1. 14:16728x90

한글은 깨짐이 발생한다..... 바이트기반이 아닌 문자기반으로 처리를 해줘야한다. 정확히는 char기반으로 처리를 해주는 스트림을 이용한다.
<사용자가 입력한 내용을 그대로 파일로 저장하기>
import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; public class T07_FileWriterTest { public static void main(String[] args) { //콘솔(표준 입출력 장치)과 연결된 입력용 문자 스트림 생성 //InputStreamReader => 바이트 기반 스트림을 문자기반 스트림으로 변환해주는 보조 스트림 InputStreamReader isr= new InputStreamReader(System.in); FileWriter fw=null; //파일 출력용 문자기반 스트림 try { fw=new FileWriter("d:/D_Other/testChar.txt"); int data=0; System.out.println("아무거나 입력하세요."); //콘솔에서 입력할 때 입력의 끝 표시는 Ctrl+Z 키를 누른다. while((data=isr.read())!=-1){ fw.write(data); } System.out.println("작업 끝..."); }catch (IOException ex) { ex.printStackTrace(); }finally { try{ isr.close(); fw.close(); }catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } } }Ctrl+Z=> 파일의 끝이라는 것을 체크함


InputStream은 바이트 기반이다 그런데 한글을 하기위해 InputStreamReader 를 이용 기본스트림에 없는 기능만 보조해쥼.. 그래서 바이트 기반 스트림이 꼭 필요하다.
<문자 기반 스트림을 이용한 파일 내용 읽기>
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class T08_FileReaderTest { public static void main(String[] args) { FileReader fr=null; //문자 단위의 입력을 담당하는 Reader형 객체 생성 try { fr=new FileReader("d:/D_Other/testChar.txt"); int data=0; while((data=fr.read())!=-1){ System.out.print((char)data); } }catch (IOException e) { e.printStackTrace(); }finally { try{ fr.close(); }catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } } }
①문자 인코딩(영어: character encoding) 또는 텍스트 인코딩(text encoding) 또는 줄여서 인코딩은 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다.
②인코딩 방식에 대하여...
한글 인코딩 방식은 크게 UTF-8 과 EUC-KR 방식 두가지로 나뉜다.
원래 한글윈도우는 CP949방식을 사용했는데 윈도우를 개발한 마이크로소프트에서 EUC-KR 방식에서
확장하였기 떄문에 MS949라고도 부른다.
한글windows의 메모장에서 말하는 ANSI인코딩이란 CP949(Code Page 949)를 말한다.
CP949는 EUC-KR의 확장이며, 하위 호환성이 있다.
-MS949 => 윈도우의 기본 한글 인코딩 방식(ANSI계열)
-UTF-8 => 유니코드 UTF-8 인코딩 방식(영문자 및 숫자: 1byte, 한글: 3byte) => 가변적
-US-ASCII => 영문 전용 인코딩 방식
ANSI는 영어를 표기하기 위해 만든 코드로 규격 자체에 한글이 없었다가 나중에 여기에 EUC_KR, CP949라는식으로 한글이 포함되었음.
참고)
ASCII => extended ASCII(ISO 8859-1) => 조합형, 완성형(KSC 5601)
-------------------------------------------------------------
=>윈도우 계열: CP949(확장 완성형) - 일부문자(8824자)를 추가함.
=>유닉스 계열: EUC-KR(확장 유닉스 코드)
-------------------------------------------------------------
=>ANSI 계열 => EUC-KR
=>유니코드(UTF-8)
-------------------------------------------------------------

텍스트 파일을 ANSI로 저장한다.
public class T09_FileEncodingTest { public static void main(String[] args) { FileInputStream fis=null; InputStreamReader isr=null; try { /* FileInputStream 객체를 생성 한 후 이 객체를 매개변수로 받는 InputStreamReader객체를 생성한다. */ fis=new FileInputStream("d:/D_Other/test_ansi.txt"); /* 파일의 인코딩정보를 이용하여 읽어오기 InputStreamReader객체는 파일의 인코딩 방식을 지정할 수 있다. 형식)new InputStreamReader(바이트기반스트림, 인코딩방식) */ isr=new InputStreamReader(fis,"CP949"); int data=0; while((data=isr.read())!=-1) { System.out.print((char)data); } System.out.println(); System.out.println("출력 끝..."); } catch (IOException ex) { ex.printStackTrace(); }finally { try { isr.close(); } catch (IOException e) { e.printStackTrace(); } } } }isr=new InputStreamReader(fis,"MS949"); 도 동일한 결과가 나온다.
UTF-8로하면 문제가 생기므로 알맞은 인코딩을 해줘야 한다.

OutputStreamWriter 객체 => 바이트기반의 출력용 객체를 문자기반 출력용 객체로 변환해주는
보조스트림 객체
=>이 객체도 출력할 때 '인코딩방식'을 지정해서 출력할 수 있다.public class T10_FileEncodingTest { /* OutputStreamWriter 객체 => 바이트기반의 출력용 객체를 문자기반 출력용 객체로 변환해주는 보조스트림 객체 =>이 객체도 출력할 때 '인코딩방식'을 지정해서 출력할 수 있다. */ public static void main(String[] args) throws IOException { 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 data=0; System.out.println("아무거나 입력하세요..."); while((data=isr.read())!=-1) { osw1.write(data); osw2.write(data); } System.out.println("작업 완료..."); isr.close(); osw1.close(); osw2.close(); } }

->텍스트파일이 생성된 것을 볼 수 있다.
728x90'고급자바' 카테고리의 다른 글
기본타입 입출력 보조 스트림-22.04.01 (0) 2022.04.01 성능향상을 위한 보조 스트림-22.04.01 (0) 2022.04.01 스트림-22.04.01 (0) 2022.04.01 File객체 만들기-22.03.31 (0) 2022.03.31 람다식-22.03.31 (0) 2022.03.31