【问题标题】:Why is the return type of input stream off int?为什么输入流的返回类型不是int?
【发布时间】:2014-08-08 22:15:53
【问题描述】:

离开这个问题 Issue regarding the return value of the read() function in java?.

为什么read方法的返回类型是int的答案是输入流可以返回-1(EOF标记) 我的问题是 -1 也不能表示为一个字节吗? 一位(0 或 1)可以表示正或负 剩下的(7位代表绝对值)——也就是0000001?

【问题讨论】:

  • 查看有符号和无符号整数。无符号字节的范围是 0-255,而不是 -1
  • 是的,我读过它。但是没有关于输入流 api 的文档表明输入流仅适用于 unsigned(+ or 0) 或 signed(-,0 , or +

标签: java byte inputstream


【解决方案1】:

“字节”是文件中的 8 位值。这些 8 位有 256 种可能的组合;这些是从 0 到 255 或从 -128 到 127 的所有值,但是您想查看它。 read() 必须能够返回所有 256 个值,因为它们中的任何一个都可能在文件中。 read() 还必须能够返回一些特殊标记来指示文件结束。因此,read() 必须能够返回 257 个不同的值,如果它返回 byte,它就无法做到这一点,因为 byte 只有 256 个可能的值。

【讨论】:

  • 有人可能会说short 已经足够长了。
  • 哦,所以输入流一次读取一个字节,但实际上不会读取 eof(它只会返回它)
  • @committedandroider 正确。 文件中通常没有特殊的字节值来表示文件的结束。
  • 如果一个字节是 -128 到 127,那么这意味着文件中可能有一个 -1 字节。您的程序如何区分它从文件中读取的 -1 和表示 EOF 的 -1?这就是read() 需要返回257 个不同值 的原因。无论您多么聪明,byte 都没有足够的空间。
  • @committedandroider 如果是short,只要你在任何操作中使用它作为操作数(例如与-1比较),它就会自动转换为int。所以它不会比直接使用int更有效。 (见docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2023-04-07
相关资源
最近更新 更多