Почему мы должны использовать OutputStream.write(byte[] b, int off, int len) вместо OutputStream.write(byte[] b)?

Извините, все. Это вопрос новичка в Java, но я думаю, что он будет полезен для многих изучающих Java.

FileInputStream fis = new FileInputStream(file);
OutputStream os = socket.getOutputStream();    
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer)) != -1){
    os.write(buffer, 0, len);
}

Приведенный выше код является частью класса FileSenderClient, который предназначен для отправки файлов с клиента на сервер с использованием java.io и java.net.Socket.

Мой вопрос таков: в приведенном выше коде, почему мы должны использовать

os.write(buffer, 0, len)

вместо

os.write(buffer)

Другой способ задать этот вопрос: какой смысл иметь параметр len для метода OutputStream.write()?

Кажется, оба кода работают нормально.

2 ответа

Решение
while((len=fis.read(buffer)) != -1){
    os.write(buffer, 0, len);
}

Потому что вы хотите писать только те данные, которые действительно читаете. Рассмотрим случай, когда входные данные состоят из N буферов плюс один байт. Без len параметр вы бы написали (N+1)*1024 байты вместо N*1024+1 байт. Рассмотрим также случай чтения из сокета или вообще общий случай чтения: фактический контракт InputStream.read() в том, что он передает по крайней мере один байт, а не в том, что он заполняет буфер. Часто это не может, по той или иной причине.

Кажется, оба кода работают нормально.

Нет, они не.

Это на самом деле не работает таким же образом.

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

Причина в том, что вы создали байтовый массив размером 1024, но у вас не так много данных для помещения (или чтения ()) в этот байтовый массив. Следовательно, байтовый массив заполнен значением NULL в конечной части. Когда дело доходит до записи в файл, эти NULL все еще записываются в файл и отображаются как пробелы в блокноте Windows...

Если вы используете расширенные текстовые редакторы, такие как Notepad++ или Sublime Text, для просмотра полученного файла, вы увидите эти символы NULL.

Другие вопросы по тегам