El java.io.File
y consorts actúa en el sistema de archivos del disco local. La causa raíz de su problema es que las rutas relativasjava.io
dependen del directorio de trabajo actual. Es decir, el directorio desde el que se inicia la JVM (en su caso: la del servidor web). Esto puede ser, por ejemplo, C:\Tomcat\bin
o algo completamente diferente, pero por lo tanto noC:\Tomcat\webapps\contextname
o lo que sea que espere que sea. En un proyecto Eclipse normal, eso sería C:\Eclipse\workspace\projectname
. Puede obtener información sobre el directorio de trabajo actual de la siguiente manera:
System.out.println(new File(".").getAbsolutePath());
Sin embargo, el directorio de trabajo no es controlable programáticamente de ninguna manera. Realmente debería preferir usar rutas absolutas en la File
API en lugar de rutas relativas. Por ej C:\full\path\to\file.ext
.
No desea codificar ni adivinar la ruta absoluta en las aplicaciones Java (web). Eso es solo un problema de portabilidad (es decir, se ejecuta en el sistema X, pero no en el sistema Y). La práctica normal es colocar ese tipo de recursos en el classpath , o agregar su ruta completa al classpath (en un IDE como Eclipse esa es la src
carpeta y la "ruta de compilación" respectivamente). De esta manera se puede agarrar con la ayuda de ClassLoader
por ClassLoader#getResource()
o ClassLoader#getResourceAsStream()
. Es capaz de localizar archivos relativos a la "raíz" de la ruta de clase, como usted descubrió por coincidencia. En aplicaciones web (o cualquier otra aplicación que use múltiples cargadores de clases), se recomienda usar el ClassLoader
que se devuelve Thread.currentThread().getContextClassLoader()
para esto para que también pueda mirar "fuera" del contexto de la aplicación web.
Otra alternativa en webapps es la ServletContext#getResource()
y su contraparte ServletContext#getResourceAsStream()
. Puede acceder a los archivos ubicados en la web
carpeta pública del proyecto de aplicación web, incluida la /WEB-INF
carpeta. El ServletContext
está disponible en servlets por el getServletContext()
método heredado , puede llamarlo como está.
Ver también: