txt texto ruta proyecto por obtener linea leer escribir dentro como archivos archivo abrir java resources path

texto - leer y escribir archivos en java



Cómo obtener una ruta a un recurso en un archivo Java JAR (14)

Estoy tratando de obtener un camino hacia un Recurso, pero no he tenido suerte.

Esto funciona (tanto en IDE como con el JAR) pero de esta manera no puedo obtener una ruta a un archivo, solo el contenido del archivo:

ClassLoader classLoader = getClass().getClassLoader(); PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));

Si hago esto:

ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("config/netclient.p").getFile());

El resultado es: java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)

¿Hay alguna manera de obtener una ruta a un archivo de recursos?


Al cargar un recurso, asegúrese de notar la diferencia entre:

getClass().getClassLoader().getResource("com/myorg/foo.jpg") //relative path

y

getClass().getResource("/com/myorg/foo.jpg")); //note the slash at the beginning

Supongo que esta confusión está causando la mayoría de los problemas al cargar un recurso.

Además, cuando está cargando una imagen, es más fácil usar getResourceAsStream() :

BufferedImage image = ImageIO.read(getClass().getResourceAsStream("/com/myorg/foo.jpg"));

Cuando realmente tiene que cargar un archivo (sin imagen) de un archivo JAR, puede intentar esto:

File file = null; String resource = "/com/myorg/foo.xml"; URL res = getClass().getResource(resource); if (res.toString().startsWith("jar:")) { try { InputStream input = getClass().getResourceAsStream(resource); file = File.createTempFile("tempfile", ".tmp"); OutputStream out = new FileOutputStream(file); int read; byte[] bytes = new byte[1024]; while ((read = input.read(bytes)) != -1) { out.write(bytes, 0, read); } file.deleteOnExit(); } catch (IOException ex) { Exceptions.printStackTrace(ex); } } else { //this will probably work in your IDE, but not from a JAR file = new File(res.getFile()); } if (file != null && !file.exists()) { throw new RuntimeException("Error: File " + file + " not found!"); }


Cuando está en un archivo jar, el recurso se encuentra absolutamente en la jerarquía del paquete (no en la jerarquía del sistema de archivos). Entonces, si tiene clase com.example.Sweet cargando un recurso llamado "./default.conf", el nombre del recurso se especifica como "/com/example/default.conf".

Pero si está en un frasco, entonces no es un archivo ...


Dentro de su carpeta de recursos (java / main / resources) de su jar, agregue su archivo (suponemos que ha agregado un archivo xml llamado imports.xml ), luego de eso, inyecte ResourceLoader si usa spring como bramido

@Autowired private ResourceLoader resourceLoader;

la función de recorrido interior escribe el código de abajo para cargar el archivo:

Resource resource = resourceLoader.getResource("classpath:imports.xml"); try{ File file; file = resource.getFile();//will load the file ... }catch(IOException e){e.printStackTrace();}


En mi caso, he usado un objeto URL en lugar de Camino.

Archivo

File file = new File("my_path"); URL url = file.toURI().toURL();

Recurso en classpath usando classloader

URL url = MyClass.class.getClassLoader().getResource("resource_name")

Cuando necesito leer el contenido, puedo usar el siguiente código:

InputStream stream = url.openStream();

Y puedes acceder al contenido usando un InputStream.


Este es el mismo código del usuario Tombart con descarga de flujo y cierre para evitar la copia incompleta de contenido de archivo temporal desde el recurso jar y tener nombres únicos de archivos temporales.

File file = null; String resource = "/view/Trial_main.html" ; URL res = getClass().getResource(resource); if (res.toString().startsWith("jar:")) { try { InputStream input = getClass().getResourceAsStream(resource); file = File.createTempFile(new Date().getTime()+"", ".html"); OutputStream out = new FileOutputStream(file); int read; byte[] bytes = new byte[1024]; while ((read = input.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); out.close(); input.close(); file.deleteOnExit(); } catch (IOException ex) { ex.printStackTrace(); } } else { //this will probably work in your IDE, but not from a JAR file = new File(res.getFile()); }


Esto es deliberado. El contenido del "archivo" puede no estar disponible como un archivo. Recuerde que está tratando con clases y recursos que pueden ser parte de un archivo JAR u otro tipo de recurso. El cargador de clases no tiene que proporcionar un identificador de archivo al recurso, por ejemplo, el archivo jar puede no haberse expandido a archivos individuales en el sistema de archivos.

Todo lo que puede hacer obteniendo un java.io.File puede hacerse copiando el flujo en un archivo temporal y haciendo lo mismo, si un archivo java.io.File es absolutamente necesario.


Esto es, como se dijo, la forma óptima de cargar recursos, pero si es absolutamente necesario tener una referencia de java.io.File , intente lo siguiente:

URL url = null; try { URL baseUrl = YourClass.class.getResource("."); if (baseUrl != null) { url = new URL(baseUrl, "yourfilename.ext"); } else { url = YourClass.class.getResource("yourfilename.ext"); } } catch (MalformedURLException e) { // Do something appropriate }

Esto le da un java.net.URL y se puede usar en un constructor java.io.File .


La respuesta de una línea es -

String path = this.getClass().getClassLoader().getResource(<resourceFileName>).toExternalForm()

Básicamente, el método getResource da la URL. Desde esta URL puede extraer la ruta llamando toExternalForm()

Referencias

getResource() , toExternalForm()


La siguiente ruta funcionó para mí: classpath:/path/to/resource/in/jar


Necesita comprender la ruta dentro del archivo jar.
Simplemente refiérase a eso relativo. Entonces, si tiene un archivo (miarchivo.txt), ubicado en foo.jar en el directorio /src/main/resources (estilo maven). Usted se referiría a esto como:

src/main/resources/myfile.txt

Si jar -tvf myjar.jar tu jar usando jar -tvf myjar.jar , verás el resultado y la ruta relativa dentro del archivo jar, y usarás FORWARD SLASHES.


Pasé un tiempo jugando con este problema, porque ninguna solución que encontré realmente funcionó, ¡por extraño que parezca! El directorio de trabajo frecuentemente no es el directorio del JAR, especialmente si un JAR (o cualquier programa, para el caso) se ejecuta desde el Menú de Inicio bajo Windows. Así que esto es lo que hice, y funciona para los archivos .class ejecutados desde fuera de un JAR tan bien como funciona para un JAR. (Solo lo probé en Windows 7.)

try { //Attempt to get the path of the actual JAR file, because the working directory is frequently not where the file is. //Example: file:/D:/all/Java/TitanWaterworks/TitanWaterworks-en.jar!/TitanWaterworks.class //Another example: /D:/all/Java/TitanWaterworks/TitanWaterworks.class PROGRAM_DIRECTORY = getClass().getClassLoader().getResource("TitanWaterworks.class").getPath(); // Gets the path of the class or jar. //Find the last ! and cut it off at that location. If this isn''t being run from a jar, there is no !, so it''ll cause an exception, which is fine. try { PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf(''!'')); } catch (Exception e) { } //Find the last / and cut it off at that location. PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf(''/'') + 1); //If it starts with /, cut it off. if (PROGRAM_DIRECTORY.startsWith("/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(1, PROGRAM_DIRECTORY.length()); //If it starts with file:/, cut that off, too. if (PROGRAM_DIRECTORY.startsWith("file:/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(6, PROGRAM_DIRECTORY.length()); } catch (Exception e) { PROGRAM_DIRECTORY = ""; //Current working directory instead. }


Un archivo es una abstracción para un archivo en un sistema de archivos, y los sistemas de archivos no saben nada sobre cuáles son los contenidos de un JAR.

Pruebe con un URI, creo que hay un protocolo jar: // que puede ser útil para sus propósitos.


si netclient.p está dentro de un archivo JAR, no tendrá una ruta porque ese archivo se encuentra dentro de otro archivo. en ese caso, la mejor ruta que puede tener es en realidad file:/path/to/jarfile/bot.jar!/config/netclient.p .


private static final String FILE_LOCATION = "com/input/file/somefile.txt"; //Method Body InputStream invalidCharacterInputStream = URLClassLoader.getSystemResourceAsStream(FILE_LOCATION);

Obtener esto de getSystemResourceAsStream es la mejor opción. Al obtener la información de entrada en lugar del archivo o la URL, funciona en un archivo JAR y como independiente.