ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 보조스트림, 인코딩 -22.04.01
    고급자바 2022. 4. 1. 14:16
    728x90

    한글은 깨짐이 발생한다..... 바이트기반이 아닌 문자기반으로 처리를 해줘야한다. 정확히는 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
Designed by Tistory.