【问题标题】:Why did the value of "fileInputStream.read()" be changed?为什么“fileInputStream.read()”的值被改变了?
【发布时间】:2018-11-07 00:24:01
【问题描述】:

我认为只有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

【问题讨论】:

  • 第一个sn-p中应该有一个while循环类似于第二个sn-p吗?在您写入/读取文件之前,您的文件中是否还有其他文本?
  • 我不知道,但我想知道的一点是“i = fileInputStream.read()”只是改变了i的值,不是吗?相同的一点是它们都打印 (" " + fileInputStream.read())
  • 您只是想知道为什么-1 是您第二个示例的结果吗?或者您是否还想知道为什么 255 是第一个示例的结果,即使您将 -1 写入文件?
  • while循环每次都改变read()的值吗?我认为 read() 的值是一个常数。
  • 以下任何一个答案都可以回答您的问题。如果是这样,请考虑投票和/或接受

标签: java io myeclipse


【解决方案1】:

您阅读255(在第一种情况下)尽管写了-1的原因可以在OutputStream.write(int)的文档中看到(强调我的):

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

FileOutputStream 没有给出改变这种行为的迹象。

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


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

来自InputStream.read 的文档(强调我的):

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

【讨论】:

    【解决方案2】:

    您可以通过阅读文档、引用来找出答案

    "

    public int read() 抛出 IOException。它从此输入流中读取一个字节的数据。如果还没有输入可用,则此方法会阻塞。指定者: 读入类 InputStream。 返回:数据的下一个字节,如果是 -1 到达文件末尾。 抛出:IOException - 如果出现 I/O 错误 发生。

    "

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

    【讨论】:

    • 那么,每次while循环都会改变read()的值,直到同时读取file的所有数据,它的值才变成-1?
    • while 循环只执行了两次。首先读取您写入数字的数据,因此 i=255,然后尝试读取,但在文件中找不到任何内容,因此 i=-1。你写 -1,但程序读取 255 的原因是因为它不读取数字,它读取数据字节,如果你不知道区别,你可以使用搜索找到有关该主题的更多答案。跨度>
    【解决方案3】:

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

    试试

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

    【讨论】:

    • 第一次read()是255,第二次是-1,不是吗?如果 -1 表示流已结束,那么 255 是什么意思?我从来没有在文件中输入 255...
    • 查看docs.oracle.com/javase/7/docs/api/java/io/… 的javadocs 并考虑Byte b = -1; System.out.println("" + (b & 0xFF));
    猜你喜欢
    • 2011-11-12
    • 2012-10-04
    • 2016-06-24
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2019-02-02
    • 2011-09-01
    • 2013-02-19
    相关资源
    最近更新 更多