Текстовые и графические файлы, не включенные при экспорте jar - PullRequest
1 голос
/ 06 июля 2019

Я создал проект, который использует файлы изображений, а также текстовый файл при выполнении. И текстовые файлы, и файлы изображений находятся в папке моего проекта до того, как я экспортировал проект в исполняемый jar-файл, но когда я запустил jar-файл из командной строки, я получил исключение для файла notfound, вызванное тем, что программа печатает текстовый файл. Я разархивировал банку, чтобы дважды проверить, и там не было изображений и текстовых файлов.

package application;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

import javafx.collections.FXCollections;

public class Data {
    private static Data instance=new Data();
    private Map<String,String> saveEntries = new HashMap<>();
    private static String fileName = "ResponseData";

public static Data getInstance() {
    return instance;
}

public void exitSave() throws IOException {
    Path path = Paths.get("ResponseData");
    Iterator<Map.Entry<String, String>> iter = saveEntries.entrySet().iterator();
    BufferedWriter bw = Files.newBufferedWriter(path);
    try {
        while(iter.hasNext()) {
            Map.Entry<String, String> entry = iter.next();
            bw.write(String.format("%s\t%s", entry.getKey(),entry.getValue()));
            bw.newLine();
        }
    } catch (IOException e) {
        new FileNotFoundException("Error when saving data");
    }finally {
        if(bw!=null)
            bw.close();
    }
}



public void updatedSaveEntry(String input, String response) {
    saveEntries.put(input, response);
}

public Map<String,String> getSaveEntries(){
    return this.saveEntries;
}

public void setEntry(Map<String,String> map) {
    Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
    while(iter.hasNext()) {
        Map.Entry<String, String> entry = iter.next();
        saveEntries.put(entry.getKey(), entry.getValue());
    }
}


public void loadEntries() throws IOException{
    saveEntries = FXCollections.observableHashMap();
    Path path = Paths.get(fileName);
    BufferedReader br = Files.newBufferedReader(path);
    String line;
    try {
        while((line=br.readLine())!=null&&!line.trim().isEmpty()) {
            String[] parts = line.split("\t");
            saveEntries.put(parts[0], parts[1]);
        }
    }finally {
        if(br!=null) {
            br.close();
        }
    }

}

}

Экспорт Eclipse Runnable Jar

Папка проекта

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

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

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

  1. Получение Eclipse для включения файла в банку с помощью функции Export Runnable Jar.

  2. Поиск файла в банке

Включая файл

Самое простое, вероятно, просто поместить файл в исходную папку. В вашем проекте выполните New -> Source Folder, дайте ему имя (например, «ресурсы») и переместите туда свой файл. Обычно, если вы перезапустите экспорт, файл должен находиться в банке.

Поиск файла

К файлам в банке обращаются по-разному. Смотрите принятый ответ на Чтение файла ресурса из jar . Обратите внимание, что вам не нужно указывать имя вашей папки ресурсов в пути, так как этот файл будет помещен в корень вашего фляги (вы можете проверить это, распаковав его).

0 голосов
/ 06 июля 2019

Ваша программа пытается прочитать файл из локальной файловой системы, а не из файла JAR.Так что это действительно не должно быть включено в файл jar.Программа ожидает файл в текущем рабочем каталоге, в котором вы выполняете свою программу, и он может отличаться, если вы запускаете свой проект в Eclipse или выполняете экспортированный файл JAR.

...