Зчитування інформації з файлу одним рядком коду в jdk 7 або java 8, java

Зчитування інформації з файлу одним рядком коду в jdk 7 або java 8, java

Вважати вміст файлу в Java непросто, необхідно використовувати велику кількість шаблонного коду, з яким ми вже стикалися в попередньому прикладі в статті зчитування текстових файлів. Нам доводилося робити «обгортки» для багатьох речей, наприклад, поміщати FileInputStream всередині BufferedReader, задавати цикли з дивними умовами виходу і т.д. Починаючи з JDK 7, ситуація значно покращилася. JDK надає безліч корисних класів, наприклад Files і Paths, призначених для роботи з файлами і шляхами до них. У цій статті ви дізнаєтеся, як зчитати інформацію з файлу за допомогою одного рядка коду. Безумовно, ваш продакшн-код буде виглядати інакше, особливо якщо ви зчитуєте в пам'ять кілька гігабайт даних і при цьому хочете враховувати кодування. Якщо кодування не вибрана, то використовується кодування платформи, задана за замовчуванням. Коротше кажучи, вам знадобиться трохи більше коду, але для швидкого і грубого зчитування файлу цього способу буде досить. До речі, якщо код буде містити і обробку винятків, то він займе кілька рядків. У готовому робочому додатку вам потрібно буде враховувати ситуацію, коли його немає, наприклад, відображаючи користувачеві повідомлення про помилку, відправляючи метрики, зберігаючи в журнал помилку і т.д. але в будь-якому випадку в ньому буде набагато менше шаблонного коду, ніж в звичних для вас випадках.

Java 8 спростила життя розробників за допомогою свого нового набору методів, які використовують переваги API потоків (stream API). Крім того, в клас Files було додано кілька нових методів, завжди використовують UTF-8, замість довільної кодування платформи, наприклад, Files.readAllLines (). Цей метод зчитує всі рядки з файлу. Байти з файлу розшифровуються в символи за допомогою кодування UTF-8. Метод є еквівалентним методом Java 7 Files.readAllLines (path, StandardCharsets.UTF_8). До речі, ЗАВЖДИ явно вказуйте кодування символів при конвертації масиву байтів в рядок String. Завжди явно вказуйте кодування, навіть якщо ваш зчитування файл в поточний момент містить тільки англійську мову.

Зчитування файлу одним рядком коду вJava7 і 8

Перед вами приклад нашої програми на Java, яка демонструє, як повністю вважати файл всього одним рядком коду. У нашому прикладі використовується новий клас Files, що з'явився в JDK 1.7, клас java.nio.file.Files містить безліч корисних методів для роботи з файлами в Java, наприклад, перевірка, чи є файл прихованим. або доступний він тільки для читання. Ви можете використовувати команду Files.readAllBytes (Шлях), щоб повністю вважати файл в пам'ять. Цей метод повертає масив байтів, який може бути переданий в конструктор String для створення з нього рядки String. Також метод дозволяє гарантувати, що файл буде закритий належним чином після зчитування всіх байтів, або в разі виникнення помилки введення-виведення або будь-якого іншого необробленого виключення, що означає, що вам не потрібно закривати файл в блоці finally. тобто, не потрібно буде писати шаблонний код. Слід зазначити, що даний метод не підходить для зчитування великих файлів, оскільки, якщо в Heap буде недостатньо вільного місця, у вас може закінчитися пам'ять. Також вам слід явно вказувати кодування символів при конвертації масиву байтів в рядок String щоб уникнути неприємних сюрпризів або помилки парсинга.

Якщо ж ви хочете вважати файл, як рядок String, ви можете використовувати інший метод, який називається readAllLines (Path path, Charset cs). Цей метод схожий на попередній, тобто він теж закриває файли після зчитування або в разі виникнення помилки, але замість масиву байтів він повертає рядок, яка конвертується з байтів за допомогою вказаного набору символів. Крім того, в Java 8 була додана ще одна перевантажена версія цього методу, яка не вимагає параметра Charset (кодування), і використовує UTF-8 для конвертації байтів в String.

Приємності на цьому не закінчуються. Якщо ви хочете вважати файл через підрядник. то можете скористатися методом Files.lines (), що повертає потік з рядками, ліченими з файлу, в яких байти конвертуються в символи за допомогою кодування UTF-8. Використовуючи метод forEach (), ви можете вивести всі рядки файлу в консоль за допомогою всього одного рядка Java-коду, що продемонстровано в третьому фрагменті коду.

Ви можете зробити код ще коротше, використовуючи статичний імпорт в Java. як показано нижче:

Якщо ви використовуєте Java 8, ви також можете скористатися Stream API, що дає можливість писати більш лаконічний і продуктивний код, що показано в наступному прикладі. Тут метод lines () повертає Stream of String (потік рядків), який конвертується з байтів, лічених з файлу, в символи за допомогою кодування UTF-8. Це рівносильно викликом методу Files.lines (path, StandardCharsets.UTF_8) в Java 7.

Ось і все, що вам потрібно знати, щоб вважати текст або бінарний файл за допомогою одного рядка коду в Java 7. Як бачите, нові інструменти File API в JDK 7 і Stream API в Java 8 значно спростили завдання по зчитуванню даних з файлів в Java . Цей дозволило повністю позбутися від шаблонного коду, що призвело до набагато більш зрозумілому і лаконічному коду. До речі, якщо ви пишете продакшн-код, який виконує зчитування інформації з файлу, то не забудьте звернути увагу на наступні моменти:

  • Файл може бути занадто великим для приміщення в пам'ять, тому перед зчитуванням уважно вивчайте його розмір і враховуйте ситуації, коли не зможете вважати файл.
  • Зберігайте в журналі всі повідомлення про причини неможливості зчитування файлу або про помилки, що виникли в процесі зчитування.
  • Завжди вказуйте кодування символів, зчитуючи байти в символи.
  • Пам'ятайте, файл може й не бути, так що цю ситуацію теж потрібно врахувати.