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

为什么Java OutputStream.write()取整数但写入字节

章海
2023-03-14
问题内容

我正在编写一个OutputStream,只是在OutputStream接口中注意到了这一点,

   public abstract void write(int b) throws IOException;

该调用将一个字节写入流中,但是为什么要使用整数作为参数呢?


问题答案:

实际上,最近我一直在处理字节,它们可能很烦人。它们在丝毫挑衅的情况下会向上转换为整数,并且没有指定将数字转换为字节的功能-
例如,8l将为您提供一个长值8,但对于字节,您必须说(byte)8

最重要的是,除非您使用数组,否则它们(大部分)将始终作为整数存储在内部(可能甚至在那时..不确定)。

我认为他们只是假设使用字节的唯一原因是您实际上需要8位的I / O,但在内部,他们希望您始终使用整数。

顺便说一句,一个字节的性能可能会变差,因为它总是必须被屏蔽。

至少我记得几年前读过的书,现在可能已经改变了。

作为特定问题的示例答案,如果函数(f)占用了一个字节,而您有两个字节(b1和b2),则:

f(b1 & b2)

将不起作用,因为b1和b2将被上转换为int,并且int无法自动下转换(精度下降)。因此,您必须编写以下代码:

f( (byte)(b1 & b2) )

这会令人讨厌。

而且也不必问为什么b1和b2会进行上转换-我最近一直在讨论这个问题!



 类似资料:
  • 问题内容: 我有tyo字节变量 如果我将它们求和,则求和的值为整数。 为什么a + b是int? 问题答案: 因为Java语言规范这么说 对操作数(第5.6.2节)执行二进制数值提升。 请注意,二进制数值升级执行值集转换(第5.1.13节),并且可能执行拆箱转换(第5.1.8节)。 数字操作数上加法表达式的类型是其操作数的提升类型。 并且,关于数字促销, 扩展原语转换(第5.1.2节)适用于转换以

  • 问题内容: 我正在尝试从Firestore数据库中的python程序中存储64位整数。问题在于,似乎最后一位数字已四舍五入。 当我查看数据库时,它们存储为: 根据文档,支持64位带符号整数。可能是什么问题? 问题答案: 我不确定100%,但是我的猜测是您看到的是JavaScript整数的大小不是64位。它们实际上更像是53位。由于Firebase控制台是使用JavaScript实现的网络应用,因此

  • 我有 tyo 字节变量 如果我对它们求和,sum的值是整数。 为什么 b 是整数?

  • 问题内容: 我到处都读到过,当您在Java中定义介于-128到127之间的Integer时,它不会创建新对象,而是返回已经创建的对象。 除了让新手程序员比较Integer对象以查看它们是否具有相同的数字外,我看不到这样做的任何意义,但是我认为这很糟糕,因为确保他们认为可以将任何Integer对象与进行比较,并且还在教学在任何编程语言中都不好的做法:将两个“不同”对象的内容与进行比较。 这样做有其他

  • 除了让新手程序员将整数对象与进行比较,以确定它们是否是相同的数字之外,我认为这样做没有什么意义,但我认为这是不好的,因为他们肯定认为可以将任何整数与进行比较,而且在任何编程语言中都教给了一种不好的做法:用比较两个“不同”对象的内容。 为什么这样做还有其他原因吗?或者这只是在设计语言时的一个错误决定(在我看来),就像JavaScript中的可选分号一样? 编辑:我在这里看到他们解释了行为:为什么整数

  • 问题内容: 我正在尝试获取python 3.4中字节字符串的第一个字符,但是当我对其进行索引时,我得到了: 正如我期望的那样,这对我来说似乎并不直观。 我发现我可以得到我期望的价值,但是对我来说,这就像是一个hack。 有人可以解释为什么会这样吗? 问题答案: 该类型是Binary Sequence类型 ,并且明确记录为包含0到255范围内的整数序列。 从文档中: 字节对象是单个字节的不可变序列。