java에서의 파일 인코딩방법을 설명하겠습니다.

샘플코드를 보시면 알꺼라 생각합니다.

저의 경우 java파일의 인코딩은 UTF-8로 되어있습니다.

메모장에서 그냥 파일을 저장하면 인코딩이 ANSI로 됩니다.

ANSI파일을 java로 읽어들여 편집한뒤 저장하면 파일인코딩이 UTF-8로 저장됩니다.

기본 인코딩으로 하니 java파일의 인코딩과 같이 UTF-8로 저장되는것 같습니다.

 

그래서 인코딩을 지정하여 파일 읽고 쓰기하는 샘플을 아래와 같이 만들어 봤습니다.

 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class FileEndcoding {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  // UTF-8파일쓰기
  fileWrite("D:\\fileReadWrite_UTF8.txt", "이파일은 UTF-8파일입니다.", "UTF-8");
  // UTF-8파일읽기
  fileRead("D:\\fileReadWrite_UTF8.txt", "UTF-8");
  
  // UTF-8파일을 MS949로 읽을경우
  fileRead("D:\\fileReadWrite_UTF8.txt", "MS949");
  
  // MS949파일쓰기
  fileWrite("D:\\fileReadWrite_MS949.txt", "이파일은 MS949파일입니다.", "MS949");
  // MS949파일읽기
  fileRead("D:\\fileReadWrite_MS949.txt", "MS949");
  
  // MS949파일을 UTF-8로 읽을경우
  fileRead("D:\\fileReadWrite_MS949.txt", "UTF-8");

 }

 /**
  * 파일읽기
  * @param filePath
  * @param encode
  */
 public static void fileRead(String filePath, String encode) {
  BufferedReader reader = null;
  String defaultContents = "";
  System.out.println("----- 파일 읽기 인코딩 : ["+encode+"]");
  try{
   File configFile = new File(filePath);
   if(configFile.exists() && configFile.isFile() && configFile.length()>0){
    reader = new BufferedReader(
      new InputStreamReader(
        new FileInputStream(configFile),
        encode
       )
       );
    char[] contents = new char[(int)configFile.length()];
    reader.read(contents);
    defaultContents = new String(contents);
    System.out.println(defaultContents);
   }
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   if(reader != null){
    try{
     reader.close();
    }catch(Exception e){
     e.printStackTrace();
    }
   }
  }
  
  System.out.println("--------------------------");
  System.out.println();
 }
 
 /**
  * 파일쓰기
  * @param filePath
  * @param memo
  * @param encode
  */
 public static void fileWrite(String filePath, String memo, String encode) {
  
  try {
   OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(filePath), encode);
   out.write(memo);
   out.close();
  }catch(Exception e){
   e.printStackTrace();
  }
  
 }
}

[실행 결과]

----- 파일 읽기 인코딩 : [UTF-8]
이파일은 UTF-8파일입니다.


----- 파일 읽기 인코딩 : [MS949]
�댄뙆�쇱� UTF-8�뚯씪�낅땲��

 

----- 파일 읽기 인코딩 : [MS949]
이파일은 MS949파일입니다.

 

----- 파일 읽기 인코딩 : [UTF-8]
�������� MS949�����Դϴ�.

 

 테스트를 하다가 특이한 사항을 발견했습니다.

그냥 메모장에서 만든 UTF-8과 java에서 만든 UTF-8의 인코딩한 파일의 바이너리 코드가 틀리더군요.

 

java에서 만든 UTF-8파일 [이파일은 UTF-8파일입니다.]

capture.png

메모장에서 만든 UTF-8파일 [이파일은 UTF-8파일입니다.]

capture02.png

위와같이 차이가 있습니다.

메모장에서 만든 UTF-8파일을 샘플소스로 읽어들이면 아래와 같이 출력됩니다.

capture03.png

위에 내용은 이클립스 콘솔창에 실행된 결과입니다.

웃긴건 저걸 그대로 복사해서 메모장에 넣으면 제대로 글씨가 표시됩니다. ^^;

정확히는 뭔지 모르겠지만, 한글에 일경우에만 생기는 문제일것 같습니다.

문제가 있을수 있다는것만 참고 하시길 바랍니다.

감사합니다.