2017-01-24 6 views
0

Я немного запутался в потоке ввода-вывода Java. У меня есть случай, когда мой входной поток очень быстрый (например, чтение файла с диска), но мой выходной поток очень медленный (например, запись в выходной поток ответа HTTP-сервлета).Входной поток Java быстрее, чем выходной поток

Что произойдет, если размер моего файла очень велик, в конечном итоге мой выходной поток (поданный во входной поток от файла) выкинет любое исключение, связанное с памятью, и закроет поток? или мой метод вывода выходного потока будет заблокирован до тех пор, пока данные выходного потока не будут очищены?

Возможно ли, чтобы выходной поток был заполнен?

public void pipe(InputStream is, OutputStream os) throws IOException { 
    int n; 
    byte[] buffer = new byte[1024]; 
    while((n = is.read(buffer)) > -1) { 
    os.write(buffer, 0, n); // would this get blocked if outputstream is full? 
    } 
os.close(); 
} 
+1

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

ответ

1

Да, OutpuStream будет блокироваться до тех пор, пока запись в базовую систему (файловая система, сетевой сокет и т. Д.) Не завершится. Если OutpuStream на самом деле BufferedOutputStream, тогда будет некоторая буферизация, но в конце все равно будет блокироваться, если буфер заполнен.