Import java io bufferedreader

При работе с файлами в Java очень часто нужно выполнять операции чтения данных. Именно поэтому сегодня мы рассмотрим различные способы прочитать файл в Java.

Читаем информацию с файла. Теория

  1. В Java есть класс java.nio.file.Files , который позволяет прочитать все содержимое файла в массив байтов или считать все строки в список. Класс Files был введен в Java 7 и отлично подходит, если нам нужно загрузить все содержимое файла. Следует отметить важный момент: желательноиспользовать этот метод только тогда, когда работаем с небольшими файлами, так как все содержимое это файла будет в памяти.
  2. Класс java.io.FileReader . Мы можем использовать FileReader, чтобы получить BufferedReader, а затем считывать файлы построчно. FileReader не поддерживает кодировку и работает с кодировкой системы по умолчанию, так что это не очень эффективный способ чтения файла в Java, но все же имеет право на жизнь.
  3. Класс java.io.BufferedReader отлично подходит для чтения файла построчно и дальнейшей обработки считанной информации. Он очень хорошо справляет с обработкой больших файлов и поддерживает кодировку файла. BufferedReader является синхронизируемым, а поэтому значит, что операции чтения с помощью BufferedReader можно безопасно выполнять из нескольких потоков. Размер буфера BufferedReader по умолчанию составляет 8 Кбайт.
  4. Класс java.util.Scannerотлично подходит для чтения файла построчно. Сканер разбивает входные данные на лексемы используя разделитель, который по умолчанию соответствует пробелу. Полученные лексемы могут быть затем преобразованы в значения разных типов с использованием различных методов. Сканер не синхронизирован, следовательно, не потокобезопасный.

Ниже представлен класс на Java для чтения содержимого файла с помощью Scanner, Files, BufferedReader с поддержкой кодировки и FileReader :

In this article, we will show you how to use java.io.BufferedReader to read content from a file

1. Files.newBufferedReader (Java 8)

In Java 8, there is a new method Files.newBufferedReader(Paths.get("file")) to return a BufferedReader

2. BufferedReader

2.1 A classic BufferedReader with JDK 1.7 try-with-resources to auto close the resources.

2.2 In the old days, we have to close everything manually.

References

About the Author

mkyong

Comments

Very good and “to the point” article! Congrats!

Excelent!
just for comment, in your first example, the line
“br = new BufferedReader(new FileReader(FILENAME));”
wasn’t necessary!

Thank you!
I learn a lot with you!

Thank you this is anice example.

Article is updated, thanks for your comment.

Thanks a bunch! You just saved my day.

Congratulations, for your posts, is has helped me a lot!

Hello sir pls send me code of BufferReader…Sir please…

[…] visit How to read file from Java – BufferedReader Example 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 […]

how to open multiple file in different directory

it says the file is not found. what is wrong?

Create the file manually.

I created the file. I have used “thing.txt” and I have used “C:UsersJohnWorkspaceLunaSR2ReadFilething.txt”

I created thing.txt using Eclipse

Very Good article. Is there a way to access folder using authenitcation. Right now I’m using smb api for this. But it would be easier if the authentication can be done in this program.

Читайте также:  Источник света светодиодные лампы

Great and to the point, but I’m stuck on a ‘file not found’ exception because I put my file inside the src folder like this: src/res_folder/file.txt Does anyone know how to access that? I tried things like getResourceAsStream, get Resource, classloader, and putting the path as “/res_folder/file.txt” and other things but still have the same error.

ok, after hours and hours of looking I somehow accidentally figured it out myself, so I’ll just share it here for anyone else.
At this line: br = new BufferedReader(new FileReader(“C: esting.txt”));
I changed it to: br = new BufferedReader(new FileReader(new File(“src/res/myfile.txt”)));

This works for me, but since I do more Android programming, I’m not sure if this is the best approach.

What if when I want to read in file not from newline to newline but from some other token to token? Like from LABEL to LABEL etc. What tool should I use then?

i guess u have to use Scanner to read the file. public >

Itis a very good code. I alos have written some tips in Java for file access and manipulation including reading, writing, creating file, and folder,…http://www.worldbestlearningcenter.com/tips/Java-write-file.htm

Hi, your codes works fine but i am getting an encrypted version, so how can i get non-encrypted version.

How can you adapt the code to allow the variable “sCurrentline”, to be manipulated through methods such as, .split(), out side of the try-catch statement. It will not even print “sCurrentLine”, unless it is in side the try-catch statement.

Hi, where the txt file should be placed??
I created a txt file on the same folder of the java files and the application always throw the FileNotFoundException. I tried different names, different format files, but it never finds the file.

you can save it anywhere but you have to save it with .java extension

The entire Java File Operation like Reading, writing, Delete are found here,
http://antguider.blogspot.in/2012/06/java-file-operation.html

Thanks it worked for me.:)

Finally after much searching, you answered my question, Mike ! Thanks ! There are a lot of people out in the web asking the same question. When they and, (up till a few moments ago), myself included, try to “import” a simple text file into an Eclipse project, we were all receiving “file not found”. Being new to Java I was amazed that this was such an “issue” for eclipse. I like Eclipse but something so fundamental, shouldn’t be so frustratingly hard. I guess the Devs are busy working on other more urgent issues and we cant complain as it … Read more »

Абстрактные классы Reader и Writer являются символьными потоками.

Абстрактный класс Reader

Класс Reader обеспечивает поддержку символьного потока чтения аналогично тому, как это делает InputStream, реализующий модель байтового потока ввода. Методы Reader схожи с теми, которые объявлены в составе InputStream.

Методы класса Reader

Метод Описание
abstract void close() throws IOException Закрытие ранее открытого потока чтения. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа IOException, но повторное закрытие потока эффектов не вызывает.
void mark(int limit) Размещение метки в текущей позиции входного потока
boolean markSupported() Функция проверки поддержки потоком методов mark() и reset()
boolean ready() Функция проверки готовности объекта для чтения данных, т.е. в нем существует хотя бы один доступный символ. Следует заметить, что результат, равный false, отнюдь не свидетельствует о том, что очередной вызов read приведет к возникновению блокировки, поскольку в промежутке между обращениями к ready и read в поток может поступить очередная порция данных.
void reset() Сброс указателя ввода в ранее установленную позицию метки.
long skip(long count) Функция пропуска указанного в параметре count количества символов ввода. Возвращает количество действительно пропущенных символов. Значение count не должно быть отрицательным.
int read() throws lOException Чтение одного символа данных в виде целого числа в диапазоне от 0 до 65535. Если символов, готовых для чтения, нет ввиду достижения конца потока, то возвращается значение -1. Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы, не достигнут конец потока либо не выброшено исключение.
abstract int read(char[] buf, int offset, int count) throws lOException Чтение символов и сохранение их в массиве buf типа char. Максимальное количество читаемых символов определяется значением count. Символы записываются в массив, начиная с смещение offset. Содержимое всех остальных элементов массива buf остается неизменным. Метод возвращает количество фактически считанных символов.
Если достигнут конец потока и не считан ни один символ, возвращается -1. Если значение count равно нулю, чтение не производится и возвращается 0.
Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы не достигнут конец потока либо не выброшено исключение.
int read(char[] buf) throws IOException Метод аналогичен предыдущему при условии, offset = 0, count = buf.length.
Читайте также:  Интерфейс программы adobe photoshop

При реализации Reader требуется, чтобы производный класс (наследник) обеспечил практическое воплощение варианта метода read, осуществляющего чтение данных в массив символов, и версии метода close. Во многих случаях, однако, производительность операций может быть улучшена за счет переопределения в производных классах и других методов.

Наследники класса Reader

  • BufferedReader — буферизированный входной символьный поток; увеличивает производительность за счёт буферизации ввода;
  • CharArrayReader — входной поток чтения символьного массива;
  • FileReader — входной поток чтения содержимого файла; в конструкторе класса нужно указать либо путь к файлу, либо объект типа File;
  • FilterReader — фильтрующий читатель;
  • InputStreamReader — входной поток, транслирующий байты в символы;
  • LineNumberReader — входной поток, подсчитывающий строки;
  • PipedReader — входной канал;
  • PushbackReader — входной поток, позволяющий возвращать символы обратно в поток;
  • StringReader — входной поток, читающий из строки.

Класс BufferedReader

Широкораспространенный в использовании класс BufferedReader считывает текст из символьного потока ввода, буферизируя прочитанные символы. Использование буфера призвано увеличить производительность чтения данных из потока.

BufferedReader имеет следующие конструкторы :

Примеры BufferedReader

В качестве примера рассмотрим программу подсчета общего количества символов и числа пробелов в символьном потоке чтения:

Программе в качестве параметра передается имя файла в командной строке. Переменная in представляет символьный поток чтения. Если имя файла не задано, то используется стандартный поток ввода, System.in, после "вложения" его в объект типа InputStreamReader, который выполняет преобразование байтового потока ввода в символьный поток чтения. В противном случае создается объект типа FileReader, расширяющего класс Reader.

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

Абстрактный класс Writer

Абстрактный класс Writer обеспечивает поддержку символьного потока записи аналогично тому, как это делает OutputStream, реализующий модель байтового потока вывода. Многие методы Writer схожи с теми, которые объявлены в OutputStream; помимо этого, в классе Writer предусмотрены некоторые другие полезные версии метода write.

Читайте также:  Воркаут 100 дней программа тренировок

Методы класса Writer

Все методы класса вызывают исключение IOException при возникновении ошибки.

Метод Описание
append(char c) Добавление символа в конец вызывающего выходного потока.
abstract void close() throws lOException Закрытие ранее открытого поток записи; при необходимости выполняется сброс потока. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа lOException, но повторное закрытие потока эффектов не вызывает.
abstract void flush() Сброс потока. Если поток сохраняет в промежуточном буфере некоторое число символов, переданных методами write различных версий, flush провоцирует выполнение операции непосредственной записи данных в объект-получатель. Затем, если получателем является другой поток, тот в свою очередь также сбрасывается. Таким образом, единственный вызов flush приводит к сбросу всех буферов в цепочке взаимосвязанных потоков. Если поток не относится к категории буферизованных, никакие действия не выполняются.
void write(int char) throws lOException Запись символа в выходной поток. Метод выполняет блокировку потока до тех пор, пока символ не будет записан.
abstract void write(char[] buf, int offset, int count) throws lOException Запись count символов массива buf, начиная с элемента buf [offset]. Метод выполняет блокировку до тех пор, пока символы не будут записаны.
void write(char[] buf) throws lOException Метод аналогичен предыдущему при условии offset = 0 и count = buf.length.
void write(String string, int offset, int count) throws lOException Запись count символов строки string, начиная с символа string.charAt(offset).
void write(String string) throws lOException Метод аналогичен предыдущему при условии offset = 0 и count = string.length()).

Классы, производные от Writer, должны реализовать вариант метода write, связанного с записью символов из части массива, а также методов close и flush. Все остальные методы Writer основаны на трех методах, названных выше. Это отличает Writer от класса OutputStream, в котором в качестве базового метода вывода предусмотрен вариант write, осуществляющий вывод одного байта, а для методов flush и close предложены реализации по умолчанию.

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

Наследники класса Writer

  • BufferedWriter — буферизированный выходной символьный поток; позволяет повысить производительность за счёт снижения количества операций физической записи в выходное устройство;
  • CharArrayWriter — выходной поток, который пишет в символьный массив;
  • FileWriter — выходной поток, пишущий в файл; в конструкторе можно определить вывод в конец файла. Создание объекта не зависит от наличия файла, он будет создан в случае необходимости. Если файл существует и он доступен только для чтения, то передаётся исключение IOException
  • FilterWriter — фильтрующий писатель
  • OutputStreamWriter -выходной поток, транслирующий байты в символы
  • PipedWriter — выходной канал
  • PrintWriter — выходной поток, включающий методы print() и println()
  • StringWriter — выходной поток, пишущий в строку

Класс BufferedWriter

Широкораспространенный в использовании класс BufferedWriter записывает текст в поток, предварительно буферизируя записываемые символы, тем самым снижая количество обращений к физическому носителю для записи данных.

BufferedWriter имеет следующие конструкторы :

В качестве параметра out конструктор BufferedWriter принимает поток вывода, в который надо осуществить запись. Второй параметр size указывает на размер буфера.

Пример использования классов FileWriter и BufferedWriter :