tutorial read que files java java-7 nio

read - java.nio.file.files jar



Los archivos de acceso de Java en jar provocan java.nio.file.FileSystemNotFoundException (4)

Al intentar copiar algunos archivos en mi archivo jar a un directorio temporal con mi aplicación java, se lanza la siguiente excepción:

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) ....

y esta es una pequeña parte de mi setupTempFiles (con números de línea):

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);

el directorio webViewPresentation reside en el directorio raíz de mi jar:

Este problema solo se produce cuando paquete mi aplicación como un contenedor, la depuración en Eclipse no tiene problemas. Sospecho que esto tiene algo que ver con este bug pero no estoy seguro de cómo corregir este problema.

Cualquier ayuda apreciada

Si es importante

Estoy en Java 8 build 1.8.0-b132

Windows 7 Ult. x64


Esto es tal vez un truco, pero el siguiente funcionó para mí:

URI uri = getClass().getResource("myresourcefile.txt").toURI(); if("jar".equals(uri.getScheme())){ for (FileSystemProvider provider: FileSystemProvider.installedProviders()) { if (provider.getScheme().equalsIgnoreCase("jar")) { try { provider.getFileSystem(uri); } catch (FileSystemNotFoundException e) { // in this case we need to initialize it first: provider.newFileSystem(uri, Collections.emptyMap()); } } } } Path source = Paths.get(uri);

Esto utiliza el hecho de que ZipFileSystemProvider almacena internamente una Lista de sistemas de archivos que fueron abiertos por URI.


La respuesta aceptada no es la mejor ya que no funciona cuando se inicia la aplicación en IDE o el recurso es estático y se almacena en clases. Se propuso una mejor solución en java.nio.file.FileSystemNotFoundException al obtener el archivo de la carpeta de recursos

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

IOUtils es de Apache commons-io.

Pero si ya está usando Spring y quiere un archivo de texto, puede cambiar la segunda línea a

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

StreamUtils.copyToByteArray también existe.


Si está utilizando Spring Framework Library, entonces hay una solución fácil para él.

Según el requisito, queremos leer webViewPresentation; Podría resolver el mismo problema con el siguiente código:

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


Una FileSystemNotFoundException significa que el sistema de archivos no se puede crear automáticamente; y no lo has creado aquí.

¡Dado su URI, lo que debe hacer es dividirse en contra de ! , abra el sistema de archivos usando la parte anterior y luego obtenga la ruta desde la parte posterior al ! :

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]);

Tenga en cuenta que debe .close() Su FileSystem una vez que haya terminado con él.