Java 为什么“的价值”;fileInputStream.read();要换吗?

Java 为什么“的价值”;fileInputStream.read();要换吗?,java,io,myeclipse,Java,Io,Myeclipse,我想只有I的值被更改了,但是为什么它是fileInputStream.read() //结果是255 import java.io.*; public class FileStream_byte1 { public static void main(String[] args) throws IOException { FileOutputStream fOutputStream = new FileOutputStream("FileStream_byte1.txt");

我想只有I的值被更改了,但是为什么它是fileInputStream.read()

//结果是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

您可以通过阅读文档,引用

"

public int read()引发IOException。它从此输入流中读取一个字节的数据。如果没有可用的输入,此方法将阻止。由以下指定: 读入类InputStream。返回:数据的下一个字节,如果 到达文件结尾。抛出:IOException-如果I/O错误 发生

"

它返回-1,因为它到达了文件的末尾。
在while循环中,它读取您写入的数据字节,不打印任何内容,然后下次尝试读取一个字节的数据时,没有任何内容,因此它返回-1,并且由于它与您的条件相匹配,它将打印它,然后退出子例程(在第一种情况下,您读取
255
)尽管编写了
-1
,但可以在(emphasis矿山)的文档中看到:

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

没有改变这种行为的迹象

基本上,
InputStream.read
OutputStream.write(int)
使用
int
s允许使用无符号的“字节”。他们都希望
int
0
-
255
的范围内(一个字节的范围)。因此,当您调用
write(-1)
时,它将只写入
-1
的“八个低位”,这将导致将
255
写入文件


在第二种情况下得到
-1
的原因是调用
read
两次,但文件中只有一个字节,并且打印第二次读取的结果

从(emphasismine)的文档中:

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


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

试一试


第一个代码段中是否应该有类似于第二个代码段的
while
循环?在写入/读取文件之前,文件中是否有其他文本?我不知道,但我想知道的是“I=fileInputStream.read()”只更改了I的值,不是吗?同样的一点是它们都是打印的(“+fileInputStream.read()”),您只是想知道为什么第二个示例的结果是
-1
?或者,您是否也想知道为什么第一个示例的结果是
255
,即使您将
-1
写入文件?while循环是否每次都更改read()的值?我认为read()的值是一个常数。请做下面的任何一个答案来回答你的问题。如果是这样,请考虑进行投票和/或接受,每次执行while循环时,读()的值被改变,直到文件的所有数据都被读取,同时它的值已经被改变为-1;while循环只执行了两次。首先读取写入的数字的字节,因此i=255,然后尝试读取,但在文件中找不到任何内容,因此i=-1。您编写了-1,但程序读取255是因为它不读取数字,而是读取字节数据,如果您不知道它们之间的区别,可以使用搜索来查找有关该主题的更多答案。第一次读取()是255,第二次是-1,不是吗?如果-1表示流已结束,255表示什么?我从不将255输入到文件中……查看JavaDoc并考虑<代码>字节B=1;System.out.println(“+(b&0xFF))
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();
}
}
while ((i = fileInputStream.read()) != -1)
    System.out.println("  " + i);