read 是操作系统提供的一个系统调用。该调用读取流中的一个字节,返回一个 int;这里可以一探究竟。
早期的时候,操作系统设计者认为字节大于等于0,故使用 -1 作为流结尾标志符。而且定义了一个字节就是一个 byte,在内存中使用八位表示。这样,一个 byte 就只能表示0到127对应的编码,显然不够用,聪明的设计者们使用了这一个办法:允许 byte 为负,表示编码的补码,如 -128 表示 编码 128 ,-127 表示编码 129,...... -1 表示 255。于是 byte 表示的编码的范围就变成了 0 到 255,对应 [0,127] U [-128,-1]。
那么问题来了,如果 read 调用返回 byte 数据类型,而 byte 可以为 -1,那么,当返回 -1 时,到底是说流已经 EOF (end of file)了,还是当前读到了一个有效的字符 255(-1)?于是又作了这样的设计:让 read 返回 int,当大于等于 0 时,表示读到了有效的字节,当返回 -1 表示读到了流末尾。read 返回的大于 127 的字节就对应于它们取负的补码。设返回值为 c,则取它的低八位就是表示的编码,也即 c & 0xff 或 (byte)c。
这里要注意一下:系统调用必须通过软中断机制首先进入系统核心,然后才能转向相应的命令处理程序。普通过程调用可以直接由调用过程转向被调用过程。所以要避免多次调用 read,而应该一口气读多个字节。