有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

InputStream的java读取(字节[]b)返回一个字节数组有负元素

我的程序将一个文件读入字节数组,但我不知道为什么数组结果中有很多负数。我认为数组中的元素的值在0到255之间。代码如下:

public static void main(String [] args)
    {
        try
        {
            File file = new File("C:\\1.mp3");
            FileInputStream fis = new FileInputStream(file);
            byte[] bytes = new byte[(int)file.length()];
            fis.read(bytes);
            boolean check = true;
            int i = -1;
            while(check)
            {
                i=i+1;
                if(bytes[i]<0)
                {
                    check = false;
                    System.out.println("There is a negative number.");
                }
            }
        }
        catch(IOException ex)
        {
            System.out.println(ex.getMessage());
        }
    }

谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    Java byte的范围是-128到127。有关更多信息,请参见Java教程中的Primitive Data Types

    InputStream读取字节的两种方法让您感到困惑

    第一种方法是使用InputStream.read()方法一次读取一个字节。此方法返回一个值为read(范围0-255)或-1的int(而不是byte),以指示已到达流的结尾。在Java中,int类型是一个有符号的32位值

    第二种方法是在示例代码中所做的,使用InputStream.read(byte[])一次读取多个字节。此方法将byte数组作为参数,并返回一个int指示读取的字节数,如果已到达流的结尾,则返回-1。这些byte值的范围为-128到127,因为byte类型在Java中是有符号的8位值

    如果需要第二种方式的无符号值,可以通过执行以下操作进行转换:

    byte b = ...; //element in the byte array read from stream
    int i = b & 0xFF;
    

    这将使用byte值中的值设置32位int的低8位,从而得到一个无符号值