Автор оригинала: mkyong.
Эта статья посвящена нескольким наиболее часто используемым методам чтения файла на Java.
Файлы.строки, возвращаютпоток( Java 8)Files.ReadString, возвращаетСтрока(Java 11), максимальный размер файла 2G.Files.ReadAllBytes, возвращаетбайт[](Java 7), максимальный размер файла 2G.Files.ReadAllLines, возвращаетСписок<Строка>( Java 8)BufferedReader, классический старый друг (Java 1.1 -> навсегда)Сканер(Java 1.5)
Новая Java 8 Files.lines хорошо работает при чтении небольших или больших текстовых файлов, возвращает Поток (гибкий тип и поддержка параллельных), автоматически закрывает ресурсы и содержит одну строку чистого кода.
Streamlines = Files.lines(Paths.get(fileName));
В современной Java 8+ мы должны использовать Files.lines для чтения текстового файла.
Примечание В двух словах, нет большой разницы в чтении небольших файлов, просто вкус возвращаемого типа. Для чтения в большом файле выберите Java 8 Files.lines для потоковых и параллельных функций или классический БуферизоВанный читатель .
Текстовый Файл
Вот простой текстовый файл, содержащий всего пять строк. Остальные примеры Java будут читать этот файл.
Line 1 Line 2 Line 3 Line 4 Line 5
1. Файлы.строки ( Java 8)
1.1 В этом примере используется Java 8 Files.lines для чтения вышеупомянутого файла в Поток и печати его строка за строкой. Кроме того, Files.lines поможет автоматически закрыть открытый ресурс (файл); нам не нужно заключать код в try-with-resources .
package com.mkyong.io.file;
import com.mkyong.io.utils.ResourceHelper;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ReadFile1 {
public static void main(String[] args) throws IOException {
String fileName = ResourceHelper.getAbsoluteFilePath("app.log");
// auto-close the resources
Stream lines = Files.lines(Paths.get(fileName));
// does not preserve order
lines.forEach(System.out::println);
// preserve order
// lines.forEachOrdered(System.out::println);
}
}
Выход
Line 1 Line 2 Line 3 Line 4 Line 5
1.2 Для чтения в небольшом текстовом файле мы можем использовать собрать легко преобразовать поток в Список<Строка> .
String fileName = ResourceHelper.getAbsoluteFilePath("app.log");
Stream lines = Files.lines(Paths.get(fileName));
// only for small text file
List collect = lines.collect(Collectors.toList());
1.3 Для чтения в большом текстовом файле, и если порядок строк не имеет значения, мы можем включить параллельный поток функция для дальнейшего повышения скорости чтения.
// a large text file, for example, 10G String fileName = "/home/mkyong/large.txt"; Streamlines = Files.lines(Paths.get(fileName)); // parallel lines.parallel().forEach(l -> {/* do work */});
1.4 Распространенной ошибкой является прямое преобразование большого Потока в Список , и это приведет к java.lang. Ошибка из памяти: Пространство кучи Java если размер потока больше, чем размер кучи запущенной JVM.
// a large text file, for example, 10G String fileName = "/home/mkyong/large.txt"; Streamlines = Files.lines(Paths.get(fileName)); // java.lang.OutOfMemoryError: Java heap space List collect = lines.collect(Collectors.toList());
1.5 Последний, lines.foreach , не сохраняет порядок строк, попробуйте lines.forEachOrdered если мы хотим сохранить порядок.
Streamlines = Files.lines(Paths.get(fileName)); // does not preserve order lines.forEach(System.out::println); // preserve order lines.forEachOrdered(System.out::println);
2. Файлы.Строка чтения (Java 11)
2.1 Это Files.ReadString() считывает файл в строку, и если размер файла для чтения превышает 2G, он выдает java.lang. Ошибка из памяти: Требуемый размер массива слишком велик .
package com.mkyong.io.file;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ReadFile2 {
public static void main(String[] args) throws IOException {
String fileName = "/home/mkyong/large.txt";
// default UTF_8
String s = Files.readString(Paths.get(fileName));
System.out.println(s);
// String s = Files.readString(Paths.get(fileName), StandardCharsets.UTF_8);
}
}
2.2 Просмотрите исходный код, новую Java 11 ReadString , внутренне используйте существующую Java 7 ReadAllBytes для чтения файла в байт[] и JLA.новая строка Без ответа для преобразования байта[] обратно в строку.
package java.nio.file;
public final class Files {
public static String readString(Path path, Charset cs) throws IOException {
Objects.requireNonNull(path);
Objects.requireNonNull(cs);
byte[] ba = readAllBytes(path);
if (path.getClass().getModule() != Object.class.getModule())
ba = ba.clone();
return JLA.newStringNoRepl(ba, cs);
}
//...
}
3. Файлы.ReadAllBytes (Java 7)
3.1 В этом примере используется Files.ReadAllBytes для чтения файла в массив байтов байт [] , если размер файла для чтения превышает 2G, он будет выбрасывать java.lang. Ошибка из памяти: Требуемый размер массива слишком велик .
import com.mkyong.io.utils.ResourceHelper;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ReadFile3 {
public static void main(String[] args) throws IOException {
String fileName = "/home/mkyong/app.log";
byte[] bytes = Files.readAllBytes(Paths.get(fileName));
String content = new String(bytes, StandardCharsets.UTF_8);
System.out.println(content);
}
}
4. Файлы.Строки для чтения (Java 8)
4.1 В этом примере используется Files.ReadAllLines чтобы прочитать файл в Список<Строка> , если размер файла больше, чем размер кучи запущенной JVM, он выбросит java.lang. Ошибка из памяти: Пространство кучи Java .
package com.mkyong.io.file;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class ReadFile4 {
public static void main(String[] args) throws IOException {
String fileName = "/home/mkyong/app.log";
List lines = Files.readAllLines(Paths.get(fileName),
StandardCharsets.UTF_8);
lines.forEach(System.out::println);
}
}
5. БуферизоВанный читатель (Java 1.1)
5.1 Классический и старый друг, BufferedReader пример, хорошо работает при чтении небольших и больших файлов, а размер буфера по умолчанию (8 кб) достаточно велик для большинства целей.
package com.mkyong.io.file;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile5a {
public static void main(String[] args) throws IOException {
String fileName = "/home/mkyong/app.log";
// defaultCharBufferSize = 8192; or 8k
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
}
5.2 Мы можем указать размер буфера.
package com.mkyong.io.file;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile5b {
public static void main(String[] args) throws IOException {
String fileName = "/home/mkyong/app.log";
int bufferSize = 10240; //10k
try (BufferedReader br = new BufferedReader(
new FileReader(fileName), bufferSize)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
}
5.3 В Java 8 мы можем использовать новый Files.newBufferedReader для создания BufferedReader .
try (BufferedReader br = Files.newBufferedReader(Paths.get(fileName))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
Просмотрите исходный код, ничего особенного.
package java.nio.file;
public final class Files {
public static BufferedReader newBufferedReader(Path path, Charset cs)
throws IOException
{
CharsetDecoder decoder = cs.newDecoder();
Reader reader = new InputStreamReader(newInputStream(path), decoder);
return new BufferedReader(reader);
}
//
}
Прочтите это – Java Как читать файл с помощью BufferedReader
5.4 Для справки, классическая попытка поймать, наконец, закрыть открытый файл вручную.
package com.mkyong.io.file;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ReadFile5c {
public static void main(String[] args) throws IOException {
String fileName = "/home/mkyong/app.log";
BufferedReader br = null;
FileReader fr = null;
try {
fr = new FileReader(fileName);
br = new BufferedReader(fr);
// read line by line
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.format("IOException: %s%n", e);
} finally {
try {
if (br != null)
br.close();
if (fr != null)
fr.close();
} catch (IOException ex) {
System.err.format("IOException: %s%n", ex);
}
}
}
}
6. Сканер (Java 1.5)
6.1 В классе Сканер функция разделитель по-прежнему полезна для чтения и фильтрации небольшого файла. Java 9 и Java 10 добавили новые методы, такие как найдите все и конструкторы для улучшения класса Сканер . Однако для чтения в большом файле этот класс Scanner работает медленно по сравнению с BufferedReader .
package com.mkyong.io.file;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class ReadFile6 {
public static void main(String[] args) throws IOException {
String fileName = "/home/mkyong/app.log";
try (Scanner sc = new Scanner(new FileReader(fileName))) {
while (sc.hasNextLine()) {
String line = sc.nextLine();
}
}
}
}
Скачать Исходный Код
$клон git $клон git
$cd java-ввод-вывод
Рекомендации
- Файлы Javadoc
- JAVADOCS для буферизованного чтения
- JavaDocs сканера
- Учебные пособия по Java – Чтение, запись и создание файлов
- Как прочитать файл в Java – BufferedReader
- Java – Чтение файла из папка ресурсов
Оригинал: “https://mkyong.com/java/java-how-to-read-a-file/”