java - 为什么 BufferedOutputStream 中的字节转换按预期工作?
问题描述
我正在fileoutput.txt
使用 Java 中的以下代码向文件写入一个字节:
FileOutputStream fos=new FileOutputStream("C:/tests/fileoutput.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
bos.write(153);
bos.flush();
为了检查文本文件中保存了哪些字节,我在十六进制编辑器中打开了它。在那里,我看到程序按预期写入了正确的字节 = 153。
但后来我在 BufferedOutputStream 类中打开了 write() 方法的源代码。此方法接受int
in 参数并执行从int
to的转换byte
。
当 java 进行此操作时,我希望程序返回不同的字节,与原始字节不同,因为在 java 中,字节类型的最大值为 127。当我执行显式转换时,byte b=(int)153
该b
字段变为等于 -103。
为什么类中的write()
方法BufferedOutputStream
会以不同的方式进行强制转换?
解决方案
153和-103的二进制表示是一样的。因此,正确的十六进制值最终会出现在文件中。
阅读二进制补码以获取更多信息:https ://en.m.wikipedia.org/wiki/Two%27s_complement
推荐阅读
- python-3.x - 我期待实际输出 8 但得到 2 作为输出
- java - 为什么这个递归函数比迭代函数快 3 倍?
- java - Java 数据建模:使用 Map 或 List 建立一对多关系
- node.js - TypeORM 选择所有行但限制为 25
- c# - 如何过滤 IList 子查询 EF Core 2.2
- python-3.x - 如何在python中使用异步io(快速方式)将数据从一个s3存储桶复制到另一个存储桶?
- r - R中的非线性优化 - 非线性约束
- json - 使用角度解析 Json 响应
- windows - 如何使用 CMD 显示没有父路径的纯文件名
- google-app-engine - 对 gcloud 计算区域的查询描述 us-central1 --flatten='quotas[]' --format='csv[no-heading](quotas.metric,quotas.limit,quotas.usage)'