Java предоставляет несколько методов чтения файлов. Каждый из этих методов подходит для чтения файлов разных типов в разных ситуациях. Некоторые лучше подходят для чтения более длинных файлов, другие - для чтения более коротких и т. Д.
В этом руководстве мы будем использовать следующие классы Java для чтения файлов.
На протяжении всего урока мы используем файл, хранящийся в каталоге src
каталог, в котором путь к файлу равен src/file.txt
.
Прежде чем продолжить, сохраните в этом файле несколько строк текста.
Примечание:Вы должны правильно обрабатывать ошибки при использовании этих реализаций, чтобы придерживаться лучших практик кодирования.BufferedReader
класс читает поток ввода символов. Он буферизует символы в буфере с размером по умолчанию 8 КБ, чтобы сделать процесс чтения более эффективным. Если вы хотите читать файл построчно, используйте BufferedReader.
BufferedReader
эффективен при чтении больших файлов.
import java.io.*; public class FileReaderWithBufferedReader {
public static void main(String[] args) throws IOException{We
String file = 'src/file.txt';
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
//process the line as required
System.out.println(curLine);
}
bufferedReader.close();
} }
readline()
метод возвращает null, когда достигается конец файла.
Мы можем использовать BufferedReader
для чтения файла в кодировке UTF-8.
На этот раз мы передаем InputStreamReader
объект при создании BufferedReader
пример.
import java.io.*; public class EncodedFileReaderWithBufferedReader {
public static void main(String[] args) throws IOException {
String file = 'src/fileUtf8.txt';
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), 'UTF-8'));
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
//process the line as you require
System.out.println(curLine);
}
} }
Java Files
Класс, представленный в Java 7 в Java NIO, полностью состоит из статических методов, работающих с файлами.
Использование Files
class, вы можете прочитать все содержимое файла в массиве. Это делает его хорошим выбором для чтения небольших файлов.
Давайте посмотрим, как мы можем использовать класс Files в обоих этих сценариях.
readAllLines()
метод Files
Класс позволяет читать все содержимое файла и сохраняет каждую строку в массиве в виде строк.
Вы можете использовать Path
класс, чтобы получить путь к файлу, поскольку Files
класс принимает Path
объект файла.
import java.io.IOException; import java.nio.file.*; import java.util.*; public class SmallFileReaderWithFiles {
public static void main(String[] args) throws IOException {
String file = 'src/file.txt';
Path path = Paths.get(file);
List lines = Files.readAllLines(path);
} }
Вы можете использовать readAllBytes()
для извлечения данных, хранящихся в файле, в массив байтов вместо массива строк.
byte[] bytes = Files.readAllBytes(path);
Если вы хотите прочитать большой файл с Files
класс, вы можете использовать newBufferedReader()
для получения экземпляра BufferedReader
class и прочитайте файл построчно, используя BufferedReader
.
import java.io.*; import java.nio.file.*; public class LargeFileReaderWithFiles {
public static void main(String[] args) throws IOException {
String file = 'src/file.txt';
Path path = Paths.get(file);
BufferedReader bufferedReader = Files.newBufferedReader(path);
String curLine;
while ((curLine = bufferedReader.readLine()) != null){
System.out.println(curLine);
}
bufferedReader.close();
} }
В Java 8 появился новый метод в классе Files для чтения всего файла в Stream
струн.
import java.io.IOException; import java.nio.file.*; import java.util.stream.Stream; public class FileReaderWithFilesLines {
public static void main(String[] args) throws IOException {
String file = 'src/file.txt';
Path path = Paths.get(file);
Stream lines = Files.lines(path);
lines.forEach(s -> System.out.println(s));
lines.close();
} }
Scanner
Класс разбивает содержимое файла на части, используя заданный разделитель, и читает его по частям. Этот подход лучше всего подходит для чтения содержимого, разделенного разделителем.
Например, Scanner
class идеально подходит для чтения списка целых чисел, разделенных пробелами, или списка строк, разделенных запятыми.
Разделитель по умолчанию для Scanner
класс - это пробел. Но вы можете установить в качестве разделителя другой символ или регулярное выражение. Он также имеет различные методы next, такие как next()
, nextInt()
, nextLine()
и nextByte()
, для преобразования содержимого в разные типы.
import java.io.IOException; import java.util.Scanner; import java.io.File; public class FileReaderWithScanner {
public static void main(String[] args) throws IOException{
String file = 'src/file.txt';
Scanner scanner = new Scanner(new File(file));
scanner.useDelimiter(' ');
while(scanner.hasNext()){
String next = scanner.next();
System.out.println(next);
}
scanner.close();
} }
В приведенном выше примере мы устанавливаем разделитель на пробел и используем next()
для чтения следующей части содержимого, разделенной пробелом.
Вы можете использовать Scanner
для чтения всего файла сразу без запуска цикла. Вы должны пройти “\Z”
как разделитель для этого.
scanner.useDelimiter('\Z'); System.out.println(scanner.next()); scanner.close();
Примечание:Класс Scanner не синхронизирован и, следовательно, не является потокобезопасным.Как вы видели в этом руководстве, Java предлагает множество методов, которые вы можете выбрать в зависимости от характера выполняемой задачи для чтения текстовых файлов. Вы можете использовать BufferedReader
читать большие файлы построчно.
Если вы хотите прочитать файл, содержимое которого разделено разделителем, используйте Scanner
класс.
Также вы можете использовать Java NIO Files
класс для чтения как маленьких, так и больших файлов.