Saltar al contenido

Cómo leer realmente un archivo de texto desde classpath en Java

Solución:

Con el directorio en la ruta de clases, desde una clase cargada por el mismo cargador de clases, debería poder usar cualquiera de los siguientes:

// From ClassLoader, all paths are "absolute" already - there's no context
// from which they could be relative. Therefore you don't need a leading slash.
InputStream in = this.getClass().getClassLoader()
                                .getResourceAsStream("SomeTextFile.txt");
// From Class, the path is relative to the package of the class unless
// you include a leading slash, so if you don't want to use the current
// package, include a slash like this:
InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");

Si esos no funcionan, eso sugiere que algo más está mal.

Entonces, por ejemplo, tome este código:

package dummy;

import java.io.*;

public class Test
{
    public static void main(String[] args)
    {
        InputStream stream = Test.class.getResourceAsStream("/SomeTextFile.txt");
        System.out.println(stream != null);
        stream = Test.class.getClassLoader().getResourceAsStream("SomeTextFile.txt");
        System.out.println(stream != null);
    }
}

Y esta estructura de directorio:

code
    dummy
          Test.class
txt
    SomeTextFile.txt

Y luego (usando el separador de ruta de Unix ya que estoy en una caja de Linux):

java -classpath code:txt dummy.Test

Resultados:

true
true

Al usar Spring Framework (ya sea como una colección de utilidades o contenedor – no es necesario utilizar la última funcionalidad) puede utilizar fácilmente el Recurso abstracción.

Resource resource = new ClassPathResource("com/example/Foo.class");

A través de Recurso interfaz puede acceder al recurso como Flujo de entrada, URL, URI o Expediente. Cambiar el tipo de recurso a, por ejemplo, un recurso del sistema de archivos es una simple cuestión de cambiar la instancia.

Así es como leo todas las líneas de un archivo de texto en mi classpath, usando Java 7 NIO:

...
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;

...

Files.readAllLines(
    Paths.get(this.getClass().getResource("res.txt").toURI()), Charset.defaultCharset());

NB, este es un ejemplo de cómo se puede hacer. Tendrá que hacer las mejoras necesarias. Este ejemplo solo funcionará si el archivo está realmente presente en su classpath; de lo contrario, se lanzará una NullPointerException cuando getResource () devuelva nulo y .toURI () se invoca en él.

Además, desde Java 7, una forma conveniente de especificar conjuntos de caracteres es utilizar las constantes definidas en java.nio.charset.StandardCharsets
(estos están, según sus javadocs, “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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *