Вопрос

1) Как работают буферные потоки на фоне, чем они отличаются от нормальных потоков и каковы преимущества их использования?

2) DataInputStream это также Байт основанный на. Но у него есть методы, чтобы readLine(). Анкет Какой смысл здесь?

Это было полезно?

Решение

Из буферизации javadoc:

BufferedInputStream добавляет функциональность к другому входному потоку, а именно на возможность буферизации ввода и поддержать методы отметки и сброса. Когда создается BufferedInptream, создается внутренняя буферная массива. Поскольку байты из потока читаются или пропускают, внутренний буфер пополняется по мере необходимости из содержащего входного потока, по многим байтам за раз. Операция отметки помнит точку в входном потоке, и операция сброса вызывает чтение всех байтов, поскольку самая последняя операция отметки будет перечитывается до того, как новые байты будут взяты из содержащего входного потока.

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

Тогда обратное верно для BufferedOutputStream.

mark () и reset () можно использовать следующим образом:

1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b

Чтобы объяснить Марк/Сброс еще немного ...

Bufferinptstream внутренне помнит текущую позицию в буфере. Когда вы читаете байты, позиция увеличится. Вызов Марку (10) сохранит текущую позицию. Последующие вызовы для чтения будут продолжать увеличивать текущую позицию, но призыв к сбросу установит текущую позицию обратно его значению при вызове Марка.

Аргумент на Марке указывает, сколько байтов вы можете прочитать после вызова Mark до того, как позиция Mark не получится. После того, как позиция марки не завершена, вы больше не можете сбросить вызов, чтобы вернуться к нему.

Например, если бы Марк (2) был использован в строке 4 выше ioException, был бы брошен, когда Reset () вызовет в строке 6, поскольку позиция Марка была бы недействительной, поскольку мы читали более 2 байтов.

Другие советы

Забуференные считыватели/писатели/inputstreams/outputstreams читают и записывают в ОС в больших кусках для оптимизации. В случае писателей и выходных потоков данные забуферены в памяти, пока не будет достаточно собран, чтобы написать большой кусок. В случае считывателей и входных потоков большая часть считывается в форме диска/сети/... в буфере, и все чтения сделаны из этого буфера до тех пор, пока буфер не станет пустым, а новый кусок читается.

DataInputStream действительно основан на байтах. Метод считывания устарел. Внутренне он считывает байты с диска/сети/... байт-для байта, пока не соберет полную линию. Таким образом, этот поток можно было бы ускорить, используя буферизацию InputStream в качестве его источника, так что байты для линии считываются из буфера в памяти, а не непосредственно с диска.

With un-buffered I/O each read or write request is passed directly to the Operating System. Java's buffered I/O streams read and write data to their own memory buffer (usually a byte array). Calls to the Operating System are only made when the buffer is empty (when doing reads) or the buffer is full (when doing writes). It is sometimes a good idea to flush the buffer manually after critical points in your application.

Since the Operating System API calls may result in disk access, network activity and the like, this can be quite expensive. Using buffers to batch the native Operating System I/O into larger chunks often significantly improves performance.

Buffered streams write or read data in larger chunks by – nomen est omen – buffering. Depending on the underlying stream, this can increase performance dramatically.

From java.io.BufferedOutputStream's Javadocs:

By setting up such an output stream, an application can write bytes to the underlying output stream without necessarily causing a call to the underlying system for each byte written.

To reduce this kind of overhead, the Java platform implements buffered I/O streams. Buffered input streams read data from a memory area known as a buffer; the native input API is called only when the buffer is empty. Similarly, buffered output streams write data to a buffer, and the native output API is called only when the buffer is full.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top