Curso Java : Ejemplo de programa con entrada/salida de ficheros y con interfaz gráfica
Volvemos un día más con nuestro particular Curso de Java. En esta ocasión, nuestro amigo Sanobis ha hecho un programa completo para mostraros la entrada/salida en Java. La función de este programa es la gestión nuestras contraseñas en un único fichero de texto en el que podremos guardar datos como «web», «usuario», «clave» y podremos exportar estos datos a un fichero de texto .txt.
Si queremos añadir datos, basta con cargar el fichero de texto que hemos creado anteriormente y añadir más páginas web. Aunque este programa no tenga una utilidad real y haya programas comerciales muchos más potentes, es un buen ejemplo para gestionar el manejo de la entrada y salida en Java.
Próximamente, haremos mejoras a este pequeño programita como por ejemplo, una capa de cifrado de datos para nuestras claves ya que tenerlas en texto plano, nos incomoda (aunque valdría para meterlo en un contenedor TrueCrypt)
A continuación os mostramos el código fuente del programa, al final del artículo podéis descargar el proyecto Netbeans para que lo veáis mejor y no tengáis que copiar el código y hacer la interfaz gráfica ya que no pondremos los .form necesarios porque es código a lo bestia y que lo genera sólo.
Programa principal:
[java]
package RedesZone;
public class Empezar {
public static void main(String args[]) {
MenuPrincipal mp = new MenuPrincipal();
}
}
[/java]
Menú principal:
[java]
package RedesZone;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
public class MenuPrincipal extends javax.swing.JFrame {
/**
* Creates new form MenuPrincipal
*/
public MenuPrincipal() {
initComponents();
this.setVisible(true);
}
private void jButtonCargarActionPerformed(java.awt.event.ActionEvent evt) {
// Creamos un filtro para que se reconozcan los archivos de texto
FileNameExtensionFilter filtro = new FileNameExtensionFilter(«Archivos de texto», «txt»);
JFileChooser fileChooserCargar = new JFileChooser();
fileChooserCargar.setFileFilter(filtro);
fileChooserCargar.setDialogTitle(«Abrir»);
int seleccion = fileChooserCargar.showOpenDialog(this);
if (seleccion == JFileChooser.APPROVE_OPTION) {
File file = fileChooserCargar.getSelectedFile();
Modificar m = new Modificar(this, file);
}
}
private void jButtonNuevoActionPerformed(java.awt.event.ActionEvent evt) {
Insertar i = new Insertar(this, null); // Le pasamos «null» para que sea el usuario el que elija
// donde guardar el fichero
}
private void jButtonSalirActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0); // Salimos del programa
}
/**
* @param args the command line arguments
*/
// Variables declaration – do not modify
private javax.swing.JButton jButtonCargar;
private javax.swing.JButton jButtonNuevo;
private javax.swing.JButton jButtonSalir;
private javax.swing.JLabel jLabelTitulo;
// End of variables declaration
}
[/java]
Insertar:
[java]
package RedesZone;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
public class Insertar extends javax.swing.JFrame {
private File fichero; // Ruta del fichero a modificar
private JFrame ventanaPadre; // Ventana anterior de trabajo
private LinkedList contraseñasGuardar = new LinkedList();// Contraseñas a guardar en el archivo
/**
* Creates new form Insertar
*/
public Insertar(JFrame jF, File f) {
this.ventanaPadre = jF;
this.fichero = f;
this.ventanaPadre.setVisible(false);
initComponents();
this.setVisible(true);
}
private void jButtonCancelarActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(false);
ventanaPadre.setVisible(true);
}
private void jButtonLimpiarActionPerformed(java.awt.event.ActionEvent evt) {
// Limpiamos todos los campos
jTextFieldNombre.setText(«»);
jTextFieldUsuario.setText(«»);
jTextFieldPassword.setText(«»);
}
private void jButtonAnadirActionPerformed(java.awt.event.ActionEvent evt) {
String nuevoItem; // String con nombre, usuario y contraseña que queremos guardar
// Si algun campo está vacio, mostramos un mensaje informando de que faltan datos
if (jTextFieldNombre.getText().equals(«») || jTextFieldUsuario.getText().equals(«») || jTextFieldPassword.getText().equals(«»)) {
JOptionPane.showMessageDialog(this, «ERROR: Faltan datos», «Mensaje de Error», JOptionPane.WARNING_MESSAGE);
return;
}
nuevoItem = jTextFieldNombre.getText() + » » + jTextFieldUsuario.getText() + » » + jTextFieldPassword.getText() + » n»;
contraseñasGuardar.add(nuevoItem);
jTextPaneVer.setText(jTextPaneVer.getText() + nuevoItem);
}
private void jButtonGuardarActionPerformed(java.awt.event.ActionEvent evt) {
BufferedWriter writer; //Para escribir en el fichero
if (fichero == null) {
//Activamos el filtro para que nos muestre, por defecto, los archivos de texto
FileNameExtensionFilter filtro = new FileNameExtensionFilter(«Archivos de texto», «txt»);
JFileChooser fileChooserGuardar = new JFileChooser();
fileChooserGuardar.setFileFilter(filtro);
fileChooserGuardar.setDialogTitle(«Guardar»);
int seleccion = fileChooserGuardar.showSaveDialog(this);
if (seleccion == JFileChooser.APPROVE_OPTION) {
fichero = fileChooserGuardar.getSelectedFile();
fileChooserGuardar.setFileSelectionMode(JFileChooser.FILES_ONLY);
try {
writer = new BufferedWriter(new FileWriter(fichero + «.txt»)); // Ponemos .txt para darle extension al archivo que creamos
while (!contraseñasGuardar.isEmpty()) {
writer.write(contraseñasGuardar.poll().toString());
writer.newLine();
}
writer.flush();
writer.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(this, «Error al guardar el archivo», «Error guardar archivo», JOptionPane.ERROR_MESSAGE);
}
JOptionPane.showMessageDialog(this, «El fichero de texto se ha guardado correctamente con los datos introducidos»);
}
} else if (!(fichero == null)) // Añadimos al fichero existente
{
try {
writer = new BufferedWriter(new FileWriter(fichero, true));
while (!contraseñasGuardar.isEmpty()) {
writer.write(contraseñasGuardar.poll().toString());
writer.newLine();
}
writer.flush();
writer.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(this, «Error al guardar el archivo», «Error guardar archivo», JOptionPane.ERROR_MESSAGE);
}
JOptionPane.showMessageDialog(this, «El fichero de texto se ha guardado correctamente con los datos introducidos»);
} else {
JOptionPane.showMessageDialog(this, «ERROR: Error al guardar», «Mensaje de Error», JOptionPane.ERROR_MESSAGE);
}
// Volvemos al menu principal
this.setVisible(false);
ventanaPadre.setVisible(true);
}
// Variables declaration – do not modify
private javax.swing.JButton jButtonAnadir;
private javax.swing.JButton jButtonCancelar;
private javax.swing.JButton jButtonGuardar;
private javax.swing.JButton jButtonLimpiar;
private javax.swing.JLabel jLabelNombre;
private javax.swing.JLabel jLabelPasswoed;
private javax.swing.JLabel jLabelTitulo;
private javax.swing.JLabel jLabelUsuario;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextField jTextFieldNombre;
private javax.swing.JTextField jTextFieldPassword;
private javax.swing.JTextField jTextFieldUsuario;
private javax.swing.JTextPane jTextPaneVer;
// End of variables declaration
}
[/java]
Consultar:
[java]
package RedesZone;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Consultar extends javax.swing.JFrame {
private JFrame ventanaPadre;
private File fichero; // Fichero con el que vamos a trabajar
/**
* Creates new form Consultar
*/
public Consultar(JFrame jF, File fich) {
this.fichero = fich;
this.ventanaPadre = jF;
this.ventanaPadre.setVisible(false);
initComponents();
this.setVisible(true);
}
private void jButtonLimpiarActionPerformed(java.awt.event.ActionEvent evt) {
jTextFieldNombre.setText(«»);
jTextFieldUsuario.setText(«»);
jTextFieldContraseña.setText(«»);
}
private void jButtonAtrasActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(false);
ventanaPadre.setVisible(true);
}
private void jButtonBuscarActionPerformed(java.awt.event.ActionEvent evt) {
String limite = » «; // Elemento que separa el nombre, el usuario y la contraseña dentro del fichero
String[] trozos; // Dividimos la linea del dichero en unidades independientes
String nombre; // Nombre del sitio que el usuario ha introducido en el cuadro de texto
String nombreTrozo; // Nombre del sitio dentro del string trozos
Boolean encontrado = false; // Para saber si hemos encontrado el sitio que buscabamos
jTextFieldUsuario.setText(«»);
jTextFieldContraseña.setText(«»);
if (jTextFieldNombre.getText().equals(«»)) {
JOptionPane.showMessageDialog(this, «El campo del nombre del sitio está vacío», «Campo vacío», JOptionPane.INFORMATION_MESSAGE);
} else {
try {
BufferedReader reader = new BufferedReader(new FileReader(fichero)); // Cargamos el fichero
String linea = reader.readLine(); // leemos la primera linea
if (linea == null) {
JOptionPane.showMessageDialog(this, «El fichero está vacío», «Fichero vacío», JOptionPane.INFORMATION_MESSAGE);
} else {
do {
trozos = linea.split(limite, 3); //Dividimos la linea leida en tres parte
nombre = jTextFieldNombre.getText().toUpperCase();
nombreTrozo = trozos[0].toUpperCase();
if (nombreTrozo.equals(nombre)) {
encontrado = true;
jTextFieldUsuario.setText(trozos[1]);
jTextFieldContraseña.setText(trozos[2]);
}
linea = reader.readLine(); // leemos la siguiente línea
} while (linea != null);
if (!encontrado) {
JOptionPane.showMessageDialog(this, «No se han encontrado coincidencias», «No hay coincidencias», JOptionPane.INFORMATION_MESSAGE);
}
}
reader.close();// Cerramos el fichero
} catch (IOException ex) {
Logger.getLogger(Consultar.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void jTextFieldContraseñaActionPerformed(java.awt.event.ActionEvent evt) {
}
// Variables declaration – do not modify
private javax.swing.JButton jButtonAtras;
private javax.swing.JButton jButtonBuscar;
private javax.swing.JButton jButtonLimpiar;
private javax.swing.JLabel jLabelContraseña;
private javax.swing.JLabel jLabelNombre;
private javax.swing.JLabel jLabelTitulo;
private javax.swing.JLabel jLabelUsuario;
private javax.swing.JTextField jTextFieldContraseña;
private javax.swing.JTextField jTextFieldNombre;
private javax.swing.JTextField jTextFieldUsuario;
// End of variables declaration
}
[/java]
Borrar:
[java]
package RedesZone;
import java.io.*;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Borrar extends javax.swing.JFrame {
private JFrame ventanaPadre;
private File fichero; // Fichero con el que vamos a trabajar
/**
* Creates new form Borrar
*/
public Borrar(JFrame jF, File fich) {
this.ventanaPadre = jF;
this.fichero = fich;
this.ventanaPadre.setVisible(false);
initComponents();
this.setVisible(true);
}
private void jButtonAtrasActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(false);
ventanaPadre.setVisible(true);
}
private void jButtonLimpiarActionPerformed(java.awt.event.ActionEvent evt) {
jTextFieldNombre.setText(«»);
}
private void jButtonBorrarActionPerformed(java.awt.event.ActionEvent evt) {
String limite = » «; // Elemento que separa el nombre, el usuario y la contraseña dentro del fichero
String[] trozos; // Dividimos la linea del dichero en unidades independientes
String nombre; // Nombre del sitio que el usuario ha introducido en el cuadro de texto
String nombreTrozo; // Nombre del sitio dentro del string trozos
Boolean encontrado = false;
LinkedList
if (jTextFieldNombre.getText().equals(«»)) {
JOptionPane.showMessageDialog(this, «El campo del nombre del sitio está vacío», «Campo vacío», JOptionPane.INFORMATION_MESSAGE);
} else {
try {
BufferedReader reader = new BufferedReader(new FileReader(fichero)); // Cargamos el fichero para lectura
String linea = reader.readLine(); // Leemos la primera linea
if (linea == null) {
JOptionPane.showMessageDialog(this, «El fichero está vacío», «Fichero vacío», JOptionPane.INFORMATION_MESSAGE);
reader.close();// Cerramos el fichero para lectura
} else {
do {
trozos = linea.split(limite, 3); //Dividimos la linea leida en tres parte
nombre = jTextFieldNombre.getText().toUpperCase();
nombreTrozo = trozos[0].toUpperCase();
if (!nombreTrozo.equals(nombre)) {
//Comprobamos que la linea no sea vacia. Si es vacia, no la guardamos
if (!nombreTrozo.equals(«»)) {
paraGuardar.add(linea);
}
} else {
encontrado = true;
}
linea = reader.readLine(); // leemos la siguiente línea
} while (linea != null);
reader.close();// Cerramos el fichero para lectura
if (!encontrado) {
JOptionPane.showMessageDialog(this, «No hay ningun sitio con ese nombre», «No está el sitio», JOptionPane.INFORMATION_MESSAGE);
} else {
BufferedWriter writer = new BufferedWriter(new FileWriter(fichero));
while (!paraGuardar.isEmpty()) {
writer.write(paraGuardar.poll().toString());
writer.newLine();
}
writer.flush();
writer.close();
JOptionPane.showMessageDialog(this, «Eliminado con éxito», «Eliminado», JOptionPane.INFORMATION_MESSAGE);
}
}
} catch (IOException ex) {
Logger.getLogger(Consultar.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
// Variables declaration – do not modify
private javax.swing.JButton jButtonAtras;
private javax.swing.JButton jButtonBorrar;
private javax.swing.JButton jButtonLimpiar;
private javax.swing.JLabel jLabelNombre;
private javax.swing.JLabel jLabelTitulo;
private javax.swing.JTextField jTextFieldNombre;
// End of variables declaration
}
[/java]
Modificar:
[java]
package RedesZone;
import java.io.File;
public class Modificar extends javax.swing.JFrame {
private MenuPrincipal menuP;
private File fichero;
public Modificar(MenuPrincipal mp, File fich) {
this.menuP = mp;
this.fichero = fich;
this.menuP.setVisible(false);
initComponents();
this.setVisible(true);
}
private void jButtonMenuActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(false);
menuP.setVisible(true);
}
private void jButtonAñadirActionPerformed(java.awt.event.ActionEvent evt) {
Insertar i = new Insertar(this, fichero);
}
private void jButtonConsultarActionPerformed(java.awt.event.ActionEvent evt) {
Consultar c = new Consultar(this, fichero);
}
private void jButtonBorrarActionPerformed(java.awt.event.ActionEvent evt) {
Borrar b = new Borrar(this, fichero);
}
// Variables declaration – do not modify
private javax.swing.JButton jButtonAñadir;
private javax.swing.JButton jButtonBorrar;
private javax.swing.JButton jButtonConsultar;
private javax.swing.JButton jButtonMenu;
private javax.swing.JLabel jLabelTitulo;
// End of variables declaration
}
[/java]
Podéis descargar el proyecto NetBeans pinchando aquí: Descargar MisPassword.zip.
Agradecemos a nuestro amigo Sanobis la realización de este pequeño programa de ejemplo. Puedes ver múltiples cursos de Java en diferentes niveles.