Рубрики
Без рубрики

Как прочитать файл на Java

– Как прочитать файл на Java

Автор оригинала: mkyong.

Эта статья посвящена нескольким наиболее часто используемым методам чтения файла на Java.

  1. Файлы.строки , возвращают поток ( Java 8)
  2. Files.ReadString , возвращает Строка (Java 11), максимальный размер файла 2G.
  3. Files.ReadAllBytes , возвращает байт[] (Java 7), максимальный размер файла 2G.
  4. Files.ReadAllLines , возвращает Список<Строка> ( Java 8)
  5. BufferedReader , классический старый друг (Java 1.1 -> навсегда)
  6. Сканер (Java 1.5)

Новая Java 8 Files.lines хорошо работает при чтении небольших или больших текстовых файлов, возвращает Поток (гибкий тип и поддержка параллельных), автоматически закрывает ресурсы и содержит одну строку чистого кода.

  Stream lines = 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";

  Stream lines = 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";

  Stream lines = Files.lines(Paths.get(fileName));

  // java.lang.OutOfMemoryError: Java heap space
  List collect = lines.collect(Collectors.toList());

1.5 Последний, lines.foreach , не сохраняет порядок строк, попробуйте lines.forEachOrdered если мы хотим сохранить порядок.

  Stream lines = 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-ввод-вывод

Рекомендации

Оригинал: “https://mkyong.com/java/java-how-to-read-a-file/”