Java 8: чтение файла в строку

У меня есть файл json в том же пакете контроллера, и я пытаюсь прочитать файл и преобразовать его в строку

new String(Files.readAllBytes(Paths.get("CustomerOrganization.json")));

Но я получил ошибку:

java.nio.file.NoSuchFileException: CustomerOrganization.json

Java 8: чтение файла в строку

Я думаю, вы должны указать полный путь. Где (в вашей файловой системе) хранится этот файл?

deHaar 24.07.2019 09:52

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

Jonas Berlin 24.07.2019 09:53

вы также можете попробовать указать относительный путь от корня проекта, например src/.../controllers/CustomerOrganization.json

Michał Krzywański 24.07.2019 09:54

Если вы хотите узнать путь к файлу относительно вашего класса, вы можете использовать CustomerControllerIT.class.getResource("CustomerOrganization‌​.json")

Jonas Berlin 24.07.2019 09:54

Если вы ожидаете его в том же пакете, вы должны использовать ресурсы, файлы нет.

RealSkeptic 24.07.2019 09:55

Я рекомендую добавить параметр кодировки в вызов "new String(...)", чтобы убедиться, что он читает файл с правильной кодировкой.

Jonas Berlin 24.07.2019 09:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
6
9 643
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используя в основном те же методы, которые вы использовали:

new String(Files.readAllBytes(Paths.get(CustomerControllerIT.class.getResource("CustomerOrganization.json").toURI())));

Однако, если вам нужно, чтобы он работал изнутри JAR, вам нужно будет сделать это вместо этого:

InputStream inputStream = CustomerControllerIT.class.getResourceAsStream("CustomerOrganization.json");
// TODO pick one of the solutions from below url
// to read the inputStream into a string:
// https://stackoverflow.com/a/35446009/1356047

Верно, но это не было запрошено в вопросе.

Jonas Berlin 24.07.2019 10:35

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

RealSkeptic 24.07.2019 10:38

Правда, добавил и JAR-решение.

Jonas Berlin 24.07.2019 10:41

Обход URI будет работать даже из банки, если вы сначала создадите файловую систему. Но следует подчеркнуть, что конструктор String(byte[]) будет использовать системную кодировку по умолчанию, что, безусловно, не является правильным выбором для ресурса, встроенного в приложение Java. Приложение должно быть явным в отношении кодировки ресурса.

Holger 24.07.2019 12:52

Что с кодировкой?

AlikElzin-kilaka 29.10.2020 14:51

@AlikElzin-kilaka, вы имеете в виду ответ или комментарий Хольгера?

Jonas Berlin 30.10.2020 08:20

Вы должны указать полный путь в виде URI, как в приведенном ниже фрагменте кода, где файл json находится в том же пакете.

try {
        String s = new String(Files.readAllBytes(Paths.get("D:/Test/NTech/src/com/ntech/CustomerOrganization.json")));
        System.out.println(s);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Для получения дополнительной информации вы можете ознакомиться с документацией по методу public static Path get(URI uri) класса Paths по адресу: https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html.

Фрагмент кода ниже должен работать на вас.

Path path = Paths.get(CustomerControllerIT.class.getClassLoader().getResource(fileName).toURI());
byte[] fileBytes = Files.readAllBytes(path);
String fileContent = new String(fileBytes);

Другие вопросы по теме