Буфер и файл на Java

#java #bufferedreader #filereader #filewriter #bufferedwriter

Вопрос:

Я новичок в java и хочу спросить, в чем разница между использованием FileReader-пишущей машинки и использованием BufferedReader-буферизатора. Кроме скорости, есть ли какая-либо другая причина для использования буферизации? В коде для копирования файла и вставки его содержимого в другой файл лучше ли использовать BufferedReader и BufferedWriter?

Комментарии:

1. Я немного сбит с толку вашим вопросом. Если вы хотите скопировать и вставить файл, вам нужно прочитать его, а затем записать его снова (или дать указание операционной системе сделать это без буферизации в Java). Так что для этого вам понадобятся как Читатель, так и Писатель. Устройство чтения (и записи) файлов являются конечными точками в классическом потоке ввода-вывода java и отвечают только за чтение/запись в/из файла, но не определяют, что с ним делать. С другой стороны, BufferedReader/Writer-это промежуточные сегменты потока. Они не могут напрямую использоваться для чтения/записи файлов без базового потока.

Ответ №1:

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

Поэтому, чтобы ответить на ваш вопрос, буферизованный писатель/читатель, как правило, лучше всего, особенно если вы не уверены, какой из них использовать.

Взгляните на JavaDoc для BufferedWriter, он отлично объясняет, как он работает:

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

 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
 

будет буферизировать выходные данные PrintWriter в файл. Без буферизации
каждый вызов метода print() приведет к
преобразованию символов в байты, которые затем будут немедленно записаны в
файл, что может быть очень неэффективным.

Комментарии:

1. Кроме того, если вам нужна концепция «строк» ввода, вам, как правило, понадобится класс, реализующий концепцию, подобную BufferedReader.