如何通过java中的InputStream中的读取函数读取并返回一个字节?

问题描述 投票:0回答:3

read()函数一次读取一个字节,此函数的返回类型为int。我想知道引擎盖下发生了什么,以便将字节作为int返回。我不知道按位运算符,所以任何人都可以用我容易理解的方式回答。

java stream inputstream
3个回答
3
投票

在引擎盖下,如果到达流的末尾,read()返回-1。否则,它将字节值作为int返回(因此该值介于0和255之间)。

在确认结果不是-1之后,可以使用获取带符号的字节值

byte b = (byte) intValue;

这将保留int的最右边8位,右边的第8位用作符号位,从而导致有符号值,介于-128和127之间。

如果该方法返回一个字节,除了抛出异常之外,没有办法表示已经到达了流的末尾。


3
投票

这取决于流实现。在某些情况下,方法实现是本机代码。在其他方面,逻辑很简单;例如,在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)。

0
投票

下面是使用InputStream的read()方法一次读取一个字节的程序:

public class Main {
    public static void main(String[] args) {
        try {
            InputStream input = new FileInputStream("E:\\in.txt");
            int intVal;
            while((intVal = input.read()) >=0)
            {
                byte byteVal = (byte) intVal;
                System.out.println(byteVal);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

请注意,input.read()返回的intVal是从文件in.txt中读取的字符的字节值。

© www.soinside.com 2019 - 2024. All rights reserved.