2010-04-19 6 views
11

Estoy intentando leer en el contenido del archivo, por ejemplo:archivo de localización en una ruta de clases

public void myMethod(){ 
    FileInputStream fstream = new FileInputStream(fileLocation); 
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
    String strLine; 
    while ((strLine = br.readLine()) != null) { 
.... 
.... 
..... 
end while 
end method 

Y tengo al inicio de la clase private String fileLocation; cuerpo y al final de una clase tengo un captador y setter para ello. Ahora intento insertar esta ubicación de archivo desde la primavera dentro de bean de esta clase y especifico el método init de esta clase. Pero obtengo el error ¿No puedo encontrar el archivo especificado como si no estuviera en una ruta de clase pero está dentro del archivo war? Estoy construyendo el proyecto con Maven y poner archivo en src/main/resources Este es el error que consigo al intentar leer el archivo:

Error: src\main\resources\ids.txt (The system cannot find the path specified)

que es cuando he intentado esto:

FileInputStream fstream = new FileInputStream("src\\main\\resources\\ids.txt"); 

cómo hacer referencia el apropiado de la classpath?

EDITAR

Cuando editar mi código de acuerdo con la solución @BalusC, aquí es cómo se ve, pero que aún así obtener null error:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(input)); 
    String strLine; 
while ((strLine = br.readLine()) != null) { 
    .... 
    .... 
    ..... 
    end while 
    end method 

Respuesta

22

El API Java IO se basa en el disco local sistema de archivos, no en el classpath. Además, el uso de rutas relativas en Java IO es una receta para problemas de portabilidad, no confíe en ello. Para asignar recursos en el classpath normalmente usaría ClassLoader#getResource() o ClassLoader#getResourceAsStream().

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt"); 

Dicho esto, no es necesario que DataInputStream línea. En realidad, no está sacando ningún beneficio de eso.

Actualización: si eso no funciona, entonces el nombre del recurso simplemente no es válido o el archivo no está realmente allí en el classpath donde usted espera que esté. Mi opinión es que la carpeta src es en realidad la raíz del classpath y no es parte de un paquete. Eliminarlo del nombre.

Actualización 2: para obtener todas las rutas del sistema de archivos del disco raíz que están cubiertos por la ruta de clase en tiempo de ejecución hacen:

for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) { 
    System.out.println(root); 
} 

El nombre del recurso tiene que estar en relación con cualquiera de ellos. Que se haya colocado en /WEB-INF/classes durante la construcción es normal. Está cubierto por el classpath. Tu problema está en otro lado. ¿Estás seguro de que el nombre del recurso es correcto? ¿Estás seguro de que estás ejecutando el código que crees que estás ejecutando?

+0

@BalusC gracias por su respuesta Actualicé mi pregunta –

+0

Ya actualicé mi respuesta para reflejar que :) – BalusC

+1

@BalusC es lo mismo Obtengo nulo cuando elimino el bit 'src', acabo de mirar dentro de la guerra objetivo que se implementa en jboss dentro de este archivo es la ubicación dentro de 'WEB-INF/classes' pero en mi proyecto en eclipse se encuentra en' src/main/resources' cualquier otro truco en la manga? –

Cuestiones relacionadas