java - java中InputStream中的read函数如何读取一个字节并将其作为int返回?

标签 java stream inputstream

read()函数一次读取一个字节,该函数的返回类型为int。我想知道幕后发生了什么,以便该字节作为 int 返回。我对按位运算符一无所知,所以任何人都可以以我容易掌握的方式回答。

最佳答案

这取决于流的实现。在某些情况下,方法实现是在 native 代码中。在其他情况下,逻辑很简单;例如,在 ByteArrayInputStream 中,read() 方法执行以下操作:

public class ByteArrayInputStream extends InputStream {
    protected byte buf[];
    protected int count;
    protected int pos;

    ...

    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
    }
}

换句话说,字节被转换为 0 到 255 范围内的整数,如 javadoc 中所述,并且在逻辑流结束时返回 -1。

buf[pos++] & 0xff逻辑如下:

  1. buf[pos++] 转换为 int
  2. & 0xff 将有符号整数(-128 到 +127)转换为表示为整数的“无符号”字节(0 到 255)。

关于java - java中InputStream中的read函数如何读取一个字节并将其作为int返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44983653/

相关文章:

java - Eclipse Maven 依赖关系 - weaveDependency 问题

java - 这个数独求解器是如何工作的?

c++ - 通过输入重定向读取二进制文件 C++ 的最佳方法

javascript - 完成可写流

java - Retrofit 2.0 作为发布请求的结果获取 json 对象数组

java - 使用 Apache Camel 进行 Apache ActiveMQ 窃听

java - FileInputStream.available() 返回字节,但 ObjectInputStream.available() 返回 0

java - 在 Java 中将字符添加到 InputStream 的开头和结尾

android 套接字连接,inputStream 在 readline 上与 socket.io 或节点 websocket 服务器卡住

java.io.EOFException : Unexpected end of ZLIB input stream