根据您正在阅读的文件格式而定。
如果文件是一串ASCII字节流,则执行以下操作:
InputStream is = new FileInputStream( filePath );
Reader reader = new InputStreamReader( is, "ISO-8859-1" );
char ch = reader.read();
您首先需要在字节定向文件上打开输入流。然后,InputStreamReader会将字节转换为字符。当然,在这种情况下,ISO-8859-1是从单字节值到完全相同的字符值的映射。显然,其他映射也是可能的,但ISO-8859-1恰好与Unicode集的前255个字符相同,其中前127个字符恰好与ASCII相同。
在写入时,请使用:
OutputStream os = new FileOutputStream( filePath ) ;
Writer w = new OutputStreamWriter( os, "ISO-8859-1" );
w.write( ch );
再次强调,OutputStreamWriter会根据ISO-8859-1字符集适当地在字符和字节流之间进行转换。生成的文件每个字符将有一个字节。
以下是一些正确的基本流模式示例。(参考链接)
如果你使用以上内容执行以下操作:
w.write("AAAA");
w.flush();
w.close();
生成的文件将包含4个字节,每个字节的值都为65。使用顶部的代码将该文件读回内存后,内存中会有四个"A"字符,但是在内存中,每个char占用16位。
如果文件以不同的字符集编码,包括可能是多字节字符集,则只需在InputStreamReader/OutputStreamWriter中使用正确的编码方式,即可在读取和写入时进行适当的转换。
UTF-8不是一个字符集,而是普通Unicode字符的一种字节序列编码方式。UTF-8编码非常巧妙,因为Unicode字符的前127个字符被映射到了前127个字节值(作为单独的字节)。然后,字符> = 128在连续的2个或更多个字节值中使用,其中每个字节值> = 128。如果您知道ASCII文件仅使用“7位” ASCII,则UTF-8也适用于您。对于Java来说,UTF-8是最好的编码方式,因为它可以正确编码所有可能的Java char值而不会丢失数据。
了解流的这些内容非常重要。我建议您不要尝试以任何其他方式将字节转换为字符,因为流中的转换非常可靠和正确。
(更糟糕的是...实际上,Character是一个32位的变量,其中20位可以用一种称为UTF-16的编码方式编码成16位char值的序列。建议您暂时忽略这一点,但要知道,即使在由16位char值组成的Java字符串中,也存在一些双字符序列。)
char
是一个16位数据类型。它不存储字符,而是存储UTF-16代码单元。一个或两个UTF-16代码单元组成一个UTF-16代码点。代码点标识特定的Unicode字符。此外,您正在查看错误的字符集。Java通常使用Unicode,尽管一些流类默认为操作系统默认字符集。 - Tom Blodget