如何在Java中向文件写入ASCII字符?

如何在Java中向文件写入ASCII字符?,java,Java,基本上,我正在尝试使用BufferedWriter使用Java写入文件。问题是,我实际上在做一些压缩,所以我生成了介于0和255之间的整数,我想写一个ASCII值等于该整数的字符。当我尝试写入文件时,它会写入许多?字符,所以当我读回文件时,它会将这些字符读取为63,这显然不是我想要的。有没有办法解决这个问题 示例代码: int a = generateCode(character); //a now has an int between 0 and 255 bw.write((char) a);

基本上,我正在尝试使用BufferedWriter使用Java写入文件。问题是,我实际上在做一些压缩,所以我生成了介于0和255之间的整数,我想写一个ASCII值等于该整数的字符。当我尝试写入文件时,它会写入许多
字符,所以当我读回文件时,它会将这些字符读取为63,这显然不是我想要的。有没有办法解决这个问题

示例代码:

int a = generateCode(character); //a now has an int between 0 and 255
bw.write((char) a);

a始终介于0和255之间,但有时它会写入“?”

您确实在尝试向文件写入/读取字节。 处理面向字节的数据(与面向字符的数据不同)时,应使用
InputStream
OutputStream
类,而不是
Reader
Writer

在这种情况下,如果执行逐字节读写操作,则应使用
FileInputStream
/
FileOutputStream
,并使用
BufferedInputStream
/
BufferedOutputStream
进行包装

这些讨厌的“?”字符是由于Java在字符和平台默认文本编码之间转换时发生的编码/解码过程问题造成的。从字节到字符再到字符的转换通常是“有损的”。。。取决于使用的编码方案。您可以通过使用面向字节的流类来避免这种情况



(指出ASCII是一个7位而不是8位字符集的答案是100%正确的。您确实在尝试读取/写入二进制八位字节,而不是字符。)

您确实在尝试向文件写入/读取字节。 处理面向字节的数据(与面向字符的数据不同)时,应使用
InputStream
OutputStream
类,而不是
Reader
Writer

在这种情况下,如果执行逐字节读写操作,则应使用
FileInputStream
/
FileOutputStream
,并使用
BufferedInputStream
/
BufferedOutputStream
进行包装

这些讨厌的“?”字符是由于Java在字符和平台默认文本编码之间转换时发生的编码/解码过程问题造成的。从字节到字符再到字符的转换通常是“有损的”。。。取决于使用的编码方案。您可以通过使用面向字节的流类来避免这种情况



(指出ASCII是7位而不是8位字符集的答案是100%正确的。您确实在尝试读取/写入二进制八位字节,而不是字符。)

您需要下定决心到底在做什么。您是要将一些字节写入文件,还是要写入编码文本?因为这些在Java中是不同的概念;字节I/O由
InputStream
OutputStream
的子类处理,而字符I/O由
Reader
Writer
的子类处理。如果您真正想要将字节写入文件(我从您提到的压缩中猜出来),请使用OutputStream,而不是Writer


然后还有另一个困惑,从您提到的“0-255之间的ASCII字符”中可以明显看出。127以上没有ASCII字符。请花15分钟阅读以下内容:。请特别注意他解释字符集和编码之间区别的部分,因为这对于理解Java I/O至关重要。(为了检查您是否理解,您需要了解以下内容:Java编写器是通过对文本应用客户端指定的编码并将字节发送到OutputStream来将字符输出转换为字节输出的类。)你需要决定你到底在做什么。你是想把一些字节写入一个文件,还是想把编码的文本?因为这些在Java中是不同的概念;字节I/O由
输入流
输出流
的子类处理,而字符I/O是由
Reader
Writer
的子类处理。如果您真正想要将字节写入文件(我从您提到的压缩中猜出来),请使用OutputStream,而不是Writer


然后还有另一个困惑,这从您提到的“0-255之间的ASCII字符”中可以明显看出127以上没有ASCII字符。请花15分钟阅读:。请特别注意他解释字符集和编码之间区别的部分,因为这对于理解Java I/O至关重要。(为了检查您是否理解,您需要了解以下内容:Java编写器是通过对文本应用客户端指定的编码并将字节发送到OutputStream来将字符输出转换为字节输出的类。)Java字符串基于16位宽的字符,如果没有明确的规范,它会尝试围绕该假设执行转换

下面的示例代码直接以字节的形式写入和读取数据,这意味着8位数字具有与之相关联的ASCII含义

import java.io.*;
public class RWBytes{
    public static void main(String[] args)throws IOException{
        String filename = "MiTestFile.txt";
        byte[] bArray1 =new byte[5];
        byte[] bArray2 =new byte[5];
        bArray1[0]=65;//A
        bArray1[1]=66;//B
        bArray1[2]=67;//C
        bArray1[3]=68;//D
        bArray1[4]=69;//E
        FileOutputStream  fos = new FileOutputStream(filename);
        fos.write(bArray1);
        fos.close();
        FileInputStream fis = new FileInputStream(filename);
        fis.read(bArray2);
        ByteArrayInputStream bais = new ByteArrayInputStream(bArray2);
        for(int i =0; i< bArray2.length ; i++){
            System.out.println("As the bytem value: "+ bArray2[i]);//as the numeric byte value
            System.out.println("Converted as char to printiong to the screen: "+ String.valueOf((char)bArray2[i]));
        }   
    }
}
import java.io.*;
公共类RW字节{
公共静态void main(字符串[]args)引发IOException{
字符串filename=“MiTestFile.txt”;
字节[]bArray1=新字节[5];
字节[]bArray2=新字节[5];
bArray1[0]=65;//A
bArray1[1]=66;//B
bArray1[2]=67;//C
bArray1[3]=68;//D
bArray1[4]=69;//E
FileOutputStream fos=新的FileOutputStream(文件名);
fos.write(bArray1);
fos.close();
FileInputStream fis=新的FileInputStream(文件名);
财政司司长(bArray2);
ByteArrayInputStream bais=新的ByteArrayInputStream(bArray2);
for(int i=0;i