Файлы доступа 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.