You are on page 1of 5

La clase JFileChooser Siguiendo con nuestro editor de textos sencillo, dos de las acciones que debemos implementar en nuestro

men son las de salvar el texto en fichero y leer el texto de un fichero. En ambos casos hay que darle oportunidad al usuario de elegir el fichero bien para salvar, bien para leer. La clase JFileChooser muestra directamente una ventana que permite navegar por los directorios y elegir un fichero. Un uso simple de esta clase es realmente sencillo. Para pedir un fichero para abrirlo y leerlo basta hacer dos lneas de cdigo JFileChooser fileChooser = new JFileChooser(); int seleccion = fileChooser.showOpenDialog(areaTexto); Veremos el parmetro areaTexto un poco ms abajo. Por lo dems, listo, esto abre una ventana para navegar por los directorios y elegir un fichero similar a la de la figura

Cuando el usuario termine, pulsar "Abrir" o "Cancelar". En el entero seleccion se nos guardar el botn que ha apretado. Slo debemos comprobar si es el botn de "Abrir" para pedirle al JFileChooser qu fichero ha elegido el usuario y empezar a trabajar con l. if (seleccion == JFileChooser.APPROVE_OPTION) { File fichero = fileChooser.getSelectedFile();

// y a trabajar con fichero .... } Si seleccion vale JFileChooser.APPROVE_OPTION es que el usuario ha pulsado "Abrir", as que pedimos el fichero seleccionado con getSelectedFile() y ... a trabajar !!! Vale, vale, pero qu es eso de pasarle el areaTexto en el parmetro?. La explicacin es simple. JFileChooser abre una ventana que se mostrar junto a la ventana de nuestro editor. Nos gustara que esta ventana de seleccin de fichero no se vaya detrs y quede oculta por la ventana del editor. La ventana de elegir fichero debera estar siempre delante y visible sobre el editor. La forma de conseguir esto es que JFileChooser sepa cual es esta ventana delante de la cual debe estar siempre. Para saber cual es esa ventana, basta con pasarle en el parmetro cualquier componente de dicha ventana. En nuestro ejemplo hemos decidido pasarle el JTextArea de nuestro editor, pero podamos pasarle perfectamente el JMenuBar o el JFrame principal. El JTextArea es una buena eleccin por un segundo motivo. Este cdigo estar en las acciones de salvar y cargar texto de un fichero. El texto que se va a guardar o el que se lea se cojer o meter en el JTextArea. La clase AccionSalvar y AccionCargar deben tener accesible el JTextArea para leer de l el texto que tienen que guardar en fichero o para meter en l el texto que han leido del fichero. Puesto que tienen que tener el JTextArea de todas maneras, lo usaremos como parmetro del JFileChooser. Para elegir un fichero para salvar, el cdigo es exactamente igual, pero cambia el mtodo para visualizar el dilogo. JFileChooser fileChooser = new JFileChooser(); int seleccion = fileChooser.showSaveDialog(areaTexto); La nica diferencia es que cambia la etiqueta del botn "Abrir" por "Guardar". Escribir un fichero de texto Una vez elegido el fichero en el que queremos salvar el texto, simplemente debemos abrir el fichero para escritura y emepezar a escribir. En java tenemos muchas clases y variantes para escribir ficheros: PrintStream, FileWriter, FileOutputStream, etc, etc. Todas hacen lo mismo, escribir en un fichero. La diferencia entre ellas suelen ser los mtodos que tienen para escribir en el fichero o algunos aspectos internos, como si usan buffer o no. Algunas de ellas slo tienen mtodos para escribir bytes, otras permiten escribir String, etc, etc. Para elegir una de ellas, simplemente hay que ver qu tenemos, un File en nuestro caso y qu necesitamos, en nuestro caso algn mtodo que nos permita escribir String. Por supuesto, esta forma de elegir es muy tonta, pero nos vale para nuestro ejemplo. Si queremos "darle caa" al fichero escribiendo mucho y muy seguido quizs sea mejor

pensar en qu clases son ms eficientes en vez de en limitarnos a si tiene o no un mtodo que nos resulte cmodo. Sin embargo, esto es tema para otro tutorial. Para escribir fichero de texto llano a partir de un File, que es el que nos proporciona la clase JFileChooser, una clase ideal es PrintWriter. Simplemente con el siguiente cdigo tenemos todo hecho PrintWriter writer = new PrintWriter(fichero); writer.print(areaTexto.getText()); writer.close(); Abrimos el fichero haciendo un new PrintWriter(), con print() escribimos el texto obtenido de areaTexto.getText() y cerramos el fichero. PrintWriter tiene adems muchos mtodos que permiten escribir en formato texto llano nmeros, cadenas, etc. Leer un fichero Para leer un fichero nos pasa algo parecido. Tenemos un montn de clases que leen ficheros FileInputStream, FileReader, InputStreamReader, BufferedReader. Igual que al escribir, es ver qu tenemos, un File, qu mtodos queremos, alguno que nos permita leer String y elegir la clase que nos interese. En el caso de la lectura es un poco ms complejo. No hay una clase que admita File y tenga mtodos para leer String. Mirando la API, vemos que el mtodo readLine() que nos interesa y que es capaz de leer una lnea y drnosla como String est en la clase BufferedReader. Desgraciadamente esta clase admite en su constructor un Reader y no un File que es lo que tenemos. El asunto se nos complica un poco. Debemos buscar una clase que herede de Reader y que admita un File. Buscando, buscando, encontramos que FileReader cumple con estos requisitos. Bueno, construir el BufferedReader es algo ms complejo BufferedReader reader = new BufferedReader(new FileReader(fichero)); BufferedReader va leyendo de lnea en lnea. No lee los retornos de carro. Debemos hacer un bucle para ir leyendo. Puede ser similar a este String linea = reader.readLine(); while (linea != null) { // Aqu lo que tengamos que hacer con la lnea puede ser esto areaTexto.append(linea); linea = reader.readLine(); }

Si hacemos esto y miramos el resultado nos llevamos el primer chasco. Salen todas las lneas seguidas, no sale cada lnea en una lnea. El problema es que readLine() nos devuelve la lnea, pero sin el retorno de carro al final. Si vamos aadiendo en el area de texto, debemos aadir nosotros desde nuestro cdigo los retornos de carro. Cual es el retorno de carro?. En windows el retorno de carro consiste en dos caracteres seguidos /r/n. En unix el retorno de carro slo es uno /n. Qu ponemos para que nuestro programa siga siendo portable?. La clase System de java nos permite consultar este tipo de cosas. Si ponemos String retornoDeCarro = System.getProperty("line.separator"); en retornoCarro obtendremos el retorno de carro adecuado para nuestro sistema operativo. En System.getProperties() de la API puedes ver una lista de cosas interesantes que se pueden obtener, como el nombre del sistema operativo, el directorio actual de ejecucin o el nombre del usuario. Nuestro cdigo quedara as String linea = reader.readLine(); while (linea != null) { // Aqu lo que tengamos que hacer con la lnea puede ser esto areaTexto.append(linea); areaTexto.append(System.getProperty("line.separator")); linea = reader.readLine(); } Por supuesto, no se nos debe olvidar cerrar el fichero cuando terminemos reader.close(); La clase StringBuffer En el ejemplo hemos ido componiendo el texto directamente sobre el area de texto, usando su mtodo append(). Otra opcin es componer el texto directamente sobre un String y luego aadirlo todo de golpe. El cdigo quedara ms o menos as String lineaTotal=""; String linea = reader.readLine(); while (linea != null) { lineaTotal = lineaTotal + linea + System.getProperty("line.separator"); linea = reader.readLine();

} areaTexto.setText(lineaTotal); reader.close(); Esta opcin es vlida, pero no es eficiente. Se crean demasiadas clases String intermedias que se dejan luego para el recolector de basura. Para este tipo de cosas, java tiene la clase StringBuffer. Es bsicamente un String, pero que permite ser modificado, aadiendo y borrando cosas de forma eficiente. El cdigo con esta clase quedara as StringBuffer lineaTotal=""; String linea = reader.readLine(); while (linea != null) { lineaTotal.append(linea); lineaTotal.append(System.getProperty("line.separator")); linea = reader.readLine(); } areaTexto.setText(lineaTotal.toString()); reader.close(); Listo por ahora. Vamos a ver cmo buscar y seleccionar texto en el JTextArea.

You might also like