Ява построил относительный путь с использованием "../../" не распознается, почему? - PullRequest
0 голосов
/ 01 ноября 2018

Я использую intellij для разработки java, в моем каталоге project / src я получил файл my.json, и моя java-программа:

import java.io.File;
public class My {
    public static void main(String [] args){
        String s = My.class.getResource(".") + "../../src/my.json";
        File f = new File(s);
        System.out.println(s+" exists: "+f.exists());
    }
}

Он печатает:

file:/Users/x/java_local/target/classes/../../src/my.json exists: false

Но если я "ls" в командной строке:

ls /Users/x/java_local/target/classes/../../src/my.json

Тогда я это вижу.

Так что, похоже, что Java-код, созданный относительным путем, недопустим. Если я использую абсолютный путь в коде, то это работает.

Я на маке. Любые объяснения, как эта проблема происходит и как я могу это исправить?

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Сравнение, представленное вами в вопросе, ясно объясняет природу проблемы. Рассмотрим этот код:

        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.

0 голосов
/ 01 ноября 2018

Заменить My.class.getResource(".") на My.class.getResource(".").getPath().

file:/Users/x/java_local/target/classes/../../src/my.json буквально проверяется как путь к файлу с префиксом file: и, следовательно, не найден в системе.

...