Java - чтение файла

198
25 марта 2019, 06:50

Компилирую проект в jar-файл. Запускаю. В нем есть кнопка, сохраняющая переменные в файл, который создается в той же папке, что и сам jar-файл. Но когда я пытаюсь произвести чтение из этого файла, ничего не срабатывает. Вот начало кода чтения из файла:

public void loadAll(ActionEvent actionEvent) throws UnsupportedEncodingException {
    String path = Main.class.getProtectionDomain().getCodeSource().getLocation().getPath();
    String decodedPath = URLDecoder.decode(path, "UTF-8");
    try(FileReader reader = new FileReader(decodedPath+"/save.txt"))
    { //...

т.к. прописав обычный путь файл, jar не находит этот текстовик, тогда здесь я получил путь jar'a, но все равно не работает. Как дать понять jar'у, что файл находится вместе с ним в той же папке?

Answer 1

При сборке проекта мавеном, обнаружил, что путь, получаемый указанным Вами способом выдает путь вместе с самим джарником:

/patch/to/jar/target/SNAPSHOT.jar

Чтоб корректно получить путь к директории с jar следует добавить следующие строки:

    String patch = GlobalKeyboardExample.class.getProtectionDomain().getCodeSource().getLocation().getPath();
    File file = new File(patch);
    String jarPath = file.getCanonicalPath().toString();
    String jarDir = jarPath.substring( 0, jarPath.lastIndexOf( File.separator ));

javaDir содержит:

/patch/to/jar/target/

его и используйте в дальнейшей работе (не забьваем про слеш)

String decodedPath = URLDecoder.decode(javadir, "UTF-8");
try(FileReader reader = new FileReader(decodedPath+"save.txt"))
Answer 2

Сделайте как-то так:

File file = new File(new File(MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile()).getParentFile(), "file.txt");
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}
READ ALSO
Поиск даты вида “February 4,2000” в Java

Поиск даты вида “February 4,2000” в Java

"Все даты представить в формате «ddmm

142
Автообновление приложения [android]

Автообновление приложения [android]

Вылетает ошибка на андроиде 7+ и 8+ (6 и ниже - все как надо) при автообновлении приложенияКод:

202
Импорт файла CVS в базу данных. Java

Импорт файла CVS в базу данных. Java

Прошу не судить строгоПишу код- учусь

187
Цикл for и разновидность

Цикл for и разновидность

Друзья! Нашел такой цикл в книге:

185