为什么java使用2个字节来存储char值

时间:2014-01-19 11:10:33

标签: java

1个字节应该足以存储一个字符,而不是为什么java使用2个字节,而另一个令人困惑的事情是使用FileInputStream,它以字节方式执行所有操作如何读取字符

2 个答案:

答案 0 :(得分:3)

Java char数据类型为16位,字节为8位。

这是因为Java Strings是unicode字符串,而不是ASCII字符串,允许标准Java字符串在全球大多数语言中使用。

答案 1 :(得分:0)

FileInputStream(以及从InputStream继承的其他类)确实是“面向字节的”,它不适合读取字符数据。

如果您需要阅读文本文件,您应该尝试这样做:

new InputStreamReader(new FileInputStream(file), "UTF8")

当然,您需要事先了解文件编码。

如果您只需要将文件读入字符串并且文件不是特别大,最简单的方法是调用FileUtils.readFileToString。有关详细信息,请参阅Apache Commons IO javadoc

<强>更新-201301191245 对于那些天真地认为他们可以从文件中读取字节到字节数组的人,然后将字节数组转换为字符串:这个对UTF-8不起作用,因为它可能包含多字节字符。请考虑以下事项:

  • 美元符号(“$”,U + 0024)在UTF-8中只占一个字节:24
  • 欧元符号(“€”,U + 20AC)占用UTF-8中的三个字节:E2 82 AC

想象一下情况:

假设您将“E2 82”读入固定大小缓冲区的末尾,并在下一个读取周期中读取“AC”。当您尝试将字节“E2 B2”转换为java字符时,结果将是损坏的文本数据。