Чтение XML файла в Java unit тесте: простое решение
Быстрый ответ
String fileName = "example.txt";
// Для ОС Windows используется "\\" вместо "/".
InputStream is = this.getClass().getResourceAsStream("/" + fileName);
// Все переводы строк сохраняются.
String content = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))
.lines().collect(Collectors.joining(System.lineSeparator()));
Обязательно убедитесь в том, что файл example.txt
находится в директории src/test/resources
, если вы используете для работы инструменты Maven или аналогичные инструменты в Gradle.
Использование InputStream
для получения String
Предлагаемый подход к преобразованию InputStream
в String
выглядит следующим образом:
String result = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))
.lines().collect(Collectors.joining("\n"));
В этом фрагменте кода применяются функциональные возможности Java 8, а также используется указанная кодировка, где оптимальным вариантом будет UTF-8.
Библиотеки, упрощающие работу
Работа с файлами становится значительно проще, если использовать такие библиотеки как Apache Commons IO и Google Guava.
String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
// Спасибо Apache Commons IO за облегчение задачи!
Когда важен размер: работа с большими файлами
Если вы столкнулись с работой с большими файлами, стоит избегать ошибок OutOfMemoryError, исполняя чтение содержимого файла по строкам или воспользуйтеcь потоками. Важно также учесть те ситуации, когда доступ к файлу ограничен или файл не может быть найден.
Будущее уже здесь: Java NIO
С версии языка Java 7, класс java.nio.file.Files
предлагает методы для эффективного чтения файлов:
List<String> lines = Files.readAllLines(Paths.get(resource.toURI()), StandardCharsets.UTF_8);
String content = String.join("\n", lines);
// Теперь проблемы с переводами строк в прошлом!
Визуализация
Представим, что ваш unit-тест — это кухня, а рецепт (ресурс) — необходим для приготовления блюда (теста).
Возьмём кухню(тестовую среду) 🍲 : Рецепт (ресурс) — необходимость для блюда (теста).
Чтение рецепта — Представляет собой получение списка ингредиентов (чтение текстового файла ресурса).
- Находим рецепт на полке (определяем расположение файла).
👀📂: Находим '"Boiled_water.txt"' в директории 'resources'.
- Читаем инструкции (загружаем ресурс).
📔🔍: Используем getResourceAsStream("/Boiled_water.txt")
для чтения файла 'Boiled_water.txt'.
- Приступаем к выполнению рецепта (используем загруженный ресурс).
🍲✨: Проверяем и подтверждаем свойства, основываясь на прочитанном рецепте.
Таким образом, вы просто и легко сможете найти и использовать ресурсы, подобно опытному шеф-повару!
Построение надёжности
Важно предусмотреть обработку ошибок и исключений, которые могут возникнуть при чтении файла.
// Предусмотрите обработку исключений
catch(IOException ex) {
throw new UncheckedIOException("Произошла ошибка при чтении ресурсного файла", ex);
}
Философия чистой кухни: закрытие ресурсов
Необходимо заботиться о предупреждении утечек ресурсов путём их правильного закрытия. С InputStream
это проще, поскольку он автоматически закрывается:
try(InputStream is = this.getClass().getResourceAsStream("/example.txt")) {
// Обработка ресурса выполняется здесь...
}
// И утечек не остаётся!