Estoy tratando de leer un archivo de texto que se establece en la variable de sistema CLASSPATH. No es una variable de usuario.
Estoy tratando de obtener la secuencia de entrada al archivo de la siguiente manera:
Coloque el directorio de archivo ( D:\myDir
) en CLASSPATH e intente a continuación:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");
Coloque la ruta completa del archivo ( D:\myDir\SomeTextFile.txt
) en CLASSPATH e intente lo mismo arriba de las 3 líneas de código.
Pero desafortunadamente NINGUNO de ellos está funcionando y siempre estoy null
ingresando a mi InputStream in
.
getResourceAsStream()
File.Separator
, porque no estás pidiendo un archivo , estás pidiendo un recurso . Es importante comprender que la abstracción involucrada no es el sistema de archivos.Class.getResourceAsStream
es realmente un método conveniente para llamarClassLoader.getResourceAsStream
, pero con la característica adicional de recursos "relativos". Si está especificando un recurso absoluto, cualquier llamada que use el mismo cargador de clases hará lo mismo.Cuando use Spring Framework (ya sea como una colección de utilidades o contenedor, no necesita usar esta última funcionalidad) puede usar fácilmente la abstracción de recursos .
A través de la interfaz de Recursos puede acceder al recurso como InputStream , URL , URI o Archivo . Cambiar el tipo de recurso a, por ejemplo, un recurso del sistema de archivos es una simple cuestión de cambiar la instancia.
fuente
Así es como leo todas las líneas de un archivo de texto en mi classpath, usando Java 7 NIO:
Nota: este es un ejemplo de cómo se puede hacer. Tendrás que hacer mejoras según sea necesario. Este ejemplo solo funcionará si el archivo está realmente presente en su classpath; de lo contrario, se generará una NullPointerException cuando getResource () devuelve nulo y se invoca .toURI () en él.
Además, desde Java 7, una forma conveniente de especificar conjuntos de caracteres es usar las constantes definidas en
java.nio.charset.StandardCharsets
(estas son, de acuerdo con sus javadocs , "están garantizados para estar disponibles en cada implementación de la plataforma Java").Por lo tanto, si sabe que la codificación del archivo es UTF-8, especifique explícitamente el juego de caracteres
StandardCharsets.UTF_8
fuente
Spring
'sStreamUtils.copyToString
.Por favor, inténtalo
Sus intentos no funcionaron porque solo el cargador de clases para sus clases puede cargarse desde el classpath. Usó el cargador de clases para el sistema java mismo.
fuente
Para leer realmente el contenido del archivo, me gusta usar Commons IO + Spring Core. Suponiendo Java 8:
Alternativamente:
fuente
Para obtener la ruta absoluta de clase intente esto:
fuente
De alguna manera, la mejor respuesta no funciona para mí. Necesito usar un código ligeramente diferente en su lugar.
Espero que esto ayude a aquellos que enfrentan el mismo problema.
fuente
Si usas guayaba:
podemos obtener URL de CLASSPATH:
o InputStream:
fuente
Para leer el contenido de un archivo en una Cadena desde
classpath
, puede usar esto:Nota:
IOUtils
es parte deCommons IO
.Llámalo así:
fuente
Usted dice "Estoy tratando de leer un archivo de texto que está configurado en la variable de sistema CLASSPATH". Supongo que esto está en Windows y está utilizando este diálogo feo para editar las "Variables del sistema".
Ahora ejecuta su programa Java en la consola. Y eso no funciona: la consola obtiene una copia de los valores de las variables del sistema una vez que se inicia . Esto significa cualquier cambio en el diálogo posterior no tiene ningún efecto.
Existen estas soluciones:
Inicie una nueva consola después de cada cambio.
Use
set CLASSPATH=...
en la consola para configurar la copia de la variable en la consola y cuando su código funcione, pegue el último valor en el cuadro de diálogo de la variable.Ponga la llamada a Java en el
.BAT
archivo y haga doble clic en él. Esto creará una nueva consola cada vez (copiando así el valor actual de la variable del sistema).CUIDADO: si también tiene una variable de usuario,
CLASSPATH
entonces sombreará la variable de su sistema. Es por eso que generalmente es mejor poner la llamada a su programa Java en un.BAT
archivo y establecer la ruta de clase allí (usandoset CLASSPATH=
) en lugar de confiar en un sistema global o variable de usuario.Esto también asegura que pueda tener más de un programa Java trabajando en su computadora porque seguramente tendrán diferentes classpaths.
fuente
Mi respuesta no es exactamente lo que se pregunta en la pregunta. Más bien, estoy dando una solución exactamente con qué facilidad podemos leer un archivo en nuestra aplicación Java desde nuestra ruta de clase de proyecto.
Por ejemplo, suponga que un nombre de archivo de configuración example.xml se encuentra en una ruta como la siguiente:
com.myproject.config.dev
y nuestro archivo de clase ejecutable de Java está en la ruta a continuación:
com.myproject.server.main
ahora solo marque en la ruta anterior, que es el directorio / carpeta común más cercano desde donde puede acceder tanto a dev como al directorio / carpeta principal (com.myproject.server.main, donde existe la clase ejecutable java de nuestra aplicación) - Podemos ver que es myproject folder / directory que es el directorio / carpeta común más cercano desde donde podemos acceder a nuestro archivo example.xml. Por lo tanto, desde una clase ejecutable de Java que reside en la carpeta / directorio principal , tenemos que retroceder dos pasos como ../../ para acceder a myproject . Ahora, siguiendo esto, vea cómo podemos leer el archivo:
fuente
Si compila su proyecto en un archivo jar: puede colocar su archivo en resources / files / your_file.text o pdf;
y usa este código:
fuente
Estoy usando el servidor de aplicaciones webshpere y mi módulo web está construido en Spring MVC. Se
Test.properties
ubicaron en la carpeta de recursos, intenté cargar estos archivos usando lo siguiente:this.getClass().getClassLoader().getResourceAsStream("Test.properties");
this.getClass().getResourceAsStream("/Test.properties");
Ninguno de los códigos anteriores cargó el archivo.
Pero con la ayuda del siguiente código, el archivo de propiedades se cargó correctamente:
Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");
Gracias al usuario "user1695166" .
fuente
Utilizar
org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));
fuente
Guión:
1)
client-service-1.0-SNAPSHOT.jar
tiene dependenciaread-classpath-resource-1.0-SNAPSHOT.jar
2) queremos leer el contenido de los recursos de ruta de clase (
sample.txt
) deread-classpath-resource-1.0-SNAPSHOT.jar
throughclient-service-1.0-SNAPSHOT.jar
.3)
read-classpath-resource-1.0-SNAPSHOT.jar
tienesrc/main/resources/sample.txt
1.
pom.xml
deread-classpath-resource-1.0-SNAPSHOT.jar
2)
ClassPathResourceReadTest.java
clase enread-classpath-resource-1.0-SNAPSHOT.jar
que carga el contenido del archivo de recursos de ruta de clase.3.
pom.xml
declient-service-1.0-SNAPSHOT.jar
4.
AccessClassPathResource.java
instanciarClassPathResourceReadTest.java
clase donde, se va a cargarsample.txt
e imprime su contenido también.5. Ejecute jar ejecutable de la siguiente manera:
fuente
No use el método getClassLoader () y use "/" antes del nombre del archivo. "/" es muy importante
fuente
/
tiene exactamente el mismo efecto que usar elgetClassLoader()
método.fuente
tienes que poner tu 'variable de sistema' en el classpath de Java.
fuente