domingo, 25 de diciembre de 2016

Java - Leer archivo desde la carpeta de recursos

Leer archivos desde la carpeta de recursos
Dentro de un proyecto java podemos tener alamcenados recursos: imagenes, documentos de texto, etc. Para ello existe la carpeta de recursos. En la siguiente imagen puede verse la extructura d eun proyecto con su carpeta de recursos.

Para acceder a la carpeta de recursos debemos hacerlo a través del ClassLoader. El ClassLoader se encarga de cargar las distintas clases en la Maquina Virtual de Java.

Suponiendo que tengamos una clase llamada App entonces podremos acceder a su class loader del siguiente modo

// getClass() nos retorna la clase y a partir de ella se obtendrá el ClassLoader
ClassLoader loader = getClass().getClassLoader();

// Si estamos en una función estática en vez de getClass() podemos acceder directamente a la clase
ClassLoader loader = App.class.getClassLoader();

El loader tiene una función getResource(String name) que nos rectorna la URL asociada al recurso a partir de la cual podremos acceder al recurso. A continuación se muestra un ejemplo completo:

package ljlg.blog.classloader;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.stream.Collectors;

/**
 *
 *
 */
public class App {
  
    public static void main(String[] args) throws IOException {
        App.leerArchivoRecursos();
    }

    public static void leerArchivoRecursos() throws IOException {

        ClassLoader loader = App.class.getClassLoader();
      
        InputStream stream = loader.getResource("datos.txt").openStream();
      
        try (BufferedReader buffer = new BufferedReader(new InputStreamReader(stream))) {
            System.out.println(buffer.lines().collect(Collectors.joining("\n")));
        }
    }
}