Файлы доступа Java в jar вызывает java.nio.file.FileSystemNotFoundException

При попытке скопировать некоторые файлы в моем файле jar в каталог temp с моим java-приложением, выдается следующее исключение:

java.nio.file.FileSystemNotFoundException
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
    at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)
    at java.nio.file.Paths.get(Unknown Source)
    at com.sora.util.walltoggle.pro.WebViewPresentation.setupTempFiles(WebViewPresentation.java:83)
   ....

и это небольшая часть моего setupTempFiles (с номерами строк):

81. URI uri = getClass().getResource("/webViewPresentation").toURI();
//prints: URI->jar:file:/C:/Users/Tom/Dropbox/WallTogglePro.jar!/webViewPresentation
82. System.out.println("URI->" + uri );
83. Path source = Paths.get(uri);

каталог webViewPresentation находится в корневом каталоге моей банки:

enter image description here

Эта проблема завершается только после того, как я упакую приложение как банку, отладка в Eclipse не вызывает проблем. Я подозреваю, что это имеет какое-то отношение к этому bug, но я не уверен, как исправить эту проблему.

Любая помощь оценивается

Если дело:

Я на Java 8 build 1.8.0-b132

Windows 7 Ult. 64

Ответ 1

A FileSystemNotFoundException означает, что файловая система не может быть создана автоматически; и вы не создали его здесь.

Учитывая ваш URI, то, что вы должны сделать, разбивается на !, откройте файловую систему, используя деталь перед ней, а затем получите путь от части после !:

final Map<String, String> env = new HashMap<>();
final String[] array = uri.toString().split("!");
final FileSystem fs = FileSystems.newFileSystem(URI.create(array[0]), env);
final Path path = fs.getPath(array[1]);

Обратите внимание, что вы должны .close() ваш FileSystem после того, как вы закончите с ним.

Ответ 2

Если вы используете библиотеку фреймов spring, то для нее есть простое решение.

По требованию мы хотим прочитать webViewPresentation; Я мог бы решить ту же проблему с помощью кода ниже:

URI uri = getClass().getResource("/webViewPresentation").toURI();
FileSystems.getDefault().getPath(new UrlResource(uri).toString());

Ответ 3

Принятый ответ не самый лучший, поскольку он не работает, когда вы запускаете приложение в среде IDE, или ресурс статичен и хранится в классах! Лучшее решение было предложено в java.nio.file.FileSystemNotFoundException при получении файла из папки ресурсов

InputStream in = getClass().getResourceAsStream("/webViewPresentation");
byte[] data = IOUtils.toByteArray(in);

IOUtils из Apache commons-io.

Но если вы уже используете Spring и хотите текстовый файл, вы можете изменить вторую строку на

StreamUtils.copyToString(in, Charset.defaultCharset());

Также существует StreamUtils.copyToByteArray.