Как использовать относительный путь вместо абсолютного при обработке?

Я довольно новичок в обработке (и программировании в целом).

В проекте, который я делаю, мне нужно получить доступ к следующему пути:

f = new File("C:/Users/Matthew/ColourFeature/data/image1.jpg");

Это, будучи абсолютным путем, работает без проблем.

Однако, поскольку эта программа будет запускаться на разных машинах, я пытаюсь выяснить, как использовать относительный путь в обработке для доступа к указанному выше пути. Кстати, для целей моего проекта я не могу использовать loadImage() обработки.

Любая помощь будет оценена


person peterS    schedule 28.01.2015    source источник
comment
Является ли image1.jpg частью вашего приложения или это данные, предоставленные пользователем?   -  person BetaRide    schedule 28.01.2015
comment
Кросспостинг: forum.processing.org/two/discussion/9209/   -  person Kevin Workman    schedule 28.01.2015
comment
@BetaRide yes image1.jpg является частью приложения. По сути, это будет одно изображение из коллекции изображений.   -  person peterS    schedule 28.01.2015


Ответы (4)


Я считаю, что Processing делает это довольно легко, если вы просто используете путь «data», который используется по умолчанию для каждого эскиза — просто подпапку с именем «data» в папке вашего эскиза.

Поместите все свои изображения (или любые другие файлы, если на то пошло) в папку данных, и вам обычно не нужно указывать абсолютный путь в большинстве случаев (например, с loadImage()).

Конечно, поскольку вы сказали, что не можете использовать loadImage(), вы всегда можете получить доступ к пути к папке данных, используя предоставленный метод dataPath(""). Например, когда я делаю

println(dataPath(""));

из моего примерного скетча я получаю следующий вывод: /Users/stephenbuchanan/Documents/Processing/testsketch/data

person Anselan    schedule 28.01.2015

Вы можете получить домашнюю папку пользователя:

String userHome = System.getProperty("user.home");

Что в вашем случае вернет "C:/Users/Matthew".

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

f = new File(userHome, "/ColourFeature/data/image1.jpg");

Этот конструктор File принимает 2 аргумента: родительская папка и относительная дочерняя папка и/или файл.

Теперь этот файл f будет указывать на правильный файл на всех машинах, если у текущего пользователя, вошедшего в систему, есть файл с именем "image1.jpg" в папке "/ColourFeature/data" внутри его/ее домашней папки.

person icza    schedule 28.01.2015

Если файл находится в вашем коде, вы можете использовать метод getResource classLoader.

eg

File newFile = new File(YourClass.class
                   .getResource("relative/path/from/YourClass.java")
                   .toString());

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

Вам могут помочь методы normalize() (их четыре) в классе FilenameUtils. Он находится в библиотеке ввода-вывода Apache Commons.

final String name =  "/a/b/../";
final String normalizedName = FilenameUtils.normalize(name, true); // "/a/"
getClass().getResource(normalizedName);
person Holloway    schedule 28.01.2015

Спасибо за помощь. Я оказался совсем простым. Решение следующее:

f = new File(dataPath(""), "/image1.jpg");

Однако стоит отметить, что использование dataPath("") в качестве глобальной переменной дает другой путь (я предполагаю, что это путь к альбому), чем использование dataPath("") в методе настройки.

Извините, если я использовал неправильные технические слова, но я новичок в программировании.

Спасибо еще раз

person peterS    schedule 28.01.2015