2013-08-09 3 views
1

У меня есть файл, который находится в моем каталоге проекта:Как открыть файл без указания абсолютного каталога?

src/test/resources/250.csv 

Это код, который нуждается в этом:

CSVReader reader = new CSVReader(new FileReader(FILE_PATH)); 

FILE_PATH должен быть String

Как превратить это путь:

во что-то большее reli способный и относительный?

Мне нужно иметь возможность запускать мой код в Windows и Linux и перемещать этот файл ресурсов вместе с проектом, поэтому мне не нужно указывать абсолютные пути для его достижения, а пути по сравнению с моим проектом.

я прочитал этот вопрос об этом, но не мог применить его к моему делу: Absolute Path of Project's folder in Java

EDIT: У меня есть 4 недели опыта, и я считаю себя действительно новым для языка

EDIT: Это это решение принято отвечать в:

final String FILE_PATH = "src/test/resources/250.csv"; 
+2

Использование загрузчиков классов. –

+0

Вы также хотите, чтобы этот файл ресурсов редактировался? – seanhodges

+0

Нет, я не хочу, чтобы оно редактировалось. –

ответ

1

Любой относительный путь будет присоединен к текущему каталогу при запуске вашего кода. Поэтому, если вы запустите свой код из своего каталога проектов, вы можете поставить FILE_PATH = "src/test/resources/250.csv". В качестве альтернативы вы можете рассчитать местоположение файла csv относительно вашего файла class/jar.

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

// ... 
public static void main(String [] args) { 
    // if args.length != 1 display some useful message and exit 
    String filePath = args[1]; 
    CSVReader reader = new CSVReader(new FileReader(filePath)); 
    // ... 
} 
// ... 
+0

Это, безусловно, лучшее объяснение, и было действительно просто реализовать –

2

Вы можете использовать getResource/AsResource и работу с дорожками по отношению кзагрузчиком классов.

getclassLoader().getResourceAsStream(relativePath) 
getclassLoader().getResource(relativePath) 

Путь должен быть относительно корня пути к классам загрузчика классов. Вы можете посмотреть на SO и здесь для documentation.

Вы также можете посмотреть другой вариант, который работает с путем относительно .class.

class.getResourceAsStream(relativePath) 
class.getResource(relativePath) 

Пример кода:

//As file 
URL loc = this.class.getclassLoader().getResource("250.csv"); 
File f = new File(loc.getPath()); 
//As Stream 
InputStream loc = this.class.getclassLoader().getResourceAsStream("250.csv"); 
InputStreamReader in = new InputStreamReader(loc); 

Предполагая, что файлы в src/test/resources/ находятся на вашем пути к классам.

+0

Где я могу поместить этот фрагмент кода? Можете ли вы поместить его в какой-то контекст? –

+0

спасибо, но FILE_PATH должен быть строкой, и я попытался преобразовать файл f в строку, но ничего не произошло –

0

Посмотрите на метод ClassLoader's getResource(String name). Он попытается найти именованный ресурс в пути к классам. Предполагая, что вы используете maven, все в src/main/resources будет на пути к классам и будет найдено.

0

Вы должны использовать загрузчик ресурсов:

this.getClass().getClassLoader().getResourceAsStream("250.csv"); 
3

Относительные пути в Java являются относительными к месту пользователь был, когда они выполнили команду. Это имеет большое значение для некоторых вещей (например, команд оболочки), но не для других. Два стандартных альтернативных подхода подходят мне для решения этой проблемы (хотя я уверен, что их гораздо больше).

  • Поместите ресурс на пути к классам

Если ваш ресурс является частью вашего приложения, и пользователь не должен видеть или редактировать ресурс, то вы можете просто положить его на пути к классам (в Maven src/main/resources автоматически добавляется в путь к классам и файлы, входящие в JAR, поэтому они будут на пути к классу при развертывании), а затем загружать его с помощью Class.getResource().

  • Создание каталога данных пользователя

Создать каталог для хранения пользовательских файлов (например, ~/.appname) и создать вспомогательный класс для сохранения и загрузки файлов в этот каталог данных и инициализации этот каталог при запуске если он не существует. Тогда ваш код не будет загроможден длинными абсолютными путями, и ваше приложение будет переносимым.

0

Это, как вы можете получить свой проект корневой путь:

String path = System.getProperty("user.dir"); 

EDIT: Я неправильно понял ваши требования:

getClass().getClassLoader().getResourceAsStream("yourFileName"); 
0

Этот путь SRC/тест/ресурсы/250.csv предполагает, что это является Мавне. Если это так, то этот файл является ресурсом, который получит в проекте банку на уровне корня и может быть прочитана как это

CSVReader reader = new CSVReader(new InputStreamReader(getClass().getResourceAsStream("250.csv"))); 
0
URL fileURL= yourClassName.class.getResource("yourFileName.extension"); 
String myURL= fileURL.toString(); 

теперь вам не нужно длинное имя пути PLUS это один динамический в природе, т. е. теперь вы можете переместить свой проект на любой компьютер, любой диск.
Это связано с тем, что для доступа к URL-адресу используется ваше местоположение CLASS не по статическому местоположению (например, c: \ folder \ ab.mp3), тогда вы не можете получить доступ к этому файлу, если вы перейдете на диск D, потому что тогда вам нужно изменить D: /folder/ab.mp3 вручную, что является статическим в природе)
(Примечание: просто сохранить этот файл с вашим проектом)

Вы можете использовать fileURL как: файл File = новый файл (fileURL.toURI()) ;
Вы можете использовать myURL как: Media musicFile = new Media (myURL); // в javaFX, которому нужна строка, а не url файла

Смежные вопросы