OPERACIONES DE ARCHIVOS PARA EL LENGUAJE DE JAVA El paquete Java.io: Para realizar operaciones de entrada y salidas de flujos mediante Streams. Un stream es una secuencia ordenada de datos.
El paquete Java.io tiene: Una fuente => streams de entrada
Un destino=> streams de salida.
El paquete java.io tiene dos partes principales
Stream de caracteres (caractees Unicode de 16 bits)
Stream de bytes (8 bits).
Entrada y Salida del
Paquete java.io • E/S puede estar
basada:
–
En texto: streams de caracteres legibles. Ejemplo: el código fuente de un programa
–
En datos: streams de datos binarios. Ejemplo: patrón de bits de una imagen
• Los
streams de caracteres se utilizan en la E/S basada en texto.
– Se denominan
lectores (reader) y
escritores (writer)
• Los
streams de bytes se utilizan en la E/S basada en datos.
– Se denominan
streams de entrada y
streams de salida Clases principales de java.io • Clases de flujo de entrada:
– Se utilizan para leer datos de una fuente de entrada (archivo, cadena o memoria)
– Flujo de bytes:
InputStream, BufferedInputStream, DataInputStream, FileInputStream – Flujo de caracteres
: Reader, BufferReader, FileReader • Clases de flujo de salida:
– Son las homólogas a las clases de flujo de entrada y se utilizan para enviar flujos de datos a dispositivos de salida
– Flujo de bytes:
OutputStream, PrintStream, BufferedOutputStream, DataOutputStream y FileOutputStream – Flujo de caracteres :
Writer, PrintWriter, FileWriter • Clases de archivo:
–
File y RandomAccesFile (mayor control sobre los archivos)
JERARQUIA DE CLASES DE JAVA.IO o Java.io
- java.io.
BufferedInputStream - java.io.
LineNumberInputStream - java.io.
PipedInputStream - java.io.
SequenceInputStream - java.io.
ObjectInputStream.GetField - java.io.
ObjectOutputStream.PutField - java.io.
Comparable) - java.io.
ByteArrayOutputStream - java.io.
FileOutputStream - java.io.
FilterOutputStream - java.io.
ObjectOutput, java.io.ObjectStreamConstants) - java.io.
Guard, java.io.Serializable) - java.security.
Serializable) - java.io.
Closeable, java.io.DataInput, java.io.DataOutput) - java.io.
Closeable, java.lang.Readable) - java.io.
BufferedReader - java.io.
CharArrayReader - java.io.
FilterReader JERARQUIA DE INTERFACE - java.io.
Closeable - java.io.
DataInput - java.io.
DataOutput
InputStream | Método | Descripción |
| read() | Lee el siguiente byte del flujo de entrada y lo devuelve como un entero. Cuando alcanza el final del flujo de datos, devuelve -1. |
| read(byte b[]) | Lee múltiples bytes y los almacena en la matriz b. Devuelve el número de bytes leídos o -1 cuando se alcanza el final del flujo de datos. |
| read(byte b[], int off, int long) | Lee hasta len bytes de datos del flujo de entrada, empezando desde la posición indicada por el desplazamiento off, y los almacena en una matriz. |
| available() | Devuelve el número de bytes que se pueden leer de un flujo de entrada sin que se produzca un bloqueo por causa de una llamada a otro método que utiliza el mismo flujo de entrada. |
| skip(long n) | Omite la lectura de n bytes de datos de un flujo de entrada y los descarta. |
| close() | Cierra un flujo de entrada y libera los recursos del sistema utilizados por el flujo de datos. |
OutPutStream | Método | Descripción |
| write(int b) | Escribe b en un flujo de datos de salida. |
| write(byte b[]) | Escribe la matriz b en un flujo de datos de salida. |
| write(byte b[], int off, int long) | Escribe len bytes de la matriz de bytes en el flujo de datos de salida, empezando en la posición dada por el desplazamiento off |
| flush() | Vacía el flujo de datos y fuerza la salida de cualquier dato almacenado en el búfer. |
| close() | Cierra el flujo de datos de salida y libera cualquier recurso del sistema asociado con él. |
Stream sobre Ficheros
• FileInputStream: muy similar a la clase InputStream, sólo que está diseñada para leer archivos.
– FileInputStream(String name)
– FileInputStream(File name)
• FileOutputStream: muy similar a la clase OutputStream, sólo que está diseñada para escribir en archivos.
– FileOutputStream(String name)
– FileOutputStream(String name, boolean append)
• Si append==true queremos añadir al final del fichero
– FileOutputStream(File name)
import java.io.*;
import javax.swing.JOptionPane;
public class ficheros {
/** Creates a new instance of ficheros */
public ficheros() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
FileInputStream origen = null;
FileOutputStream destino = null;
String cadena=JOptionPane.showInputDialog("Direccion Del Archivo");
cadena+=".txt";
try {
origen = new FileInputStream(cadena);
destino = new FileOutputStream(“c:temp.txt”,true); //añadir
int i = origen.read();
while (i != -1) { // mientras not EOF
destino.write(i);
i = origen.read();
}
origen.close();
destino.close();
}
catch (IOException e) {
//System.out.println("Error de ficheros”);
JOptionPane.showMessageDialog(null,"ERROR","Error De ficheros",JOptionPane.ERROR_MESSAGE);
}
}
}
La Serilizacion
La serialización es el proceso de escribir el estado de un objeto a un flujo de bytes. La utilidad
de esta operación se manifiesta cuando queremos salvar el estado de nuestro programa en un
sitio de almacenamiento permanente o, en otras palabras, cuando queremos hacer la
persistencia de nuestro programa. Así, en un momento posterior dado podemos recuperar
estos objetos deserializándolos.
La interface Serializable.
Para que un objeto sea almacenado y recuperado mediante las herramientas de serialización
debe de implementar esta interface. Serializable no define campos ni métodos, tan solo es un
identificador de que el objeto se puede serializar. Si una clase es serializable, entonces todas
sus subclases lo son también.
ObjectOutputStream
Esta es la clase responsable de escribir los objetos a streams. El constructor de esta clase tiene
la siguiente sintáxis:
ObjectOutputStream( OutputStream outStream);
El argumento es el flujo de salida sobre el cual el objeto serializado será escrito.
ObjectInputStream
Esta es la clase responsable de leer los objetos desde un stream. El constructor de esta clase
tiene la siguiente sintáxis:
ObjectInputStream( InputStream inStream);
El argumento es el flujo de entrada desde el cual el objeto serializado se lee.
Código Registro usando ObjectOutputStream
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import Archivos.IUBanco;
import Archivos.Registro;
/**
*
* @author Tommy Ponce
*/
public class PrincipalReg extends JFrame {
private ObjectOutputStream salida;
private IUBanco interfaz;
private JButton botonI,botonA;
/** Creates a new instance of PrincipalReg */
public PrincipalReg() {
super("Creacion De Un Archivo Secuencial De Objetos");
interfaz=new IUBanco(4);
getContentPane().add(interfaz,BorderLayout.CENTER);
botonA=interfaz.gettarea1();
botonA.setText("Guardar en Archivos...");
botonA.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evento){
abrirArchivo();
}
});
botonI=interfaz.gettarea2();
botonI.setText("Introducir");
botonI.setEnabled(false);
botonI.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evento){
agregarRegistro();
}
});
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evento){
if(salida!=null)
agregarRegistro();
cerrarArchivo();
}
}
);
setSize(300,200);
setVisible(true);
}
private void abrirArchivo(){
JFileChooser selectorArchivo=new JFileChooser();
selectorArchivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
int resultado=selectorArchivo.showSaveDialog(this);
if(resultado==JFileChooser.CANCEL_OPTION)
return;
File nombreA=selectorArchivo.getSelectedFile();
if(nombreA==null||nombreA.getName().equals(""))
JOptionPane.showMessageDialog(this,"Nombre De Archivo Invalido",
"Nombre De Archivo Invalido",JOptionPane.ERROR_MESSAGE);
else{
try{
salida=new ObjectOutputStream(new FileOutputStream(nombreA));
botonA.setEnabled(false);
botonI.setEnabled(true);
}
catch(IOException e){
JOptionPane.showMessageDialog(this,"Error Al Abrir El Archivo",
"ERROR",JOptionPane.ERROR_MESSAGE);
}
}
}
private void cerrarArchivo(){
try{
salida.close();
System.exit(0);
}
catch(IOException e){
JOptionPane.showMessageDialog(this,"Error Al Cerrar El Archivo",
"ERROR",JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
public void agregarRegistro(){
int ncuenta=0;
Registro registro;
String valorC[]=interfaz.getCampos();
if(!valorC[IUBanco.CUENTA].equals("")){
try{
ncuenta=Integer.parseInt(valorC[IUBanco.CUENTA]);
if(ncuenta>0){
registro=new Registro(ncuenta,valorC[IUBanco.PNOMBRE],
valorC[IUBanco.APELLIDO],Double.parseDouble(valorC[IUBanco.SALDO]));
salida.writeObject(registro);
salida.flush();
}
else{
JOptionPane.showMessageDialog(this,
"El Numero De Cuenta Debe Ser Mayor Que 0","Numero De Cuenta Incorrecto",
JOptionPane.ERROR_MESSAGE);
}
interfaz.borrarCampos();
}
catch(NumberFormatException e){
JOptionPane.showMessageDialog(this,"Numero De Cuenta O Saldo Incorrecto",
"Formato De numero Incorrecto",JOptionPane.ERROR_MESSAGE);
}
catch(IOException e){
JOptionPane.showMessageDialog(this,"Error Al Escribir En El Archivo",
"Exception De Es",JOptionPane.ERROR_MESSAGE);
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new PrincipalReg();
// TODO code application logic here
}
}
Código Registro usando FileOutputStream y ObjectOutputStream
package Archivos;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.DecimalFormat;
/**
*
* @author Tommy Ponce
*/
public class Consulta extends JFrame{
private JTextArea Area;
private JButton botonA,botonC,botonD,botonZ;
private JPanel panel;
private ObjectInputStream entrada;
private FileInputStream entradaA;
private File nombreA;
private String cuenta;
static private DecimalFormat dosDigitos=new DecimalFormat("0.00");
/** Creates a new instance of Consulta */
public Consulta() {
super("Programa De Consulta De Creditos");
Container contenedor=getContentPane();
panel=new JPanel();
botonA=new JButton("Abrir Archivo");
panel.add(botonA);
botonA.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evento){
abrirArchivo();
}
});
botonC=new JButton("Saldos Con Creditos");
panel.add(botonC);
botonC.addActionListener(new Manejador());
botonD=new JButton("Saldos Con Debitos");
panel.add(botonD);
botonD.addActionListener(new Manejador());
botonZ=new JButton("Saldos Con Ceros");
panel.add(botonZ);
botonZ.addActionListener(new Manejador());
Area=new JTextArea();
JScrollPane desplazador=new JScrollPane(Area);
contenedor.add(desplazador,BorderLayout.CENTER);
contenedor.add(panel,BorderLayout.SOUTH);
botonC.setEnabled(false);
botonD.setEnabled(false);
botonZ.setEnabled(false);
addWindowListener(new WindowAdapter(){
public void windowClosing(){
cerrarArchivo();
System.exit(0);
}
});
pack();
setSize(600,250);
setVisible(true);
}
private void abrirArchivo(){
JFileChooser selectorArchivo=new JFileChooser();
selectorArchivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
int resultado=selectorArchivo.showOpenDialog(this);
if(resultado==JFileChooser.CANCEL_OPTION)
return;
nombreA=selectorArchivo.getSelectedFile();
if(nombreA==null||nombreA.getName().equals(""))
JOptionPane.showMessageDialog(this,"Nombre De Archivo Incorrecto",
"Nombre Del Archivo Incorrecto",JOptionPane.ERROR_MESSAGE);
try{
if(entrada!=null)
entrada.close();
entradaA=new FileInputStream(nombreA);
entrada=new ObjectInputStream(entradaA);
botonA.setEnabled(false);
botonD.setEnabled(true);
botonC.setEnabled(true);
botonZ.setEnabled(true);
}
catch(IOException e){
JOptionPane.showMessageDialog(this,"El Archivo No Existe","Nombre Del Archivo Incorrecto",
JOptionPane.ERROR_MESSAGE);
}
}
public void cerrarArchivo(){
try{
if(entrada!=null)
entrada.close();
}
catch(IOException e){
JOptionPane.showMessageDialog(this,"Error Al Cerrar El Archivo","ERROR",
JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
private void leerArchivo(){
Registro registro;
try{
if(entrada!=null)
entrada.close();
entradaA=new FileInputStream(nombreA);
entrada=new ObjectInputStream(entradaA);
Area.setText("Las cuentas son:n");
while(true){
registro=(Registro)entrada.readObject();
if(mostrar(registro.getSaldo()))
Area.append(registro.getCuenta()+"t"+registro.getNom()+"t"+
registro.getApellido()+"t"+dosDigitos.format(registro.getSaldo())+"n");
}
}
catch(EOFException e){
cerrarArchivo();
}
catch(ClassNotFoundException e){
JOptionPane.showMessageDialog(this,"Error No Se Pudo Crear El Objecto",
"Error Clase No Encontrada",JOptionPane.ERROR_MESSAGE);
}
catch(IOException e){
JOptionPane.showMessageDialog(this,"Error Al Leer El Archivo","ERROR",
JOptionPane.ERROR_MESSAGE);
}
}
private boolean mostrar(double s){
if(cuenta.equals("Saldos Con Creditos")&& s 0)
return true;
else if(cuenta.equals("Saldos Con Ceros")&& s==0)
return true;
return false;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Consulta();
}
private class Manejador implements ActionListener{
public void actionPerformed(ActionEvent evento) {
cuenta=evento.getActionCommand();
leerArchivo();
}
}
}