본문 바로가기
Programming/Java

[자바/Java] 파일 I/O - PrintWriter + 인코딩 설정

by 코딩하는 랄로 2023. 10. 18.
728x90

PrintWriter

파일 입출력에서, 파일에 데이터를 쓸 때, System의  print관련 메서드를 사용하는 것처럼 파일에 쓸 수 있도록 편리한 기능을 제공하는 클래스(extends Writer)이다.

 

PrintWriter 클래스는 Writer 클래스를 상속 받은 클래스로, 메소드로는 위에서 언급했던 System의 print 관련 메소드처럼 작동하는 메소드를 지원하고 있다. 

import java.io.PrintWriter;

public class Main {

    public static void main(String[] args){	
		
        //System.out -> console창에 출력
        PrintWriter pw = new PrintWriter(System.out);
		
        String str1 = "Hello";
		
        pw.print(str1);
        pw.print(str1);
        pw.println(); // 개행
        pw.print(str1); // 개행뒤 아랫줄에 출력
        pw.println(); // 개행
        pw.printf("%.2f", Math.PI); 
        // 소숫점 둘째 자리까지 원주율 출력
        
        //printerWriter사용시 flush 필수!!
        //buffer에 저장된 값을 지정해준 stream으로,(해당 예제에서는 console창)
        //내보낸다.
        pw.flush();
        
        /*
        출력 결과 : 
        HelloHello
        Hello
        3.14
        */
        
        pw.close;

    }

}

System.out 메소드로 사용하던 print, println, printf를 메소드로 가지고 있고 사용방식도 똑같기 때문에 익숙하고 편하게 사용할 수 있다. 

 

 

 

PrintWriter를 사용한 파일 입력

PrintWriter를 사용하여 파일 입출력을 하기 위해서는 위의 예제에서 System.out으로 넘겨주었던 stream에 파일 스트림을 생성하여 넘겨주어 연결해주면 된다.

public class Main {

    public static void main(String[] args){	
        PrintWriter out = null;
        try {		
            out = 
                new PrintWriter(new BufferedWriter(new FileWriter("test.txt")));
            /* 또는 
            out = 
                new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test.txt"))));
            */
            
            out.println("Hello World!");
            
            //append() : 해당 파일의 끝부분에 이어 붙임
            out.append("Wow!!");
            out.append(" PrintWriter");
            
            //flush를 해주어야 스트림과 연결된 곳에 내보냄!!! <- 중요!!
            out.flush();
            
            /*test.txt 
            Hello World!
            Wow!! PrintWriter
            */
            
        } catch(FileNotFoundException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

 

 

 

인코딩 설정

FileReader, FileWriter는 파일의 인코딩을 무조건 file.encoding값으로 간주한다. 인코딩 값을 따로 설정을 안 해준다면, OS가 기본적으로 파일을 인코딩하는 방식대로 저장이된다.

 

예를 들어, LINUX는 UTF-8, MacOS는 한글상위의 경우 euc-kr, 윈도우즈는 Java 소스코드 인코딩에 따라 파일을 저장한다. 그렇기 때문에 원하는 인코딩 방식이 있다면 따로 설정해주어야 한다.

 

인코딩은 InputStreamReader, OutputStreamWriter를 사용하여 변경해줄 수 있다.

public class Main {

    public static void main(String[] args){	
        PrintWriter out = null;
        BufferedReader br = null;
        try {		
            System.out.println("현재 인코딩 " + System.getProperty("file.encoding"));
            //euc-kr 인코딩으로 저장
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test_encoding.txt"), "euc-kr")));
            
            //다른 인코딩으로 읽어오면 깨짐
            br = new BufferedReader(new InputStreamReader(new FileInputStream("test_encoding.txt")));
            
            //같은 인코딩 euc-kr로 읽어와야 함 = euc-kr로 디코딩
            br = new BufferedReader(new InputStreamReader(new FileInputStream("test_encoding.txt"), "euc-kr"));
            
            
        } catch(FileNotFoundException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            out.close();
            
            try {
                if(br != null) br.close();
            catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}
728x90