'인코딩'에 해당되는 글 1건

  1. 2010.12.27 [펌] 자바 파일 입출력시 글자깨짐 문제
일단. 어떤것을 쓰던간에.. 화일은 잘 읽힌다.. 또한 유니코드의 경우 는 더욱더 편하게 읽힌다.
문제는... 유니코드가 아닌화일을 읽을때 글자깨짐이 일어난다는 점이다.
다음의 경우 Shift_JIS 화일을 읽어들인다. 글자 안깨진다...
다음의 method를 보면 알겠지만.. 인코딩 관련 지정이 하나도 없다..
왜일까? 인코딩을 사용하면 도리어 글자가 깨진다..왜지?

/** ディレクトリからファイルを読取って文字列に返す。
  * @param workName 作業名
  * @return
  */
 public void inputFile(String fileName) {
  BufferedInputStream is = null;       // inputStream初期化
  try {
     StringBuffer returnStr = new StringBuffer();     // ファイル内容を文字列で格納するStringBuffer。

    File inputFile = new File(fileName);       // ファイルを宣言する。
    if (inputFile.isFile() && inputFile.exists() ) {    // ファイルが存在するのを確認
     is = new BufferedInputStream(new FileInputStream(fileName));  // ファイルをstreamで読み取る。
     byte[] byteBuf =new byte[(int) inputFile.length()];  // 一時的にファイルをByteで格納するbyte配列
     for(int j = 0; j < (int) inputFile.length() ; j++) {
      byteBuf[j] = (byte) is.read();       // ファイルをByte読み取る。
/* 바로 이부분이다..왜 바이트로 읽는냐..바보 아니냐 하겠지만..
   다 이유가 있다... 한자 때문이다. Shift_JIS와 unicode는 100%호완되지 않기 때문에.
MS사이트에서 뒤지면 코드 변환표가 나온다..
자바는 내부적으로 유니코드로 처리하기 때문에..
reader를 사용하면.. 깨지는 글자가 생기기 때문이다..
reader에 인코딩 지정해도..결국 깨지는 글자가 발생했다..쩝..왜..그럴리가 없어야 되는데말이지.
단순히 커뮤니티 정도 만들려면..굳이 이렇게 쓸필요없지만..공공기관용을 만들어야 한다면..
어쩔수 없다... 아직까지는..더 좋은 방법을 찾지 못했다는말이지..
*/
     }
     returnStr.append(new String(byteBuf));      // ファイル内容を文字列で格納する。

    } // if (f.isFile() && f.exists()
    is.close();

  } catch (UnsupportedEncodingException e) {    // 支援しないコードの場合
   logger.error("지원하지 않는 인코딩", e);
  } catch (FileNotFoundException e) {      // ファイルが存在しない場合
   logger.error("화일을 찾을수 없다", e);
  } catch (IOException e) {        // 入出力エラーの場合
   logger.error("입출력에러", e);
  } catch (NullPointerException e) {      // 引数がNullの場合
   logger.error("null발생", e);
  }finally{
   try {
    if (is != null) is.close();      // 最後に inputStream を閉じられなかった場合閉じる。
   } catch (IOException e) {       // 入出エラー場合
      }
  } //finally

 } // inputFile(String fileName)

/**ファイル出力処理を行う。 화일 출력이다..뭐..출력은..그다지 상관 없다...잘 되니까..
  * @param str 受け取って編集済みデータ 받아와서 편집끝낸 화일내용
  * @param date 日付 시스템 날짜
  */
 public void outputFile(String str, String fileName ) {

  OutputStreamWriter os = null;       // 出力streamWriterの初期化 초기화..
  try {
   os = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(fileName)),"Shift_JIS"); // ファイル出力する。
   os.write(str);          // ファイル内容を記録する。 화일내용을 쓰는 부분..
   os.flush();           // ファイルを放出する。(生成する) 화일을 출력하는부분.
  } catch (IOException e) {        // 入出力エラーの場合
   logger.error("IO에러", e);
  } finally { //연습할때는 finally부분까지는 필요 없다.. 에러처리라는게..연습목적은 아니니까..
   try {
    if (os != null) os.close();      // 最後に outputStream を閉じられなかった場合閉じる。
   } catch (IOException e1) {       // 入出エラー場合
    logger.error("IO에러 ",e1);
   }
  } // finally
  } //outputFile(String str, String date)

이렇게 해서 Shift_JIS에서 화일 입출력은 끝냈따..
그럼 UTF-8화일일 경우에는?
자신이 편한대로 하면 된다..
 /** ファイル読み取る。
  * @param strAddress ファイル住所
  * @return ファイル値文字列
  */
 public String inputFile(String strAddress){
  DataInputStream is = null;       // データinputStream初期化
  StringBuffer returnStr = new StringBuffer();
  try {
   File tempfile = new File (strAddress);    // ファイル宣言
   if(tempfile.exists()){       // ファイルが存在する場合
    byte[] byteBuf = new byte[(int) tempfile.length()];  // 一時的にコード変換ファイルを格納するbyte配列
    is = new DataInputStream(new BufferedInputStream(new FileInputStream(tempfile))); // ファイルinputStream宣言
    while (is.read(byteBuf, 0, byteBuf.length) != -1){   // ファイル読み取る。
     returnStr.append(new String(byteBuf, "UTF-8"));   // ファイル内容を文字列で格納する。
    } //while
   } // if (tempfile.exists()
   is.close();  

  } catch (FileNotFoundException e) {     // ファイルが存在しない場合
   logger.error("화일 안보여", e);
  } catch (IOException e) {       // 入出力エラーの場合
   logger.error("IO에러다", e);  
  }finally{
   try {
    if (is != null) is.close();     // 最後に inputStream を閉じられなかった場合閉じる。
   } catch (IOException e) {     // 入出エラー場合
   logger.error("IO에러다", e);  
   }
  } //finally
  return returnStr.toString();
 } // end od inputFile


Posted by 김반장78
,