Давайте рассмотрим один из простых вариантов чтения данных из файла при помощи Java.
Для простого примера нам потребуется создать какой-то тестовый файл в директории на компьютере, из которого и будем читать содержимое. В моём случае я создал файл в директории C:\Users\user\Documents\mydata.txt и поместил туда следующее содержимое:
Это простой пример
содержимого файла,
которое мы считаем с помощью
программы на Java
Дальше создадим простой Java-класс BufferedReaderWithCycle в пакете с нашим проектом. У меня пакет называется ru.allineed.samples.io. Если у Вас другое название пакета, для выполнения примера из статьи лишь потребуется заменить его в первой строке нашей простой программы.
Итак, в листинге ниже один из вариантов, как можно прочитать данные из нашего тестового файла:
package ru.allineed.samples.io;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderWithCycle {
public void readFile(String pathToFile) {
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(pathToFile));
while (bufferedReader.ready()) {
String line = bufferedReader.readLine();
System.out.println(line);
}
} catch (IOException e) {
throw new RuntimeException("File '" + pathToFile + "' was not found! It must be present on the disk to run the sample.", e);
}
}
}
В этом простом классе единственный метод readFile(), в который необходимо будет передать путь к файлу для чтения из него данных. Метод создаст экземпляр класса BufferedReader, с помощью которого удобно читать содержимое файла, расположенного по заданному пути, который мы передаём также в новый объект FileReader и передаем этот объект, в свою очередь, в конструктор класса BufferedReader.
Далее, всё что требуется - организовать цикл до тех пор, пока метод ready() возвращает значение true. Согласно документации Java, метод read() говорит о том, что стрим, для которого он применяется, готов к прочтению. Буферизированный символьный стрим считается готовым, если буфер непустой, или если нижележащий символьный поток готов. Он возвращает true, если следующий вызов метода read() гарантированно не заблокирует ввод, в противном случае метод вернёт false. Также в документации просят обратить внимание на то, что возврат значения false методом ещё не гарантирует, что последующее чтение будет блокировать ввод.
В цикле while мы вызываем метод readLine(), который считывает из файла очередную строку с данными и далее сразу же выводим её в стандартный поток вывода (т.е. на консоль). Строкой считается последовательность символов, которая оканчивается либо символом перевода строки (\n), либо символом возврата каретки (\r), либо символом возврата каретки, за которым сразу же следует символ перевода строки (т.е. последовательность \r\n).
Как нетрудно догадаться, при вызове метода readFile() и передаче ему пути к файлу в качестве аргумента, на экран будет выведено содержимое нашего файла (создание экземпляра класса, вызывающего readFile() метод - в конце этой статьи):
Это простой пример
содержимого файла,
которое мы считаем с помощью
программы на Java
Второй вариант чтения данных из нашего файла (также с помощью класса BufferedReader) заключается в вызове метода lines(), возвращающий строковый стрим (Stream<String>), к которому можно применить оператор forEach и вывести с его помощью все строки на экран консоли:
package ru.allineed.samples.io;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class BufferedReaderWithLines {
public void readFile(String pathToFile) {
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(pathToFile));
bufferedReader.lines().forEach(System.out::println);
} catch (FileNotFoundException e) {
throw new RuntimeException("File '" + pathToFile + "' was not found! It must be present on the disk to run the sample.", e);
}
}
}
Этот вариант для выполнения задачи "считать строки из файла и вывести их на экран" лично мне кажется более компактным и изящным, чем предыдущий, где требовался цикл while.
Какой из них использовать - на Ваше усмотрение. Напишите в комментариях к статье, что думаете - какой вариант нравится больше.
Для запуска обоих вариантов создадим файл с названием ReadingFileExample, в котором определим строковую константу с именем PATH_TO_FILE и укажем в ней путь до файла (в вашем случае просто поменяйте этот путь на тот, что есть в вашей системе):
package ru.allineed.samples.io;
public class ReadingFileExample {
public static final String PATH_TO_FILE = "C:\\Users\\user\\Documents\\mydata.txt";
public static void main(String[] args) {
BufferedReaderWithCycle bufferedReaderWithCycle = new BufferedReaderWithCycle();
bufferedReaderWithCycle.readFile(PATH_TO_FILE);
BufferedReaderWithLines bufferedReaderWithLines = new BufferedReaderWithLines();
bufferedReaderWithLines.readFile(PATH_TO_FILE);
}
}
Как видим, в методе main() мы последовательно вызовем методы readFile() обоих классов, каждый из которых считает данные из файла и выведет на экран консоли.
Подведём итоги, в нашем репозитории с примерами на Java оба варианта для чтения данных из файла вынесены в отдельные классы:
- BufferedReaderWithCycle - https://github.com/AllineedRu/JavaExamples/blob/main/allineed-core/src/main/java/ru/allineed/samples/io/BufferedReaderWithCycle.java
- BufferedReaderWithLines - https://github.com/AllineedRu/JavaExamples/blob/main/allineed-core/src/main/java/ru/allineed/samples/io/BufferedReaderWithLines.java
Класс BufferedReaderWithCycle содержит метод с кодом из первого сниппета статьи, где чтение данных из файла производится с помощью цикла while, а BufferedReaderWithLines содержит метод с чтением данных при помощи вызова метода lines(). Оба класса по очереди вызываются из класса с примером ReadingFileExample, ссылку на который вы найдете ниже.
Примеры из этой статьи: https://github.com/AllineedRu/JavaExamples/blob/main/allineed-core/src/main/java/ru/allineed/samples/io/ReadingFileExample.java