2016-12-15 5 views
1

я освежал себя на I/O, а я собирался через пример кода, который я видел что-то, что меня смутило:Почему вход по сравнению с «-1»?

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

    FileInputStream in = null; 
    FileOutputStream out = null; 

    try { 
     in = new FileInputStream("xanadu.txt"); 
     out = new FileOutputStream("outagain.txt"); 
     int c; 

     while ((c = in.read()) != -1) { 
      out.write(c); 
     } 

Как может ИНТ значение (с), могут быть назначены на один байт данных из входной поток (in.read())? И почему цикл while ожидает, чтобы он не равнялся -1?

ответ

2

Этот (c = in.read()) вернет -1, когда конец ввода достигнут, и, следовательно, цикл while остановится.

Прочтите этот замечательный answer.

Из документации Oracle:

public abstract int read() бросает IOException Читает следующие байты данных из входного потока. Байт значения возвращается как int в диапазоне 0 - 255. Если байт недоступен, так как конец потока достиг , возвращается значение -1. Этот метод блокируется до тех пор, пока не будут доступны входные данные , обнаружен конец потока или исключение . Подкласс должен обеспечить реализацию этого метода.

Возвращает: следующий байт данных, или -1, если конец потока является достигнута. Throws: IOException - если произошла ошибка ввода-вывода.

+1

Согласитесь, ответ Майка Накиса подходит для объяснения этого материала. –

0

Из документации FileInputStream.read():

общественного ИНТ чтения() броски IOException

Таким образом, чтение() возвращает Интс, а не байт, поэтому он может быть назначен к переменной int. Обратите внимание, что ints может быть неявно преобразован в int без потери. Также из документов:

Возвращает: следующий байт данных или -1, если конец файла достигнут.

Проверка петли на -1 определяет, достигнут ли конец файла, и прекращает ли цикл, если это так.

Смежные вопросы