Конкретная разница между буферизатором и файлообменником

Я хотел бы узнать конкретную разницу между BufferedReader и FileReader .

Я знаю, что BufferedReader намного эффективнее, чем FileReader , но может кто-нибудь объяснить, почему (в частности и подробно)? Благодарю.

Простым образом:

Класс FileReader – это общий инструмент для чтения символов из файла. Класс BufferedReader может обернуть вокруг Readers, например FileReader, для буферизации ввода и повышения эффективности. Таким образом, вы не будете использовать один над другим, но оба одновременно должны передать объект FileReader в конструктор BufferedReader.

Очень подробно

FileReader используется для ввода символьных данных из файла диска. Входной файл может быть обычным ASCII, по одному байту на текстовый файл символа. Поток Reader автоматически переводит символы из формата файла диска во внутренний формат. Символы во входном файле могут быть из других алфавитов, поддерживаемых форматом UTF, и в этом случае должно быть до трех байтов на символ. В этом случае также символы из файла переводятся в формат символов.

введите описание изображения здесь

Как и в случае с выходом, хорошей практикой является использование буфера для повышения эффективности. Для этого используйте BufferedReader. Это тот же class, который мы использовали для ввода с клавиатуры. Эти строки должны выглядеть знакомыми:

 BufferedReader stdin = new BufferedReader(new InputStreamReader( System.in )); 

Эти строки создают BufferedReader, но подключают его к входному streamу с клавиатуры, а не к файлу.

Источник: http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html

Во-первых, вы должны понимать streamовое вещание на Java, потому что все «читатели» в Java построены на этой концепции.

Потоковое видео

Потоковая передача файлов выполняется объектом FileInputStream в Java.

 // it reads one byte at a time and stores into the 'byt' variable int byt; while((byt = fileInputStream.read()) != -1) { fileOutputStream.write(byt); } 

Эти объекты фактически считывают байты (8 бит) за раз и записывают их в данный файл.

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

Вам также необходимо предоставить набор символов (если символы являются латинскими или китайскими и т. Д.) Текстового файла, с которым вы имеете дело, для эффективного кодирования и декодирования, в противном случае программа будет декодировать и кодировать некоторый смешок, d см. всю кучу странных символов, записанных в вашем текстовом файле.

Чтение файлов

Это просто причудливый способ сказать «streamовая передача файлов» с поддержкой символьного набора.

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

Поэтому Java-парни добавили class FileReader , чтобы иметь дело с текстовыми файлами. Он читает по 2 байта за раз (огромное улучшение по сравнению с FileInputStream !! Я бы сказал, что еще лучший выбор, а затем streamовая передача байта).

поэтому операция такая,

 int c; while ( (c = fileReader.read()) != -1) { // some logic } 

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

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

Но опять же он все еще медленнее (Imaging считывает 2 байта в секунду и прокручивает его!).

Буферизирующие streamи

Чтобы решить проблему непрерывного цикла над байтом или 2. Ребята из Java добавили замечательную функциональность. «Чтобы создать буфер, перед его обработкой».

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

Тот же метод используется classом BufferedReader, объект BufferedReader принимает объект FileReader, который содержит всю информацию о текстовом файле, который необходимо прочитать.

Объект BufferReader использует объект Filereader для чтения данного текстового файла. Каждый раз, когда FileReader считывает 2 байта из текстового файла, он возвращает данные в объект BufferReader . Теперь объект BufferReader также создает специальное место памяти, называемое «Буфер», и хранит там все буферизованные данные.

 BufferedReader br = new BufferedReader( new FileReader("example.txt") ); 

Процесс чтения 2 байтов времени повторяется до тех пор, пока объект FileReader не ударит, ‘\ n’, ‘\ r \ n’ (новый символ строки) и BufferReader прекратит буферизацию. Пока не будет прочитана инструкция для чтения следующей строки (именно для буферизации следующей строки).

 // this variable points to the buffered line String line; // Keep buffering the lines and print it. while ((line = br.readLine()) != null) { printWriter.println(line); } 

Теперь, вместо того, чтобы читать 2 байта, затем сделайте волшебство, а затем сохраните его, вся цепочка будет извлечена и хранится в ОЗУ где-нибудь, и когда вы закончите с магией, вы можете сохранить всю строку обратно. Таким образом, процесс ускоряется быстрее, чем выполнение 2 байтов.

Но опять же, зачем нам передавать объект FileReader в BufferReader? Разве мы не можем просто сказать «буферизировать этот файл», и это не так ли было бы сладко и коротко?

Как это работает, этот class BufferReader является немым classом, который просто знает, как буферизировать, он не имеет понятия о том, что нужно буферизировать, или ему просто все равно. Поэтому, будучи сказанным, что, когда вы предоставляете FileReader, он буферизует файл, таким же образом, если вы предоставляете объект InputStreamReader, например,

 // Object that reads console inputs InputStreamReader console = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(console); System.out.println(br.readLine()); 

Он будет проверять входные данные терминала / Консоли, пока не появится новый символ строки, и сохранит отсканированную строку в буфер.

Итак, теперь вы знаете, что можно читать (буфера) несколько streamов со стандартом BufferReader , например текстовые файлы, консоли, принтеры, сетевые данные и т. Д., И все, что он / она должен помнить,

  bufferedReader.readLine(); 

чтобы печатать все, что вы буферизуете.

BufferedReader требует Reader, из которых FileReader один – он происходит от InputStreamReader, который спускается из Reader.

FileReader – чтение файлов символов

BufferedReader – «Чтение текста из streamа ввода символов, буферизация символов, чтобы обеспечить эффективное считывание символов, массивов и строк».

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

http://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html

Фактически BufferedReader использует Readers как FileReader.

Класс FileReader помогает писать в файле, но его эффективность низкая, поскольку он извлекает один символ за раз из файла, но BufferedReader берет куски данных и хранит их в буфере, поэтому вместо того, чтобы возвращать один символ в atime из файла, становится проще с помощью буфера ,

Bufferedreader – метод, который вы можете использовать на самом деле в качестве замены метода Scanner, получает файл, получает вход.

FileReader – как следует из названия.

  • Добавление JPanels от других classов к cardLayout
  • 32-разрядная совместимость с 32-разрядными версиями по сравнению с 64-разрядной
  • Как читать целочисленное значение со стандартного ввода в Java
  • Как узнать, почему сбой на удалении файлов на Java?
  • Отправка почтового вложения с помощью Java
  • Как получить текст ошибки в controllerе от BindingResult
  • Spring MVC + JSON = 406 Не допускается
  • Являются примитивными типами данных streamобезопасными в Java
  • Что такое мьютекс и семафор в Java? В чем основное отличие?
  • Защищено в интерфейсах
  • Почему == сравнения с Integer.valueOf (String) дают разные результаты для 127 и 128?
  • Давайте будем гением компьютера.