为什么InputStream read()返回一个int而不是short?

时间:2014-01-11 13:22:22

标签: java

我正在阅读byte stream试用版并注意到以下声明

  

请注意,read()返回一个int值。如果输入是一个流   字节,为什么不read()返回一个字节值?使用int作为返回   type允许read()使用-1表示它已到达结尾   流。

使用int的原因是他们可以通过-1识别EOF。 (似乎很浅)

所以下一个更大的原始类型是short并且它也支持-1所以为什么不使用它?

从我收集的内容:(使用int的理由)

  1. 由于性能int是首选。 (this)
  2. int变量在其最后16位中保存一个字符值(来自 character trial
  3. 其他更抽象的流需要阅读的不仅仅是一个 字节(我猜的东西(用字符流发生))
  4. 我的理由是否正确?我错过了什么(比如纠错)?

3 个答案:

答案 0 :(得分:8)

首选int而不是short的最重要原因是short是一种二等公民:所有整数文字以及所有算术运算都是{{ 1}} - 键入,以便您在所有地方发生int - > short促销活动。此外,很少或根本没有参数反对使用int

答案 1 :(得分:1)

这是一个有趣的问题:-)。确实,他们必须使用有符号整数值类型来表示EOF,但int优于short的偏好可能只是表现。

正如我在另一个讨论过的StackOverflow线程中发现的那样,即使定义使用了int,Java VM也会在内部自动使用short

Java文档指出,short应该用在大型数组和内存真正重要的情况下 - 来源 - http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html。这显然不是这种情况,因为我们总是得到一个值。

答案 2 :(得分:1)

只有一种情况,使用short会给你一个优势:大型的短数组。可以肯定的是,只有在明确要存储的数字符合界限时才能使用它们。

在所有其他情况下,无论您有short还是int,都没有什么区别。例如:

class A {
    short s;
    double d;
}

不会使用比以下更少的内存:

class B {
    int s;
    double d;
}

因为对齐问题。因此,第一个只有10个字节的netto数据,而第二个有12个,当你分配一个对象时,它仍然会对齐到一些8字节的边界。即使它只是一个4字节的边界,内存使用也是一样的。