Java ASCII output to file

21,713

There's no such thing as "character 147" in ASCII.

You should give a specific encoding which can represent the characters you're interested in - UTF-8 is usually a good choice - and use the same encoding for both reading and writing.

Unfortunately FileWriter and FileReader don't allow you to specify the encoding, so you'll need FileOutputStream and FileInputStream wrapped in an OutputStreamWriter and 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();
        }
    }
}
Share:
21,713
Jason
Author by

Jason

Updated on February 03, 2020

Comments

  • Jason
    Jason over 4 years

    When I try to output an ASCII value to a file, with some characters it returns the wrong value. Example:

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

    What am I doing wrong? any help would be great. Thanks.