Programación

1º DAM/DAW - Curso 2023-2024

User Tools

Site Tools


apuntes:ficheros

This is an old revision of the document!


Ficheros

\part*{Ficheros}

\section{Acceso a ficheros leyendo líneas completas}

\subsection{Crear ficheros de texto}

La manera más cómoda y habitual de crear ficheros de texto es hacerlo línea a línea con la clase \verb PrintWriter .

\begin{lstlisting}[language=java] FileWriter fichero = null; PrintWriter escritor = null;

try {

  fichero = new FileWriter("archivo.txt");
  escritor = new PrintWriter(fichero) ;
  escritor.println("Esto es una linea del fichero");

} catch (IOException ioe) {

  ioe.printStackTrace() ;

} finally {

  if (fichero != null)
      try {
          fichero.close();
      } catch (IOException ioe) { . . . }

\end{lstlisting}

\subsection{Leer ficheros de texto}

Para realizar la operación de lectura de un fichero de texto línea a línea utilizaremos la clase \verb BufferedReader , recorriendo el fichero mientras haya líneas en él.

En el ejemplo que se muestra, cada línea se muestra por pantalla, pero hay que tener en cuenta que podríamos almacenarlas todas en un solo \verb String para almacenar su contenido o bien cargarlo en la pantalla para su visualización (y quizás posterior edición).

\begin{lstlisting}[language=java] File fichero = null; FileReader lector = null; BufferedReader buffer = null;

try {

  buffer = new BufferedReader(new FileReader(new File("archivo.txt")));
  String linea = null;
  while ((linea = buffer.readLine()) != null)
      System.out.println(linea);

} catch (FileNotFoundException fnfe) {

  fnfe.printStackTrace();

} catch (IOException ioe) {

  ioe.printStackTrace();

} finally {

  if (buffer != null)
      try {
          buffer.close();
  } catch (IOException ioe) { . . . }

} \end{lstlisting}

\section{Serialización}

La serialización es el proceso por el que un objeto Java se convierte en una secuencia de bytes, es decir, en un fichero. Es la manera más cómoda y rápida de almacenar en fichero la información de una aplicación Java. Si, por ejemplo, tenemos una serie de objetos como una colección (un \verb ArrayList , por ejemplo) y queremos almacenar toda esa información en un fichero, la forma más sencilla será la de serializar dicho \verb ArrayList , lo que conllevará que se serialice todo su contenido.

Si más adelante queremos recuperar esa información, podremos deserializar la colección desde el fichero y volver a trabajar con los datos.

Simplemente tendremos que tener en cuenta que las clases que nosotros nos hayamos definido deben implementar el interfaz \verb Serializable para que pueda ser serializadas en un fichero. Así, si tuvieramos una clase \verb Producto que queremos que luego sea serializada, haríamos lo siguiente:

\begin{lstlisting}[language=java] public class Producto implements Serializable {

  private static final long serialVersionUID = 1L;
  private String nombre;
  private float precio;
  public Producto(String nombre, float precio) {
      this.nombre = nombre;
      this.precio = precio;
  }
  public String getNombre() { return nombre; }
  public void setNombre(String nombre) { this.nombre = nombre; }
  public float getPrecio() { return precio ; }
  public void setPrecio(float precio) { this.precio = precio; }

} \end{lstlisting}

Las clases Java como \verb ArrayList , \verb String , y otras, ya están definidas como \verb Serializable por lo que no tendremos que preocuparnos por ellas a la hora de serializar nuestra colección de productos a un fichero.

\subsection{Serializar objetos}

Si suponemos que \verb listaProductos es, por ejemplo, una colección de productos, podemos serializar el objeto en un fichero llamado \emph{productos.dat}, de forma que podrá ser recuperado en otra ejecución de la misma ejecución, habiendo almacenado así los datos en el disco duro. Es lo que se conoce como persistencia.

\begin{lstlisting}[language=java] . . . ObjectOutputStream serializador = null; try {

  serializador = new ObjectOutputStream(new FileOutputStream("productos.dat"));
  serializador.writeObject(listaProductos);

} catch (IOException ioe) {

  . . .

} finally {

  if (serializador != null)
      try {
          serializador.close();
      } catch (IOException ioe) {
          ioe.printStackTrace();
      }
  }

. . . \end{lstlisting}

\subsection{Deserializar objetos}

En el momento en que quiera recuperar esos datos almcenados en \emph{productos.dat}, sólo tengo que realizar la operación contraria y podré recuperar la colección original y seguir trabajando con ella.

\begin{lstlisting}[language=java] . . . List<Producto> listaProductos = null; ObjectInputStream deserializador = null; try {

  deserializador = new ObjectInputStream(new FileInputStream("productos.dat"));
  listaProductos = (ArrayList<Producto>)deserializador.readObject();

} catch (FileNotFoundException fnfe ) {

  fnfe.printStackTrace();

} catch (ClassNotFoundException cnfe ) {

  cnfe.printStackTrace();

} catch (IOException ioe) {

  ioe.printStackTrace();

} finally {

  if (deserializador != null)
      try {
          deserializador.close();
      } catch (IOException ioe) { 
          ioe.printStackTrace();
      }

} . . . \end{lstlisting}


© 2019 Santiago Faci

apuntes/ficheros.1550182437.txt.gz · Last modified: 2019/02/14 22:13 by Santiago Faci