[código] Crear un archivo secuencial en Java
Continuando con los ejercicios correspondientes a la manipulación de archivos en Java, vamos a ver un ejemplo en el que crearemos un archivo secuencial, usando la clase ObjectOutputStream.
El resultado…


El código…
Tenemos la clase UIBanco.java, la cual contiene una GUI reutilizable para los ejemplos que vamos a ver más adelante:
import java.awt.*;
import javax.swing.*;
public class IUBanco extends JPanel
{
// texto de las etiquetas para la GUI
protected final static String nombres[] = { "Número de cuenta",
"Primer nombre", "Apellido", "Saldo", "Monto de la transacción" };
// componentes de GUI; protegidos para el acceso futuro de las subclases
protected JLabel etiquetas[];
protected JTextField campos[];
protected JButton hacerTarea1, hacerTarea2;
protected JPanel panelInternoCentro, panelInternoSur;
protected int tamanio; // número de campos de texto en la GUI
// constantes que representan a los campos de texto en la GUI
public static final int CUENTA = 0, PRIMERNOMBRE = 1, APELLIDO = 2,
SALDO = 3, TRANSACCION = 4;
// Configurar GUI. El argumento miTamanio del constructor determina el número de
// filas de componentes de GUI.
public IUBanco( int miTamanio )
{
tamanio = miTamanio;
etiquetas = new JLabel[ tamanio ];
campos = new JTextField[ tamanio ];
// crear etiquetas
for ( int cuenta = 0; cuenta < etiquetas.length; cuenta++ )
etiquetas[ cuenta ] = new JLabel( nombres[ cuenta ] );
// crear campos de texto
for ( int cuenta = 0; cuenta < campos.length; cuenta++ )
campos[ cuenta ] = new JTextField();
// crear panel para distribuir etiquetas y campos
panelInternoCentro = new JPanel();
panelInternoCentro.setLayout( new GridLayout( tamanio, 2 ) );
// adjuntar etiquetas y campos a panelInternoCentro
for ( int cuenta = 0; cuenta < tamanio; cuenta++ ) {
panelInternoCentro.add( etiquetas[ cuenta ] );
panelInternoCentro.add( campos[ cuenta ] );
}
// crear botones genéricos; sin etiquetas ni manejadores de eventos
hacerTarea1 = new JButton();
hacerTarea2 = new JButton();
// crear panel para distribuir los botones y adjuntarlos
panelInternoSur = new JPanel();
panelInternoSur.add( hacerTarea1 );
panelInternoSur.add( hacerTarea2 );
// establecer esquema de este contenedor y adjuntarle los paneles
setLayout( new BorderLayout() );
add( panelInternoCentro, BorderLayout.CENTER );
add( panelInternoSur, BorderLayout.SOUTH );
validate(); // validar esquema
} // fin del constructor
// devolver referencia al botón de tarea genérico hacerTarea1
public JButton obtenerBotonHacerTarea1()
{
return hacerTarea1;
}
// devolver referencia al botón de tarea genérico hacerTarea2
public JButton obtenerBotonHacerTarea2()
{
return hacerTarea2;
}
// devolver referencia al arreglo campos de objetos JTextField
public JTextField[] obtenerCampos()
{
return campos;
}
// borrar el contenido de los campos de texto
public void borrarCampos()
{
for ( int cuenta = 0; cuenta < tamanio; cuenta++ )
campos[ cuenta ].setText( "" );
}
// establecer valores de los campos de texto; lanzar IllegalArgumentException si
// hay un número incorrecto de objetos String en el argumento
public void establecerValoresCampos( String cadenas[] )
throws IllegalArgumentException
{
if ( cadenas.length != tamanio )
throw new IllegalArgumentException( "Debe haber " +
tamanio + " objetos String en el arreglo" );
for ( int cuenta = 0; cuenta < tamanio; cuenta++ )
campos[ cuenta ].setText( cadenas[ cuenta ] );
}
// obtener arreglo de objetos String con el contenido actual de los campos de texto
public String[] obtenerValoresCampos()
{
String valores[] = new String[ tamanio ];
for ( int cuenta = 0; cuenta < tamanio; cuenta++ )
valores[ cuenta ] = campos[ cuenta ].getText();
return valores;
}
} // fin de la clase IUBanco
La clase RegistroCuentas.java representa un registro de información:
import java.io.Serializable;
public class RegistroCuentas implements Serializable
{
private int cuenta;
private String primerNombre;
private String apellidoPaterno;
private double saldo;
// el constructor sin argumentos llama al otro constructor con valores predeterminados
public RegistroCuentas()
{
this( 0, "", "", 0.0 );
}
// inicializar un registro
public RegistroCuentas( int cta, String nombre, String apellido, double sald )
{
establecerCuenta( cta );
establecerPrimerNombre( nombre );
establecerApellidoPaterno( apellido );
establecerSaldo( sald );
}
// establecer número de cuenta
public void establecerCuenta( int cta )
{
cuenta = cta;
}
// obtener número de cuenta
public int obtenerCuenta()
{
return cuenta;
}
// establecer primer nombre
public void establecerPrimerNombre( String nombre )
{
primerNombre = nombre;
}
// obtener primer nombre
public String obtenerPrimerNombre()
{
return primerNombre;
}
// establecer apellido paterno
public void establecerApellidoPaterno( String apellido )
{
apellidoPaterno = apellido;
}
// obtener apellido paterno
public String obtenerApellidoPaterno()
{
return apellidoPaterno;
}
// establecer saldo
public void establecerSaldo( double sald )
{
saldo = sald;
}
// obtener saldo
public double obtenerSaldo()
{
return saldo;
}
} // fin de la clase RegistroCuentas
Por último, la clase CrearArchivoSecuencial.java, que contiene el método main, es donde hacemos el proceso de escritura de objetos secuencialmente en un archivo, mediante la clase ObjectOutputStream.
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CrearArchivoSecuencial extends JFrame {
private ObjectOutputStream salida;
private IUBanco interfazUsuario;
private JButton botonIntro, botonAbrir;
// configurar GUI
public CrearArchivoSecuencial()
{
super( "Creación de un archivo secuencial de objetos" );
// crear instancia de interfaz de usuario reutilizable
interfazUsuario = new IUBanco( 4 ); // cuatro campos de texto
getContentPane().add( interfazUsuario, BorderLayout.CENTER );
// configurar botón hacerTarea1 para usarlo en este programa
botonAbrir = interfazUsuario.obtenerBotonHacerTarea1();
botonAbrir.setText( "Guardar en archivo ..." );
// registrar componente de escucha para llamar a abrirArchivo cuando se oprima el botón
botonAbrir.addActionListener(
// clase interna anónima para manejar evento de botonAbrir
new ActionListener() {
// llamar a abrirArchivo cuando se oprima el botón
public void actionPerformed( ActionEvent evento )
{
abrirArchivo();
}
} // fin de la clase interna anónima
); // fin de la llamada a addActionListener
// configurar botón hacerTarea2 para usarlo en este programa
botonIntro = interfazUsuario.obtenerBotonHacerTarea2();
botonIntro.setText( "Introducir" );
botonIntro.setEnabled( false ); // deshabilitar botón
// registrar componente de escucha para llamar a agregarRegistro cuando se oprima el botón
botonIntro.addActionListener(
// clase interna anónima para manejar evento de botonIntro
new ActionListener() {
// llamar a agregarRegistro cuando se oprima el botón
public void actionPerformed( ActionEvent evento )
{
agregarRegistro();
}
} // fin de la clase interna anónima
); // fin de la llamada a addActionListener
// registrar componente de escucha de ventana para manejar evento de cierre de ventana
addWindowListener(
// clase interna anónima para manejar evento windowClosing
new WindowAdapter() {
// agregar registro actual en la GUI al archivo, después cerrar el archivo
public void windowClosing( WindowEvent evento )
{
if ( salida != null )
agregarRegistro();
cerrarArchivo();
}
} // fin de la clase interna anónima
); // fin de la llamada a addWindowListener
setSize( 350, 180 );
setVisible( true );
} // fin del constructor de CrearArchivoSecuencial
// permitir al usuario especificar el nombre del archivo
private void abrirArchivo()
{
// mostrar cuadro de diálogo de archivo, para que el usuario pueda elegir el archivo a abrir
JFileChooser selectorArchivo = new JFileChooser();
selectorArchivo.setFileSelectionMode( JFileChooser.FILES_ONLY );
int resultado = selectorArchivo.showSaveDialog( this );
// si el usuario hizo clic en el botón Cancelar del cuadro de diálogo, regresar
if ( resultado == JFileChooser.CANCEL_OPTION )
return;
File nombreArchivo = selectorArchivo.getSelectedFile(); // obtener archivo seleccionado
// mostrar error si es inválido
if ( nombreArchivo == null || nombreArchivo.getName().equals( "" ) )
JOptionPane.showMessageDialog( this, "Nombre de archivo inválido",
"Nombre de archivo inválido", JOptionPane.ERROR_MESSAGE );
else {
// abrir archivo
try {
salida = new ObjectOutputStream(
new FileOutputStream( nombreArchivo ) );
botonAbrir.setEnabled( false );
botonIntro.setEnabled( true );
}
// procesar excepciones que pueden ocurrir al abrir el archivo
catch ( IOException excepcionES ) {
JOptionPane.showMessageDialog( this, "Error al abrir el archivo",
"Error", JOptionPane.ERROR_MESSAGE );
}
} // fin de instrucción else
} // fin del método abrirArchivo
// cerrar archivo y terminar la aplicación
private void cerrarArchivo()
{
// cerrar el archivo
try {
salida.close();
System.exit( 0 );
}
// procesar excepciones que pueden ocurrir al cerrar el archivo
catch( IOException excepcionES ) {
JOptionPane.showMessageDialog( this, "Error al cerrar el archivo",
"Error", JOptionPane.ERROR_MESSAGE );
System.exit( 1 );
}
} // fin del método cerrarArchivo
// agregar registro al archivo
public void agregarRegistro()
{
int numeroCuenta = 0;
RegistroCuentas registro;
String valoresCampos[] = interfazUsuario.obtenerValoresCampos();
// si el valor del campo cuenta no está vacío
if ( ! valoresCampos[ IUBanco.CUENTA ].equals( "" ) ) {
// escribir valores en el archivo
try {
numeroCuenta = Integer.parseInt(
valoresCampos[ IUBanco.CUENTA ] );
if ( numeroCuenta > 0 ) {
// crear nuevo registro
registro = new RegistroCuentas( numeroCuenta,
valoresCampos[ IUBanco.PRIMERNOMBRE ],
valoresCampos[ IUBanco.APELLIDO ],
Double.parseDouble( valoresCampos[ IUBanco.SALDO ] ) );
// escribir el registro y vaciar el búfer
salida.writeObject( registro );
salida.flush();
}
else
{
JOptionPane.showMessageDialog( this,
"El número de cuenta debe ser mayor que 0",
"Número de cuenta incorrecto", JOptionPane.ERROR_MESSAGE );
}
// borrar campos de texto
interfazUsuario.borrarCampos();
} // fin de bloque try
// procesar formato inválido de número de cuenta o saldo
catch ( NumberFormatException excepcionFormato ) {
JOptionPane.showMessageDialog( this,
"Número de cuenta o saldo incorrecto", "Formato de número incorrecto",
JOptionPane.ERROR_MESSAGE );
}
// procesar excepciones que pueden ocurrir al escribir en el archivo
catch ( IOException excepcionES ) {
JOptionPane.showMessageDialog( this, "Error al escribir en el archivo",
"Excepción de ES", JOptionPane.ERROR_MESSAGE );
cerrarArchivo();
}
} // fin de instrucción if
} // fin del método agregarRegistro
public static void main( String args[] )
{
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
new CrearArchivoSecuencial();
}
} // fin de la clase CrearArchivoSecuencial
Los ejercicios utilizados en este post están basados en ejemplos del libro Cómo programar en Java de Deitel, y por lo tanto están bajo la licencia que esta editorial disponga.
31 Comentarios | deja el tuyo





hola
espero me puedan ayudar
quiero saber como mando llamar un archivo de texto desade java y q las modificaciones q le aga al archivo las vuelva a gurdar
grasias de antemano
porfis no sea malitos
Primero para hacer un archivo plano haces:
try {
FileWriter fw = new FileWriter(“archivoplano.txt”);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter salida = new PrintWriter(bw);
salida.println(“esto escribe una linea en el archivo”);
salida.close();
}
catch(java.io.IOException ioex) {
System.out.println(“se presento el error: “+ioex.toString());
}
Para leerlo :
try {
String texto=”";
FileReader fr = new FileReader(“archivoplano.txt”);
entrada = new BufferedReader(fr);
String s;
while((s = entrada.readLine()) != null)texto += s + ” \n”;
}
catch(java.io.FileNotFoundException fnfex) {
System.out.println(“se presento el error: “+fnfex.toString());
}
!!!!
quiero hacer un programa q cree un archivo q modifiq q lo vea y q lo borre pero no lo se comensar me podrian ayudar
q hay, oye un paro no tienes la estructura completa para abrir un archivo de texto desde un boton en java, se que se parece al archivo aleatorio pero para lo q tengo q hacer tengo q dar clic en el boton q este me abra la ventana para seleccionar el archivo y al abrirlo mostrar el archivo a un lado del boton y hacer otras cosas, si me pudieras ayudar te lo agradeceria un buen, cualquier cosa q me puedas proporcionar me lo puedes mandar a mi correo gracias
como balorar los espasios o solo poner llaves de inicio y fin sin que me marque error en un lexico
Pues no te entiendo luis
lo que me piden es esto
primero introducir un codigo k puede se cualkiera
luego el nombre del vendedor
luego el precio del 1 producto
luego el del segundo
y el del tercero
luego se suma todo
luego te pide k ingreses la cantidad k te a dado el cliente como ves en el ejemplo a salio total 17.77 y el tio a dado 20
luego imprimir el vuelvo k ai es 2.23
aki biene la cosa luego el profe kiere k muestre x pantalla la cantidad que debe de devolver al cliente
como ves ai ai 1 moneda de 2 1 de 20 centimos 1 de dos y 1 de uno
esa parte no me cuadra
luego en el otro cuadro la fecha y tambien como puedo hacer para k no me salgan muxos decimales, el el fichero k te mando del jgrap las PTA pesetas
salen con muxos decimales y ai solo ai 2
Introdueix codi de desbloqueig : 1234A
Introdueix el teu nom : Pere
1er producte : 10,34
2on producte : 2,18
3er producte : 5,25
Total : 17,77 Euros ( 2956,68 PTA )
Rebut: 20 Euros
A tornar : 2,23 Euros
0 bitllets de 50
0 bitllets de 20
0 bitllets de 10
0 bitllets de 5
1 moneda de 2
0 moneda de 1
0 moneda de 50 cts
1 moneda de 20 cts
0 moneda de 10 cts
0 moneda de 5 cts
1 moneda de 2 cts
1 moneda de 1 cts
**************************
SUPERMERCATS ESPECIAL
**************************
Producte 1 : 10,34
Producte 2 : 2,18
Producte 3 : 5,25
Total : 17,77 ( 2957 PTA )
Rebut : 20
Canvi : 2,23
Atès per : Pere 10/07/2003
Ha aconseguit : 4 punts
Gràcies per la seva visita
aki descarga FICHEROS DEL JAVA PARA COMPILAR Y EJECUTAR
http://ckrecords.es/java.rar
Hola=) espero me puedan ayudar tengo q acer un programita en java q lea una serie de numeros des de un archivo .txt (algo asi–> 5+3*2-1) y que realice la operaciones correspondientes. ojala puedan ayudarme, tengo este codigo:
import java.util.Scanner;
import java.lang.String;
//calculadora, lee cadena y dice
//import java.io.File; //q es y realiza la operacion
import java.io.*;
public class Calculadora{
public static void main (String args []){
File archivo;
Scanner leer= new Scanner(System.in);
int numero;
int suma/*=0*/;
String cadena;
//archivo=new File(“un_archivo.txt”);//asigna memoria
if (args.length!=1){
System.err.println(“falta el nombre del archivo “);
System.exit(1);
}
//————————————————————-
archivo=new File(args [0]);//asigna memoria
if (!archivo.exists()){//si no exixte el archivo
System.err.println(“el archivo no existe”);
System.exit(2);//con esto sale del programa
}
try {//intenta realizar una accion, intenta leer el archivo
leer= new Scanner (archivo);//archivo es objeto de la clase File
}catch(FileNotFoundException excepcion){
System.err.println(“el archivo no existe”);
System.err.println(excepcion);
System.exit(2);//con esto sale del programa
}
//—————————–calculadora——————————————-****
while (leer.hasNext()){ ///leer si todavia tiene un siguinte valor para leer mientras tenga un siguiente
//numero=leer.nextInt();–>no
cadena=leer.next();
if (cadena.equalsIgnoreCase(“+”) ){
numero=leer.nextInt();
suma=(leer.nextInt()+leer.next());
System.out.println(“fue una suma”);
System.out.println(“el archivo tiene un ” + cadena +suma);
}//del if
if (cadena.equalsIgnoreCase(“-”) ){
numero=leer.nextInt();
System.out.println(“fue una resta”);
System.out.println(“el archivo tiene un ” + cadena);
}
if (cadena.equalsIgnoreCase(“*”) ){
numero=leer.nextInt();
System.out.println(“fue una multiplicacion”);
System.out.println(“el archivo tiene un ” + cadena);
}
if (cadena.equalsIgnoreCase(“/”) ){
numero=leer.nextInt();
System.out.println(“fue una division”);
System.out.println(“el archivo tiene un ” + cadena);
}
}//cierra while
}
}
ola me podrian ayudar, es que no compilo los programas de LeerArchivoSecuencial me manda error, dice “cannot read” es decir no lo puede leer, yo ya habia echo estos progrmas pero con el nomnre de CrearArchivoSecuencial, yo compilo en el ms-dos, con el jdk1.5.0_06, en la carpeta bin, me pueden decir pork no lo lee??? porfavor necesito que me aparescan las ventanas.
¿Puedes mostrar exactamente el erro que te aparece? ¿Es al compilar o al ejecutar? Especifica!
Gracias carnalito por contestarme primero que nada, lo que pasa que en el compilado no hay problema el problema esta cuando me marca errores, que las clases IUBanco.java y RegistroCuentas.java no existen, quisiera saber como o si estoy en la forma correcta de compilarlo, y es que tambien tu programa que apones aki se diferencia al mio por un detalle, que yo utilizo el package com.deitel.cpej5.cap17 antes de cada clase y al igual me dice que no exste y no se uede tener acceso a IUBanco, yo creo el programa en otro llamado GEL y lo guardo en la carpeta de BIN, del jdk1.5.0_06, pues no se si como lo compilo estoy bien ahi te va lo que hago C:\archivos de programa\java\jdk1.5.0_06\bin\javac -classpath com\deitel\cpej5\cap17 CrearArchivoSecuencial.java
porfavor ayudame y gracias.
Hola!
Oye tengo una duda, espero me la puedas resolver
lo que pasa es q no entiendo como es que despues consultas los datos que acabas de guardar, por ejem yo abro el archivo que creo con el programa en un notepad pero se ven muchos caracteres raras…
y ps me gustaría saber como hacerle para ver esos datos ordenados.
gracias y saludos!
@Ruben y para todos:
Los ejemplos que encuentran acerca de manejo de archivos pertenecen a toda una serie de ejemplos. Lo mejor es que vayan siguiendo ejemplo por ejemplo, y con eso van a tener todas las clases.
Pueden ver el orden aquí:
http://casidiablo.net/java
Un saludo!
que tal como puedo leer archivo te texto en netbeans osea java en un jtable gracias espero respuesta
Hola Me Podrian hayudar? Tengo un problema para Guardar el contenido de un textArea en un archivo de texto atraves de un Boton Gracias..!! XD
hola disculpa apenas empiezo con java copie este ejemplo lo compile y no se ejecuta, o debo hacerlo con algun otro metodo o en netbeans se supone es igual a que se debe me manda 4 errores en el archivo que crea el archivo o debo actualizar java???
No hace falta que actualices Java; solo ten en cuenta que los ejemplos que se exponen aquí, acerca de archivos, pertenecen a una serie de ejemplos. Deberás llevar un orden, aquí los puedes encontrar todos:
http://casidiablo.net/java
Un saludo!