2012-02-02 15 views
2

ファイルにASCII値を出力しようとすると、いくつかの文字で間違った値が返されます。例:ファイルへのJava ASCII出力

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.PrintWriter; 

    public class test { 
    public static void main(String args[]){ 
            //Supposed to: 
     writeFile("./test.txt"); //write ASCII 147 
     readFile("./test.txt"); //read ASCII 147 
    } 

    public static boolean writeFile(String path){ 
     try{ 
      PrintWriter fo = new PrintWriter(new FileOutputStream(new File(path))); 
      fo.print((char) 147); //WRITES "?" TO FILE (ASCII 63, NOT 147) 
      fo.close(); 
     }catch(Exception e){ 
      return true; 
     } 
     return false; 
    } 

    public static boolean readFile(String path){ 
     try { 
      BufferedReader fi = new BufferedReader(new FileReader(path)); 
      char c[] = fi.readLine().toCharArray(); 
      System.out.println((int) c[0]); //OBVIOUSLY PRINTS 63 INSTEAD OF 147 
      fi.close(); 
      return true; 
     } catch (Exception e){ 
      e.printStackTrace(); 
      return false; 
     } 
    } 
} 

私は間違っていますか?どんな助けも素晴らしいだろう。ありがとう。

答えて

5

ASCIIでは「文字147」はありません。

興味のある文字を表す特定のエンコードを指定する必要があります。通常、UTF-8を選択することをお勧めします。読み込みと書き込みの両方に同じエンコードを使用します。あなたはFileOutputStreamOutputStreamWriterInputStreamReaderに包まれFileInputStreamが必要となりますので、

残念ながらFileWriterFileReaderは、あなたがエンコードを指定することはできません。

import java.io.*; 
import java.nio.charset.*; 

public class Test { 

    private static Charset UTF8 = Charset.forName("UTF-8"); 

    public static void main(String args[]) throws IOException { 
     writeFile("./test.txt"); 
     readFile("./test.txt"); 
    } 

    public static void writeFile(String path) throws IOException { 
     Writer writer = new OutputStreamWriter(new FileOutputStream(path), UTF8); 
     try { 
      writer.write((char) 147); 
     } finally { 
      writer.close(); 
     } 
    } 

    public static void readFile(String path) throws IOException { 
     Reader reader = new InputStreamReader(new FileInputStream(path), UTF8); 
     try { 
      int c = reader.read(); 
      System.out.println(c); 
     } finally { 
      reader.close(); 
     } 
    } 
} 
+0

うわー!その答えをありがとう。私は今一週間探していて、あなたは30秒で私のためにこれを解決しました。ありがとうございました! – Jason

0

いくつかの言語は、C(文字とオクテット種類をconflate C++は注目すべき例です)。Java charタイプは暗黙的にUTF-16で、ASCIIはbyteタイプを使用して表現する必要があります。比較のためにhereを参照してください。 Javaエンコーディングガイドについては、hereを参照してください。

関連する問題