2014-09-03 3 views
2

Рядом находится файл runnable jar и файл data.txt. data.txt может изменяться динамически. Программа должна прочитать содержимое этого файла. Моя первая попытка открыть файл не работает:Упростите открытие файла в той же папке, что и .jar

new InputStreamReader(getClass().getResourceAsStream("/data.txt"), "UTF-8"); 

я пришел к следующему решению, но это сложно и немного неловко:

new InputStreamReader(new FileInputStream(new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath()).getParent() + "/data.txt"), "UTF-8"); 

Трудно понять, что здесь.

Я попробовал new File("./data.txt") и NPE был выброшен.

Как открыть файл data.txt файл в той же папке, что и .jar-файл, но более читаемым способом?

+0

I подумайте, что решение подробно описано здесь - http://stackoverflow.com/que stions/8775303/read-properties-file-outside-jar-file –

+0

Во-первых, не пишите длинноцепочечные заявления о полимерах, особенно если вы не знаете, что делаете. Их невозможно отладить. –

+0

@HotLicks, на самом деле, я знаю, что делает этот конкретный оператор. Но нужно время понять для другого человека или даже для меня через некоторое время. Вот почему мне нужно лучшее решение :) – Dragon

ответ

0

Был ли у вас set the Class-Path of the Jar file? Если вы указали "." в классе я думаю, что он будет работать, как вы изначально предполагалось.

В манифесте Jar файла:

Class-Path:.

В коде:

InputStream ins = getClass().getResourceAsStream("/data.txt"); 
... // do stuff with stream 

Я не проверял это, но я сделал материал, похожий на него, я считаю, что это будет работать.

2

Существует два способа найти базовый путь файла класса, и вы можете обнаружить, что они сложнее, чем необходимо.

Первое, что вы уже в вашем вопросе:

URL url = MyClass.class.getProtectionDomain().getCodeSource().getLocation(); 

второй

URL url=MyClass.class.getResource("MyClass.class"); 
if(url.getProtocol().equals("jar")) 
    url=((JarURLConnection)url.openConnection()).getJarFileURL(); 
else url=MyClass.class.getResource("/");// for file: directories 

От URL вы можете получить UTF-8Reader с:

Reader r = Files.newBufferedReader(Paths.get(url.toURI()).resolveSibling("data.txt")); 
Смежные вопросы