2013-06-13 4 views
-2

Я должен написать программу, которая работает аналогично команде Unix cp. Я нашел этот фрагмент кода, но не могу понять, как и почему он работает.Как работает эта простая программа копирования

 FileInputStream in = new FileInputStream(args[0]); 
     FileOutputStream out = new FileOutputStream(args[1]); 
     byte[] buf = new byte[1024]; 
     int i = 0; 
     while ((i = in.read(buf)) != -1) { 
      out.write(buf, 0, i); 
     } 

Как работает цикл while? Я полагаю, что он читает из InputStream в 1024 байтовых частях, сохраняет их в байтовый массив buf и затем записывает buf в новый файл.

Но что

in.read(buf); 

присвоить I? И как цикл while проходит через весь файл (что говорит in.read (buf) читать следующие 1024 байта данных, а не один и тот же первый 1024 снова и снова)?

Спасибо, П.

+8

возможно прочитать документацию: in.read() возвращает количество прочитанных байтов. если никакие байты не могут быть прочитаны, он возвращает -1 – x4rf41

+0

@ x4rf41 yes.you должен добавить это как ответ. –

+2

Если вы не знаете, что делает метод, обычно лучше всего попытаться прочитать его документацию. Альтернативой является использование вашего отладчика для перехода через код и посмотреть, что он делает. –

ответ

3

Так что давайте шаг за шагом, да?

FileInputStream in = new FileInputStream(args[0]); 
FileOutputStream out = new FileOutputStream(args[1]); 
byte[] buf = new byte[1024]; 
int i = 0; 
while ((i = in.read(buf)) != -1) { 
    out.write(buf, 0, i); 
} 

Первые четыре строки не являются трудными. Создайте поток ввода и вывода. Выделите буфер размером 1024.

Следующим шагом является цикл while. Первое, исполненное:

(i = in.read(buf)) 

Это считывает в буфер, buf столько, сколько он может, а затем возвращает байты для чтения. Затем присваивается значение i, поэтому i - это количество байтов в buf, которые из потока.

Обратите внимание, что вызов read() будет продвигать поток. Это означает, что он не будет повторять байты. Так что, если ваш поток:

1 51 23 10 6 73 

Вы можете прочитать в

1 51 

который возвращает 2 (число читать). Поток в настоящее время:

23 10 6 73 

Назад к контуру! После чтения из потока, мы проверяем, есть ли вообще что-либо прочитать в buf

... != -1 

Обратите внимание, что

(i = in.read(buf)) 

Оценивает к значению i, поэтому условие петли while (i != -1). Причина это утверждение оценивается как таковое аналогично причине мы можем сделать:

a = b = 1; 

Который действительно:

a = (b = 1); 

Следующая строка довольно проста. Напишите все байты в buf от 0 до i.

Таким образом, в конце концов, этот цикл можно переписать в виде:

+1

Это прекрасный ответ .. :) –

+1

Спасибо, я просто не знал о том, что read() продвигает поток. :) – PeterPanter

1

И как петля, а через весь файл (что говорит in.read (BUF) читать следующие 1024 байт данных и не то же самое первого 1024 вновь и вновь)?

while ((i = in.read()) != -1) { 
      out.write(buf, 0, i); 
} 

эквивалентно:

i = in.read(); 
while (i != -1) { 
     out.write(buf, 0, i); 
     i = in.read(); 
} 
+0

@downvoter Не могли бы вы зажечь меня, пожалуйста? –

+0

Я думаю, что «свет» означает «просветить», а не быть нисходящим, я не могу. Я +1, хотя .. :) –

+0

@AndrewThompson Да, я имею в виду, что спасибо =). –

1
in.read(buf) 

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

Источник: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()

Файлы имеют указатель, который перемещается с каждым доступом (чтение/запись), так что следующая операция чтения/записи начнется, когда последняя закончилась.

1
public int read(byte[] b) throws IOException 

Читает до b.length байт данных от этого входного потока в массив байтов. Этот метод блокируется до тех пор, пока не будет доступен какой-либо вход.

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

Цикл while проверяет, что все еще есть данные для чтения, а i присваивается количество прочитанных байтов. Затем он используется для записи правильного количества байтов в выходной поток.

pubilc void write(byte[] b, int off, int len) throws IOException 

Пишет LEN байт из заданного массива байтов, начиная со смещения от для этого выходного файла потока.

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