Почему изменилось значение fileInputStream.read ()? - PullRequest
0 голосов
/ 07 ноября 2018

Я думаю, что изменилось только значение 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 голосов
/ 07 ноября 2018

Причину, по которой вы читаете 255 (в первом случае), несмотря на то, что пишете -1, можно увидеть в документации OutputStream.write(int) ( выделение мое):

Записывает указанный байт в этот выходной поток. Общий контракт для write заключается в том, что в выходной поток записывается один байт. Байт для записи - это восемь младших битов аргумента b. 24 старших разряда b игнорируются.

FileOutputStream не указывает на изменение этого поведения.

В основном, InputStream.read и OutputStream.write(int) используют int s, чтобы разрешить использование unsigned"байтов". Они оба ожидают, что int будет в диапазоне 0 - 255 (диапазон байта). Поэтому, пока вы вызываете write(-1), он будет записывать только «восемь младших битов» -1, что приводит к записи 255 в файл.


Причина, по которой вы получаете -1 во втором случае, заключается в том, что вы вызываете read дважды, но в файле только один байт, и вы печатаете результат второго чтения.

Из документации InputStream.read ( упор мой):

Считывает следующий байт данных из входного потока. Байт значения возвращается как int в диапазоне от 0 до 255. Если байт недоступен из-за того, что достигнут конец потока, возвращается значение -1. Этот метод блокируется, пока не будут доступны входные данные, не будет обнаружен конец потока или исключение выброшены.

0 голосов
/ 07 ноября 2018

В вашем коде вы звоните read дважды, в первый раз он вернет 255, затем в следующий раз -1, указывая, что поток закончен

попробовать

while ((i = fileInputStream.read()) != -1)
    System.out.println("  " + i);
0 голосов
/ 07 ноября 2018

Вы можете узнать это, прочитав документацию, цитируя

"

public int read () генерирует IOException. Он читает байт данных из этого входного потока. Этот метод блокируется, если вход еще не доступен. Указано: читать в классе InputStream. Возвращает: следующий байт данных или -1, если достигнут конец файла. Броски: IOException - если ошибка ввода-вывода происходит.

"

Возвращает -1, поскольку достигает конца файла. В вашем цикле while он читает байт записанных вами данных, ничего не печатает, а затем в следующий раз, когда он пытается прочитать байт данных, его нет, поэтому он возвращает -1 и, поскольку он соответствует вашему условию, он печатает это происходит для выхода из подпрограммы

...