Автор оригинала: 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 Streamlines = 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"); Streamlines = 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"; Listlines = 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/”