Сравнение, представленное вами в вопросе, ясно объясняет природу проблемы. Рассмотрим этот код:
File f = new File(s);
System.out.println(s+" exists: "+f.exists());
и соответствующий вывод:
file:/Users/x/java_local/target/classes/../../src/my.json exists: false
Очевидно, s
, строка, которую вы пытаетесь использовать в качестве имени файла, - file:/Users/x/java_local/target/classes/../../src/my.json
. Видите этот файл: в начале? У вас есть допустимое строковое представление URL, но File(String)
ожидает, что аргумент будет простым путем.
Возможно, вы хотите
File f = new File(new URI(s));
, но обратите внимание, что это не удастся, если ваш класс упакован в Jar, потому что тогда ваш URI будет иметь схему jar:
, а File(URI)
принимает только URI, имеющие схему file:
.
Если вы хотите прочитать ресурс, связанный с вашим классом и расположенный относительно него, то я бы предложил использовать Class.getResourceAsStream(relativePath)
и использовать полученный InputStream
.