Здравствуйте, использую 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, никакой информации, как его открыть, я не смог найти =(