read(byte [] b)的InputStream返回一个字节数组有负元素

loi*_*xua -1 java

我的程序将文件读​​入字节数组,但我不知道为什么数组结果中有很多负数.我认为数组中的元素的值在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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

谢谢您帮忙.

pru*_*nge 7

Java的byte范围是-128到127.有关详细信息,请参阅Java教程中的原始数据类型.

您在两种从字节中读取字节的方式感到困惑InputStream.

第一种方法是使用InputStream.read()方法一次读取一个字节.此方法返回一个int(不是a byte),其值为read(范围0-255)或-1,表示已到达流的末尾.该int类型是Java中带符号的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;
Run Code Online (Sandbox Code Playgroud)

这将32位的低8位设置为int值的byte值,为您提供无符号值.