我使用 RandomAccessFile 从文本文件读取字节。
I used RandomAccessFile to read a byte from a text file.
public static void readFile(RandomAccessFile fr) { byte[] cbuff = new byte[1]; fr.read(cbuff,0,1); System.out.println(new String(cbuff)); }为什么我看到一个完整字符被读取?
Why am I seeing one full character being read by this?
推荐答案A char 表示Java (*)。它是2个字节大(至少这是有效值范围建议的)。
A char represents a character in Java (*). It is 2 bytes large (at least that's what the valid value range suggests).
这不一定意味着每个字符的表示是2字节长。事实上,许多编码只为每个字符保留1个字节(或者为最常见的字符使用1个字节)。
That doesn't necessarily mean that every representation of a character is 2 bytes long. In fact many encodings only reserve 1 byte for every character (or use 1 byte for the most common characters).
当调用 String你需要Java将 byte [] 转换为 String 使用平台默认编码。由于平台默认编码通常是1字节编码,如ISO-8859-1或可变长度编码,如UTF-8,它可以轻松地将该1字节转换为单个字符。
When you call the String(byte[]) constructor you ask Java to convert the byte[] to a String using the platform default encoding. Since the platform default encoding is usually a 1-byte encoding such as ISO-8859-1 or a variable-length encoding such as UTF-8, it can easily convert that 1 byte to a single character.
如果您在使用UTF-16(或UTF-32或UCS-2或UCS-4或...)作为平台默认编码的平台上运行该代码,那么您将不会得到一个有效的结果(你会得到一个 String 包含Unicode替换字符)。
If you run that code on a platform that uses UTF-16 (or UTF-32 or UCS-2 or UCS-4 or ...) as the platform default encoding, then you will not get a valid result (you'll get a String containing the Unicode Replacement Character instead).
为什么不应该依赖于平台默认编码:当在 byte [] 和 char [] / String 或 InputStream 和 Reader 之间或 OutputStream 和 Writer ,您应该始终指定要使用的编码。
That's one of the reasons why you should not depend on the platform default encoding: when converting between byte[] and char[]/String or between InputStream and Reader or between OutputStream and Writer, you should always specify which encoding you want to use. If you don't, then your code will be platform-dependent.
code> char 表示UTF-16代码点。一个或两个 UTF-16代码点表示Unicode码点。 Unicode代码点通常表示一个字符,但有时多个Unicode代码点用于构成一个单个字符。但是上面的近似值足以讨论手头的主题。
(*) that's not entirely true: a char represents a UTF-16 codepoint. Either one or two UTF-16 codepoints represent a Unicode codepoint. A Unicode codepoint usually represents a character, but sometimes multiple Unicode codepoints are used to make up a single character. But the approximation above is close enough to discuss the topic at hand.
更多推荐
不是Java中的字符大小2字节?
发布评论