Файл не найден по пути "" src / test / resources / "

мой тестовый код java пытается добраться до файла в папках моего проекта

но я получаю исключение ввода-вывода:

   String fileContents = new String(Files.readAllBytes(
            Paths.get("src/test/resources/SenegalAndBulgariaConfig.txt")));


   String fileContents = new String(Files.readAllBytes(
            Paths.get("src/")));

Раньше работало, но теперь нет:

java.nio.file.NoSuchFileException: src/test/resources/SenegalAndBulgariaConfig.txt

    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
    at java.nio.file.Files.newByteChannel(Files.java:361)
    at java.nio.file.Files.newByteChannel(Files.java:407)
    at java.nio.file.Files.readAllBytes(Files.java:3152)

хотя он существует:

Файл не найден по пути "" src / test / resources / "

Файл определенно существует в этом месте?

achAmháin 25.04.2018 17:10

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

duffymo 25.04.2018 17:10

Это весенний проект?

TwiN 25.04.2018 17:12

Проект @TwiN gradle

Elad Benda 25.04.2018 17:12

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

Neil 25.04.2018 17:13

@duffymo это тестовый код, поэтому загружать ресурсы проблематично

Elad Benda 25.04.2018 17:13

Нет, это потому, что вам не следует использовать File. Прочтите содержимое из InputStream.

duffymo 25.04.2018 17:14

@notyou да. скриншот прилагается

Elad Benda 25.04.2018 17:14

@EladBenda То, что говорит @duffymo, правда. Вы не могу полагаетесь на объект File для чтения содержимого из файла. Когда он будет упакован, вы не сможете прочитать file, потому что он находится в вашем пути к классам, а не в вашей файловой системе.

TwiN 25.04.2018 17:15

@duffymo, но он не работает в файле, который не найден. как бы вы написали код?

Elad Benda 25.04.2018 17:15

Нет, src / test / resources находится в пути к классам. Вы должны загружать относительно ресурсов.

duffymo 25.04.2018 17:15

@duffymo как бы вы написали код?

Elad Benda 25.04.2018 17:17

@Duffymo: Ваш комментарий бесполезен. Вы можете загрузить InputStream либо конструкцией File / Path (новый FileInputStream (новый файл ("./../cfg/myRes.txt")) и т. д.), Либо с помощью getClass (). GetResourceAsStream ("/ cfg / myRes. текст"). Прежний полагается на переменную SYSTEM PATH для разрешения, последний использует (java) CLASSPATH приложения.

Heri 26.04.2018 10:26

Извините, ваш комментарий ничего не добавляет. Да, я знаю, как работают файловая система и путь к классам.

duffymo 26.04.2018 12:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
14
3 142
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я думаю, вам следует удалить «src» из строки содержимого файла.

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

Никогда не следует полагаться на File. Загрузите InputStream из пути к классам.

Оба src / main / resources и src / test / resources находятся в пути к классам, если вы используете стандартную структуру каталогов Maven.

Мне нравится библиотека ввода-вывода Apache Commons и Spring ClassPathResource.

Я получаю NPE для этого кода: `String fileContents = IOUtils.toString (getClass (). GetClassLoader (). GetResourceAsSt‌ ream (" src / test / resou‌ rces / SenegalAndBulga‌ riaConfig.txt ")); `

Elad Benda 25.04.2018 17:22

Думаю, я объяснил, что src / test / resources находится в пути к классу. Убери это и оставь остальное. Должен быть «SenegalAndBulgariaConfig.txt».

duffymo 25.04.2018 17:25

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

duffymo 25.04.2018 17:29

Я согласен со всеми (+1), но мы можем очень хорошо справиться с задачей без библиотеки ввода-вывода Apache Commons и без Spring.

davidxxx 25.04.2018 17:33

Почему что-либо в src / должно быть в пути к классам?

Gyro Gearless 25.04.2018 17:34

Как я уже сказал в своем ответе, это должен быть getClass().getResourceAsStream("/SenegalAndBulgariaConfig.tx‌​t"), ему не нужно включать src/test/resources/ в путь.

TwiN 25.04.2018 17:34

Я не делал их обязательными. Идея та же. Я сказал, как я это сделал. Вот почему я не разместил код.

duffymo 25.04.2018 17:55

Часто возникает путаница между загрузкой файлов как ресурсов (через путь к классам) или обращением к ним непосредственно на диске. Может быть, мой ответ здесь поможет вам различить и то, и другое.

Следующее должно работать, если SenegalAndBulgariaConfig.txt находится в /resources:

    InputStream is = getClass().getResourceAsStream("/SenegalAndBulgariaConfig.txt");
    StringWriter writer = new StringWriter();
    IOUtils.copy(is, writer, Charset.defaultCharset());
    String fileContents = writer.toString();
    System.out.println(fileContents );

ПРИМЕЧАНИЕgetClass() можно заменить на ClassName.class

Откуда берется IOUtils ??

Dan Rayson 19.06.2019 16:24

Apache Commons IO

TwiN 19.06.2019 19:19
private String readFileContent(String filePath) throws URISyntaxException, IOException {
    byte[] bytes = Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource(filePath).toURI()));
    return new String(bytes);
}

в вашем случае filePath будет SenegalAndBulgariaConfig.txt.

Например:

String senegalAndBulgariaConfig = readFileContent("SenegalAndBulgariaConfig.txt");

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