мой тестовый код 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)
хотя он существует:
Вы не можете полагаться на файловую систему. Вам нужно загружать файлы как ресурсы из пути к классам.
Это весенний проект?
Проект @TwiN gradle
Совершенно уверен, что вам нужен абсолютный путь, а не только от src. Взгляните на этот readAllBytes код.
@duffymo это тестовый код, поэтому загружать ресурсы проблематично
Нет, это потому, что вам не следует использовать File. Прочтите содержимое из InputStream.
@notyou да. скриншот прилагается
@EladBenda То, что говорит @duffymo, правда. Вы не могу полагаетесь на объект File для чтения содержимого из файла. Когда он будет упакован, вы не сможете прочитать file, потому что он находится в вашем пути к классам, а не в вашей файловой системе.
@duffymo, но он не работает в файле, который не найден. как бы вы написали код?
Нет, src / test / resources находится в пути к классам. Вы должны загружать относительно ресурсов.
@duffymo как бы вы написали код?
@Duffymo: Ваш комментарий бесполезен. Вы можете загрузить InputStream либо конструкцией File / Path (новый FileInputStream (новый файл ("./../cfg/myRes.txt")) и т. д.), Либо с помощью getClass (). GetResourceAsStream ("/ cfg / myRes. текст"). Прежний полагается на переменную SYSTEM PATH для разрешения, последний использует (java) CLASSPATH приложения.
Извините, ваш комментарий ничего не добавляет. Да, я знаю, как работают файловая система и путь к классам.




Я думаю, вам следует удалить «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 ")); `
Думаю, я объяснил, что src / test / resources находится в пути к классу. Убери это и оставь остальное. Должен быть «SenegalAndBulgariaConfig.txt».
Разве вы не хотите убедиться, что возвращаемый вами входной поток не является нулевым, прежде чем пытаться прочитать?
Я согласен со всеми (+1), но мы можем очень хорошо справиться с задачей без библиотеки ввода-вывода Apache Commons и без Spring.
Почему что-либо в src / должно быть в пути к классам?
Как я уже сказал в своем ответе, это должен быть getClass().getResourceAsStream("/SenegalAndBulgariaConfig.txt"), ему не нужно включать src/test/resources/ в путь.
Я не делал их обязательными. Идея та же. Я сказал, как я это сделал. Вот почему я не разместил код.
Часто возникает путаница между загрузкой файлов как ресурсов (через путь к классам) или обращением к ним непосредственно на диске. Может быть, мой ответ здесь поможет вам различить и то, и другое.
Следующее должно работать, если 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 ??
Apache Commons IO
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");
Файл определенно существует в этом месте?