2011-12-16 174 views
1

基本上我试图使用BufferedWriter写入使用Java的文件。问题是,我实际上正在做一些压缩,所以我生成0到255之间的整数,并且我想写出ASCII值等于那个int的字符。当我尝试写入文件时,它会写入很多?字符,所以当我重新读入文件时,它会将其读取为63,这显然不是我想要的。任何想法如何解决这个问题?如何将任何ASCII字符写入Java中的文件?

示例代码:

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

一个总是为0和255之间,但有时写入 '?'

+0

我们可以看到一些代码吗? – Tim 2011-12-16 01:07:40

+0

已将一些代码添加到 – Rohan 2011-12-16 01:09:45

回答

3

你真的试图写入/读取文件/从一个文件中读取字节。 在处理面向字节的数据(与面向字符的数据不同)时,应该使用InputStreamOutputStream类,而不是ReaderWriter类。

在这种情况下,你应该使用FileInputStream/FileOutputStream,并用BufferedInputStream/BufferedOutputStream包裹,如果你正在做的字节在-A-时间读取和写入。

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


(这指出,ASCII是7位不是8位字符集的答案是100%正确的。你真的想读/写二进制八位字节,而不是字符)。

1

你需要做出决定,你真的在​​做什么。你是否试图写一些字节到一个文件,或者你想写编码文本?因为这些在Java中是不同的概念;字节I/O由InputStreamOutputStream的子类处理,而字符I/O由ReaderWriter的子类处理。如果你真的想写的是字节到一个文件(我从你提到的压缩中猜测),使用OutputStream而不是Writer。

然后您还有另一个困惑,从您提到的“ASCII字符0-255”中可以明显看出。在127以上没有ASCII字符。请花15分钟阅读:"The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" (by Joel Spolsky)。要特别注意他解释字符集和编码之间差异的部分,因为这对理解Java I/O非常重要。 (要查看您是否理解,请阅读以下内容:Java编写器是将字符输出转换为字节输出的类,方法是对文本应用客户端指定的编码,并将字节发送到OutputStream。)

1

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

7位ASCII码的固定子集是可打印的,A = 65,例如,10个对应于“新行”字符发现和“印刷”时,其降低在屏幕上的一行。存在操纵面向字符的屏幕的许多其他代码,这些代码是不可见的并且操纵屏幕表示,如标签,空格等。还有其他控制字符,例如具有敲响铃声的目的。

127以上的高8位定义为执行者想要的任何内容,只有下半部分具有相关的标准含义。

对于一般的二进制字节处理,没有这样的限制,它们是代表数据的数字。只有在试图在屏幕上打印时,才能以各种方式变得有意义。

相关问题