JDK的OutputStream为什么方法write(int b)的入参类型是int呢?
Java的OutPutStream中有一个方法:write(int b)
文档里是这么解释的:
将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。


文档里是这么解释的:
将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。
我怎么觉得这个方法有些奇怪呢。参数是一个int类型的整数,为啥不直接是一个字节呢?
今天在群里有小伙伴提到这个问题,知乎上也有人问起这个问题,
就这个问题说说我的理解:
这个问题要从JVM虚拟机与底层交互的方面去分析,
所以我觉得这是Java语言和c语言类型定义导致的问题;
首先看Java中的函数定义:
private native void write(int b, boolean append) throws IOException;
注意:是 native 方法
C语言中的定义:
int fputc(int ch,FILE *fp)
我们看到两种语言中都是使用int类型,而不是其它,为什么呢?
1、Java中有byte类型,c语言中没有(C/C++中的定义:
typedef
unsigned
char
BYTE
);2、为什么不用char?java中byte到char需要一个强制转换,而 int 不需要;
3、为什么不用short? 这个是32位CPU4字节对齐的问题吧,胡老师指正;
4、C语言中整型量和字符量可以通用;
所以Java和c语言文件读写的通信,最佳类型就是int。
另外收录胡老师的见解: