【问题标题】:Why byte datatype is used for file IO java? [duplicate]为什么字节数据类型用于文件 IO java? [复制]
【发布时间】:2019-06-25 02:00:59
【问题描述】:

我知道字节是Java IO的底层数据类型,但是为什么字节用于读取和写入,因为它的最大值范围是-128到127。这个范围是整数,整数如何用于读取和写入不同的符号字符还是二进制数据?

期望是理解为什么字节数据类型用于Java IO。

【问题讨论】:

  • 你会用什么代替?在最底层,文件是大多数现代操作系统中的字节序列。例如,文本是通过将字符编码为每个字符一个或多个字节的序列来处理的。
  • 显而易见的选择是无符号字节。许多人认为 Java 中没有它是一个严重的设计缺陷。但是在它没有的情况下,除了有符号字节,你还能使用什么?
  • @Animesh:您是在问为什么 Java 的 byte 数据类型具有特定范围 -128 到 127,或者更基本的问题是什么是“字节”以及为什么要制作“二进制数据”最多“字节”?后一个问题并非特定于 Java。 “整数如何用于读写不同的符号字符或二进制数据”这句话似乎暗示了后一个问题,这是一个非常基础的问题。
  • @Animesh:从历史上看,“字节”、“字符”和“机器字”之间的关系都有些流动,硬件仍然存在于那些具有不寻常大小的地方。 (请参阅Is a byte always 8 bits?)POSIX 标准化“字节”以准确表示一组 8 位。在现代硬件中,字节是内存的最小可寻址单元,尽管可能难以访问与机器字大小(现在通常为 32 或 64 位)不自然对齐的字节。 Java 遵循 POSIX 并将 byte 设为 8 位值。
  • @Animesh:尽管历史上一个字节的大小与文本字符的大小相关联,但 Java 实际上打破了 C 的传统,使 bytechar 大小不同。 Java 采用了当时最新的 Unicode 1.0 文本编码标准,并将 char 设为 16 位无符号值。 (Unicode 已经超过了 BMP,现在 16 位字符很难使用,但 25 年前这似乎是个好主意。)根据您的字符编码,单个字符可能占用多达 6 个字节或更多如果您添加变音符号。

标签: java


【解决方案1】:

Java 是在 C/C++ 之后设计的,有一些讨论的主题:

  • Java 文本 String (Reader/Writer) 包含 Unicode,因此可以组合混合脚本中的文本。内部 String 是一个 UTF-16 char 的数组; .class 文件使用 UTF-8 字符串常量。因此byte[] (InputStream/OutputStream) 仅适用于二进制数据。在文本和二进制数据之间,总是存在使用二进制数据的编码/字符集的转换。

  • 数字原始类型仅存在于 signed 版本中。 (除了 char 可以考虑非数字。)这个想法是根除 C++ 的有符号/无符号“问题”。 byte 也是从 -128 到 127 签名的。但是 overflow 在 java 中也无关紧要, 所以可以这样做:

    字节 b = (字节) 255; // 0xFF 或 -1

  • 原始类型 byte/short/int/long 具有固定字节大小,其中 C 是臭名昭著的跨平台,而像 C uint32 这样的东西有点丑陋 (32)。

我自己经历过签名/未签名的棘手 C 错误(超过 10 年),我认为这个决定是可以的。

在有符号思维集中进行计算,然后在最后将值视为无符号,比在整个表达式中使用有符号和无符号部分更容易。

如今,Java 支持对值的无符号解释进行计算,例如Integer.parseUnsignedInt

【讨论】:

  • 在创建 Java 时,是否有关于不同讨论主题和决策的文档/跟踪?
  • 尽管我留着白胡子,但我并没有参与其中,而且是听人说的。 wikipedia 文章只提供了一些陈词滥调。但小组中似乎有相当学术交流。其他的决定,比如只允许单一继承,而改为使用多个接口,都是经过慎重做出的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 2020-02-25
  • 1970-01-01
  • 2020-12-25
  • 2020-02-06
  • 2017-04-09
  • 1970-01-01
相关资源
最近更新 更多