2011-11-09 16 views
0

ファイルに単純な文字を書き込んで読み込もうとしています。ファイルに文字を書き込むことは、少なくとも表示されるヘキサエディタで)。私がキャラクターをメモリに読み込むと、そのキャラクターはまったく異なる値になります。ここに私の例のコードは次のとおりです。Java:ファイルへのcharの書き込み/読み込みで異なる結果が発生する

public class myclass { 

public static void main(String[] args) { 
     char myChar = 158; // let myChar = 158 

     System.out.println("myChar = "+(int)myChar); // prints 158. Good. 

     try { 
      FileOutputStream fileOut = new FileOutputStream("readthis"); 
       fileOut.write(myChar); 
      fileOut.close(); 
     } catch (IOException e) { 
      System.exit(1); 
     } 


     // If I examine the "readthis" file, there is one byte that has a value of 
     // of '9E' or 158. This is what I'd expect. 

     // Lets try to now read it back into memory 


     char readChar = 0; 

     try { 
      int i = 0; 

      FileInputStream fstream = new FileInputStream("readthis"); 
      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

       readChar = (char)br.read();      


      in.close(); 

     } catch (IOException e) { 
      System.exit(1); 
     } 

     // Now, if we look at readChar, it's some value that's not 158! 
     // Somehow it got read into as 382! 

     // Printing this value results in 382 
     System.out.println("readChar = "+(int)readChar); 




    } 

}

私の質問はどのようにこれが起こった、ありますか?私はreadCharを私が書いたオリジナルの値(158)と等しくしたいと思いますが、私は何が間違っているのか分かりません。どんな助けもありがとう。ありがとう。

答えて

5

あなたはバイトと読み取り文字を書いています。 WriterReader、またはOutputStreamInputStreamを使用してください。

3

EJPです。より長い説明:キャラクターには2つのプロパティがあり、エンコーディングは省略しています。

これは、char myChar = 158myCharのUnicodeコードポイント158(これはUnicodeでは印刷可能な文字ではありません)を割り当てていることを意味します。

fileOut.write(int)を使用して)ファイルに書き込むと、Unicode文字を整数158に変換しています。エンコードが失われます。 write()メソッドは、整数から下位8ビットを除外します(write(158+256)の結果はwrite(158)と同じ結果になります)。

もう一度データを読み込むと、Readerを使用してバイトを読み取り、それらをUnicode文字に変換します。これを正しく行うには、データが書き込まれたエンコーディングを指定する必要があります。明示的に何も指定しなかったので、Javaはプラットフォームのデフォルトのエンコーディング(OSのデフォルト)を使用します。

したがって、読者は158と読み、既定のエンコードを使用してcharに変換します。

この問題を解決するには、常にReader/WriterInputStreamReaderOutputStreamWriterを使用し、使用するエンコードを指定できるようにします。 UTF-8は、すべてのJava VMがそれらを読み取ることができ、すべてのUnicode文字をこのエンコーディングに/から変換できるので、良い選択です。

関連する問題