当前位置: 首页 > 面试题库 >

Java中字符的大小不是2字节吗?

万俟铭
2023-03-14
问题内容

RandomAccessFile以前是byte从文本文件中读取的。

public static void readFile(RandomAccessFile fr) {
    byte[] cbuff = new byte[1];
    fr.read(cbuff,0,1);
    System.out.println(new String(cbuff));
}

为什么我看到一个完整的字符被读取?


问题答案:

A char表示Java (*)中的字符。它长2个字节(至少这是有效值范围所建议的大小)。

这并不一定意味着一个字符的每个表示都长2个字节。实际上,许多编码只为每个字符保留1个字节(或为最常见的字符使用1个字节)。

当调用String(byte[])构造函数你问的Java的转换byte[]String使用平台的默认编码。由于平台默认编码通常是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代码点。任一个或2 UTF-16的码点代表一个Unicode码点。Unicode代码点通常代表一个字符,但有时使用多个Unicode代码点来组成一个字符。但是上面的近似值足够接近讨论当前的话题。



 类似资料:
  • C 中的 Integer 变量是占用 2 个字节还是 4 个字节?它所依赖的因素是什么? 大部分教材都说整型变量占用2个字节。但是当我运行一个程序,打印一个整数数组的连续地址时,它显示了4的差异。

  • 问题内容: 我听过关于Java程序中一个字节占用的内存量的意见不一。 我知道您在一个Java字节中最多可以存储+127,并且文档说一个字节只有8位,但是在这里我被告知实际上它占用的内存量与int相同,因此仅一种有助于代码理解而不是效率的类型。 谁能解决这个问题,这将是实现特定的问题吗? 问题答案: 好的,已经进行了很多讨论,而没有很多代码:) 这是一个快速基准测试。谈到这种事情,通常会有一些警告-

  • 问题内容: 我听到一位同事说,即使我将String成员放在Java类中,即使String为空,我也要支付“ 24字节”的费用。准确吗?Integer,Float,Double是否相同?(与int,float,double相对,后者分别为4、4和8个字节)。 问题答案: 你要付4首或8个字节的 参考 。是否为每个“容器”对象实例额外的 对象 付费,取决于您如何获取空字符串。例如,如果您使用文字,那么

  • 问题内容: 我遇到的问题是我无法让我的密码验证程序来检查字符串,以确保其中的一个字符为大写字母,而一个字符为小写字母,它将检查整个字符串中是否存在一个字符。其他,并根据要检查的语句打印错误消息。 我已经查看了该站点和Internet上的答案,但是找不到。这是功课。 下面是我当前的代码。 问题答案: 要确定字符串是否包含大写和小写字符,可以使用以下命令: 这使您可以检查: 本质上,这通过检查Stri

  • 问题内容: 我如何使用getOutputStream方法发送一个strin。正如他们提到的,它只能发送字节。到目前为止,我可以发送一个字节。但不是字符串值。 提前致谢 问题答案: 如何使用PrintWriter: 编辑 :找到了我自己的答案,看到讨论了一个改进,但未列出。这是使用OutputStreamWriter编写字符串的更好方法:

  • 问题内容: 在Java中,如果我有一个String ,如何计算该字符串中的字节数? 问题答案: 字符串是字符列表(即代码点)。表示字符串所用的字节数完全取决于你使用哪种编码将其转换为字节。 也就是说,你可以将字符串转换为字节数组,然后按如下所示查看其大小: 因此,你看到,即使是简单的“ ASCII”字符串,其表示形式也可以具有不同数量的字节,具体取决于所使用的编码。使用你感兴趣的字符集作为的参数。