Java InputStream返回的读取(字节[]b)字节数组具有负元素

Java InputStream返回的读取(字节[]b)字节数组具有负元素,java,Java,我的程序将一个文件读入字节数组,但我不知道为什么数组结果中有很多负数。我认为数组中的元素的值在0到255之间。代码如下: public static void main(String [] args) { try { File file = new File("C:\\1.mp3"); FileInputStream fis = new FileInputStream(file); 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());
        }
    }
publicstaticvoidmain(字符串[]args)
{
尝试
{
File File=新文件(“C:\\1.mp3”);
FileInputStream fis=新的FileInputStream(文件);
byte[]bytes=新字节[(int)file.length()];
fis.读取(字节);
布尔检查=真;
int i=-1;
while(检查)
{
i=i+1;

如果(字节[i]Java
字节的范围为-128到127。有关更多信息,请参阅Java教程中的

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

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

第二种方法是在示例代码中所做的,使用一次读取多个字节。此方法将
字节
数组作为参数,并返回一个
int
,指示读取的字节数,或者如果已到达流的结尾,则返回-1。自之后,这些
字节
值的范围将为-128到127e> byte
type是Java中有符号的8位值

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

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

这将32位
int
的低位8位设置为
byte
值中的值,给您一个无符号值。

Java字节是介于-128到127之间的值。我不明白为什么会有问题。但我读了Java文档,明白了“从输入流读取数据的下一个字节。值字节作为0到255范围内的整数返回”。我认为,只有使用
int read()一次读取一个字节作为
int
,才是0
使用此函数,如果到达流的末尾,将得到0到255的值和-1。非常感谢@prunge,我有一个新问题。我使用FileOutputStream.write(int b)将数据写入文本文件。我知道它使用ASCII表,例如如果b=57,它将向文本文件写入9,如果我使用b,它超出ASCII(1-127)的范围,我想知道Java如何处理?@loithuxua
FileOutputStream
将使用传递到
write()中的
int
值的最低8位
。如果要编写字符,我建议使用
Writer
s而不是
OutputStream
s,因为它们设计用于处理字符编码和多字节字符。