【问题标题】:Java ASCII output to fileJava ASCII 输出到文件
【发布时间】:2012-02-25 13:37:10
【问题描述】:

当我尝试将 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;
        }
    }
}

我做错了什么?任何帮助都会很棒。谢谢。

【问题讨论】:

    标签: java file ascii


    【解决方案1】:

    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();
            }
        }
    }
    

    【讨论】:

    • 哇!谢谢你的回答。我已经找了一个星期了,你在三十秒内为我解决了这个问题。再次感谢您!
    【解决方案2】:

    某些语言将字符类型和八位字节类型混为一谈(C 和 C++ 是显着的例子。)Java char 类型隐含 UTF-16,而 ASCII 必须使用 byte 类型来表示。请参阅here 进行比较。有关 Java 编码指南,请参阅 here

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2013-05-22
      • 2011-01-19
      相关资源
      最近更新 更多