@swcalc

Как использовать ZipFileSystem в funcA, если он сгенерирован в funcB?

Здравствуйте, использую FileSystem, чтобы манагерить архив, в котором храниться все, необходимое, для работы приложения. Архив - база данных, с которой работает пользователь.

public class Manager {
    
    private FileSystem storage = null;
    
    public String createStorage(String path, String name) {
        try {
            InputStream in = Manager.class.getResourceAsStream("storage.bmd");
            File fileDestination = new File(path + "/" + name + ".bmd");
            
            if (Files.notExists(fileDestination.toPath())) Files.copy(in, fileDestination.toPath());
            return fileDestination.toString();
        } catch (IOException ex) {
            Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    public boolean selectStorage(String path) {
        Map<String,String> env = new HashMap();
        env.put("create","true");
        
        URI uri = URI.create("jar:file:" + path);
        try (FileSystem fs = FileSystems.newFileSystem(uri, env)) {
            storage = fs;
            return true;
        } catch (IOException ex) {
            Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    
    public boolean createCatalog(String path) {
        if (storage == null) return false;
        Path dest = storage.getPath(path);
        System.out.println(dest);
        if (Files.notExists(dest)) {
            try {
                Files.createDirectories(dest);
                return true;
            } catch (IOException ex) {
                Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return false;
    }
    
}


Выше приведен class, в котором описаны основные методы и хотелось бы разделить создание каталога и инициализацию хранилища. Но проблема в том, что если сохранить сгенерированную FileSystem в глобальную переменную, то, либо я получаю InvocationTargetException (код приведен выше), если исправить на storage = FileSystems.newFileSystem();, то ошибок нет, но в последствии я не могу создать папку или файл.

Если создавать дирректорию, непосредственно после генерации FileSystem, то все ОК.
Как мне сгенерить ее 1 раз и использовать потом в других методах???

// EDIT
Все из-за того, что FileSystem закрывается, после выполнения метода selectStorage, далее, объект сохраняет лишь read-only свойства, метод isOpen() возвращает false, никакой информации, как его открыть, я не смог найти =(
  • Вопрос задан
  • 48 просмотров
Пригласить эксперта
Ответы на вопрос 1
@drKred
Привет! storage = fs; ты копируешь ссылку, которая закроется после выполнения метода selectStorage, т.к. там блок try-с-ресурсами, управляй сам его жизненным циклом как то так
try {
storage = FileSystems.newFileSystem(uri, env);
return true;
} catch (IOException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
}
return false;

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

Войдите, чтобы написать ответ

Похожие вопросы