为什么更改“ fileInputStream.read()”的值?

时间:2018-11-07 00:24:02

标签: java io myeclipse

我认为仅更改了i的值,但为什么更改为fileInputStream.read()?

import java.io.*;

public class FileStream_byte1 {
public static void main(String[] args) throws IOException {

    FileOutputStream fOutputStream = new FileOutputStream("FileStream_byte1.txt");
    fOutputStream.write(-1);
    fOutputStream.close();
    FileInputStream fileInputStream = new FileInputStream("FileStream_byte1.txt");
    int i;

    System.out.println("  " + fileInputStream.read());
    fileInputStream.close();
}
}

//结果是255

import java.io.*;

public class FileStream_byte1 {
public static void main(String[] args) throws IOException {


    FileOutputStream fOutputStream = new FileOutputStream("FileStream_byte1.txt");
    fOutputStream.write(-1);
    fOutputStream.close();
    FileInputStream fileInputStream = new FileInputStream("FileStream_byte1.txt");
    int i ;
    while ((i = fileInputStream.read()) != -1)
        System.out.println("  " + fileInputStream.read());
    fileInputStream.close();
}
}

//结果为-1

3 个答案:

答案 0 :(得分:1)

OutputStream.write(int)的文档中可以看到尽管写了255却仍然读-1的原因(强调我的):< / p>

  

将指定的字节写入此输出流。 write的一般约定是将一个字节写入输出流。 要写入的字节是参数b的八个低位。 b的24个高位被忽略。

FileOutputStream没有表明更改该行为。

基本上,InputStream.readOutputStream.write(int)使用int来允许使用 unsigned “字节”。他们俩都期望int0-255的范围内(一个字节的范围)。因此,当您调用write(-1)时,它只会写入-1的“低八位”,从而将255写入文件。


在第二种情况下获得-1的原因是因为您两次调用read,但是文件中只有一个字节,所以您打印了第二次读取的结果。

摘自InputStream.read的文档(我的重点是我的):

  

从输入流中读取下一个数据字节。值字节作为int返回,范围为0255如果由于已到达流的末尾而没有字节可用,则返回值-1。此方法将阻塞直到输入数据可用,检测到流的末尾或引发异常。

答案 1 :(得分:0)

您可以阅读文档并引用

  

public int read()抛出IOException。它从此输入流中读取一个字节的数据。如果尚无输入可用,则此方法将阻塞。指定者:   读入InputStream类。 返回:下一个数据字节;如果返回,则返回-1。   抛出:IOException-如果发生I / O错误   发生。

它返回-1,因为它到达了文件的末尾。 在while循环中,它读取您写入的数据字节,不打印任何内容,然后在下次尝试读取数据字节时,没有内容,因此它返回-1,并且由于其符合您的条件,因此将打印继续退出子程序

答案 2 :(得分:0)

在您的代码中,您两次调用read,第一次将返回255,然后是下次-1,表示流已结束

尝试

while ((i = fileInputStream.read()) != -1)
    System.out.println("  " + i);