La ruta real para acceder a los archivos
Cuando se trabaja con JSPs y servlets, se usan las rutas relativas para hacer referencia a los archivos, por ejemplo: "/WEB-INF/Promedios.txt".
Sin embargo para leer o guardar datos en un archivo, es necesario tener la ruta completa, es decir la ruta real del archivo.
El servlet context (contexto del servlet) maneja la información a nivel de toda la aplicación Web. La clase ServletContext contiene métodos que sirven para que un servlet se comunique con su contenedor. Todos los servlets de una aplicación tienen el mismo ServletContext.
El ServletContext contiene un método que sirve para obtener la ruta real de un archivo que está dentro del proyecto de la aplicación. Entonces, para obtener la ruta real de "/WEB-INF/Promedios.txt" hacemos:
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Promedios.txt");
El contenido de la variable path es el siguiente:
C:\Users\usuario\Documents\NetBeansProjects\WebApplication1\build\web\WEB-INF\Promedios.txt
La ruta expresada con diagonales invertidas: "\" es un problema en los sistemas operativos que requieren la diagonal normal "/". En nuestro caso, utilizaremos la siguiente instrucción para solucionar el problema:
path = path.replace('\\','/');
Los String tienen el método replace, que sirve para cambiar un caracter por otro. Primero se debe poner el caracter que se desea remplazar y después el caracter correcto. Estos caracteres deben ir entre comillas simples y separados por una coma. Además, en este caso, la diagonal invertida tiene un significado adicional, entonces usamos lo que se llama el "código de escape" que consiste en poner doble diagonal, de esta forma "\" se interpreta como el caracter diagonal invertida y no como el inicio de un código de control (por ejemplo, cambio de linea: \n).
Después de haber usado el método replace, la ruta queda como se indica:
C:/Users/usuario/Documents/NetBeansProjects/WebApplication1/build/web/WEB-INF/Promedios.txt