我使用 RandomAccessFile
从文本文件中读取 byte
。
public static void readFile(RandomAccessFile fr) {
byte[] cbuff = new byte[1];
fr.read(cbuff,0,1);
System.out.println(new String(cbuff));
}
为什么我看到一个完整的字符被它读取?
最佳答案
一个 char
表示 Java (*) 中的一个字符。它是 2 字节大(或 16 位)。
这并不一定意味着一个字符的每个表示都是 2 个字节长。其实很多character encodings只为每个字符保留 1 个字节(或为最常见的字符使用 1 个字节)。
当您调用 the String(byte[])
constructor 时您要求 Java 转换 byte[]
到 String
使用 platform's default charset (**)。由于平台默认字符集通常是 1 字节编码(例如 ISO-8859-1)或可变长度编码(例如 UTF-8),因此它可以轻松地将 1 字节转换为单个字符。
如果您在使用 UTF-16(或 UTF-32 或 UCS-2 或 UCS-4 或 ...)作为平台默认编码的平台上运行该代码,那么您将不会得到有效的结果(您' 将得到一个 String
代替包含 Unicode 替换字符)。
这就是您不应该依赖平台默认编码的原因之一:在 byte[]
之间进行转换时和 char[]
/String
或在 InputStream
之间和 Reader
或在 OutputStream
之间和 Writer
,您应该始终指定要使用的编码。如果您不这样做,那么您的代码将依赖于平台。
(*) 这不是完全正确:a char
代表 UTF-16代码单元。 one 或 two UTF-16 代码单元代表 Unicode码点。一个 Unicode 码点通常代表一个字符,但有时多个 Unicode 码点用于组成一个字符。但是上面的近似值已经足够接近讨论手头的话题了。
(**) 请注意,在 Android 上,默认字符集是 always UTF-8从 Java 18 开始,Java 平台本身也是 switched to this default (但仍然可以是 configured to act the legacy way )
关于java - Java中字符的大小不是2字节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078314/