2012-02-02 39 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通常是一个不错的选择 - 并使用相同的编码读取和写入。

不幸的是FileWriterFileReader不允许你指定的编码,所以你需要FileOutputStreamFileInputStream包裹在OutputStreamWriterInputStreamReader

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

哇!谢谢你的回答。我一直在寻找一个星期,你在三十秒内为我解决了这个问题。再次感谢你! – Jason 2012-02-02 21:31:59

0

有些语言混为一谈的性格和八位类型(C而C++是值得注意的例子。)Java char类型隐含地使用UTF-16,并且ASCII必须使用byte类型来表示。请参阅here进行比较。有关Java编码指南,请参阅here