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

时间:2017-07-08 07:24:29

标签: java stream inputstream

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

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:1)

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

在确认结果不是-1后,您可以使用

获取带符号的字节值
listings.images

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

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

答案 2 :(得分: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中读取的字符的字节值。