Java ASCII вывод в файл - PullRequest
       12

Java ASCII вывод в файл

2 голосов
/ 03 февраля 2012

Когда я пытаюсь вывести значение 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;
        }
    }
}

Что я делаю не так? любая помощь будет отличной. Спасибо.

Ответы [ 2 ]

6 голосов
/ 03 февраля 2012

В ASCII нет такого понятия, как "персонаж 147".

Вы должны указать конкретную кодировку, которая может представлять интересующие вас символы - обычно UTF-8 - хороший выбор - и использовать одну и ту же кодировку как для чтения, так и для записи.

К сожалению, FileWriter и FileReader не позволяют указывать кодировку, поэтому вам понадобится FileOutputStream и FileInputStream, завернутые в OutputStreamWriter и InputStreamReader:

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 голосов
/ 03 февраля 2012

Некоторые языки объединяют типы символов и октетов (C и C ++ являются примечательными примерами.) Типы Java char неявно являются UTF-16, и ASCII должен быть представлен с использованием типа byte.Смотрите здесь для сравнения.См. здесь для руководства по кодированию Java.

...