Прочитать матрицу из файла java

Обновлено: 04.07.2024

Существует множество способов чтения и записи файлов на Java .

Обычно у нас есть некоторые данные в памяти, с которыми мы выполняем операции, а затем сохраняем их в файле. Однако, если мы хотим изменить эту информацию, нам нужно поместить содержимое файла обратно в память и выполнить операции.

Этого можно достичь с помощью нескольких различных подходов:

  • Файлы.Строки для чтения()
  • Устройство для чтения файлов
  • Сканер
  • Буферизатор
  • Поток ввода объекта
  • API потоков Java

Файлы.Строки для чтения()

Начиная с Java 7, можно очень простым способом загрузить все строки файла в ArrayList :

Мы также можем указать кодировку для обработки различных форматов текста, если это необходимо:

Files.ReadAllLines() автоматически открывает и закрывает необходимые ресурсы.

Сканер

Каким бы приятным и простым ни был предыдущий метод, он полезен только для чтения файла строка за строкой. Что произойдет, если все данные будут храниться в одной строке?

Простым примером того, когда мы предпочли бы использовать Сканер , было бы, если бы в нашем файле была только одна строка, и данные должны быть проанализированы во что-то полезное.

Давайте взглянем на пример файла:

Запуск этого фрагмента кода приведет к тому, что мы получим ArrayList с этими элементами:

С другой стороны, если бы мы использовали только разделитель по умолчанию (пробел), то ArrayList выглядел бы так:

Сканер имеет некоторые полезные функции для анализа данных, такие как nextInt() , nextDouble () и т.д.

Даже если мы не видим этого, когда мы вызываем такие функции, как scanner.nextInt() или scanner.hasNextDouble () , Сканер использует регулярные выражения в фоновом режиме.

Очень важно: | Чрезвычайно Распространенная ошибка при использовании Сканера возникает при работе с файлами, содержащими несколько строк , и использовании . nextLine () в сочетании с . nextInt () , nextDouble () и т. Д.

Давайте взглянем на другой файл:

Часто новые разработчики, использующие Сканер , пишут код, подобный:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Если вы начнете отладку и распечатаете отсканированное, вы увидите, что в хорошо загружено, но Строки пусты.

Почему это так? Первое, что важно отметить, это то, что как только Сканер считывает что-либо из файла, он продолжает сканирование файла с первого символа после ранее отсканированных данных.

Наш файл, на самом деле, выглядит так:

Когда мы впервые вызываем .nextInt() , Сканер считывает только число 12 и оставляет первое \n непрочитанным.

Поэтому, когда мы вызываем .nextLine () , в результате мы получаем пустую строку, так как Сканер не добавляет символ \n в возвращаемую строку.

Теперь Сканер находится в начале второй строки вашего файла, и когда мы пытаемся вызвать .nextInt() , Сканер обнаруживает что-то, что не может быть проанализировано в int и выдает вышеупомянутое Исключение InputMismatchException .

Решения

  • Учитывая, что мы знаем, как example.txt отформатирован, мы можем прочитать весь файл строка за строкой и проанализировать необходимые строки с помощью Integer.parseInt() :

Буферизатор

BufferedReader считывает текст из потока ввода символов, но делает это путем буферизации символов для обеспечения эффективных операций .read () . Поскольку доступ к жесткому диску занимает очень много времени, BufferedReader собирает больше данных, чем мы просим, и сохраняет их в буфере.

Это подводит нас к тому, что BufferedReader хорошо подходит для чтения больших файлов. BufferedReader имеет значительно большую буферную память, чем Сканер (8192 символа по умолчанию против 1024 символов по умолчанию соответственно).

BufferedReader используется в качестве оболочки для других Читателей , и поэтому конструкторы для BufferedReader принимают Читатель объект в качестве параметра, например Читатель файлов .

Мы используем пробные ресурсы, поэтому нам не нужно закрывать считыватель вручную:

Рекомендуется обернуть файловый редактор с Буферным читателем , именно из-за преимуществ производительности.

Поток ввода объекта

ObjectInputStream следует использовать только вместе с ObjectOutputStream . Что эти два класса помогают нам сделать, так это сохранить объект (или массив объектов) в файл, а затем легко прочитать из этого файла.

Это можно сделать только с классами, реализующими Сериализуемый интерфейс. Интерфейс Сериализуемый не имеет методов или полей и служит только для определения семантики сериализуемости:

API потоков Java

Начиная с Java 8, еще одним быстрым и простым способом загрузки содержимого файла в Список массивов было бы использование Java Streams API :

Однако имейте в виду, что этот подход, как и Files.ReadAllLines () , будет работать только в том случае, если данные хранятся в строках.

Приведенный выше код не делает ничего особенного, и мы редко использовали бы потоки таким образом. Однако, поскольку мы загружаем эти данные в ArrayList , чтобы мы могли обработать их в первую очередь, потоки предоставляют отличный способ сделать это.

Мы можем легко сортировать/фильтровать/сопоставлять данные перед их сохранением в списке массивов :

Читайте также: