jueves, 23 de febrero de 2017

Ficheros de texto en Java

Un fichero de texto está formado por secuencias de caracteres, organizados en líneas de igual o distinta longitud.

Todos los datos que aparecen en estos ficheros están formados por caracteres.
CREAR Y ESCRIBIR EN FICHEROS DE TEXTO EN JAVA
Para escribir en un fichero de texto utilizaremos dos clases:
FileWriter y PrintWriter.
La clase FileWriter permite tener acceso al fichero en modo escritura.
Para crear objetos FileWriter podemos utilizar los constructores:

FileWriter(String path)
FileWriter(File objetoFile);

El fichero se crea y si ya existe su contenido se pierde.
Si lo que necesitamos es abrir un fichero de texto existente sin perder su contenido y añadir más contenido al final utilizaremos los constructores:

FileWriter(String path, boolean append)
FileWriter(File objetoFile, boolean append)

Si el parámetro append es true significa que los datos se van a añadir a los existentes. Si es false los datos existentes se pierden.
La clase FileWriter proporciona el método write() para escribir cadenas de caracteres aunque lo normal es utilizar esta clase junto con la clase PrintWriter para facilitar la escritura.
La clase PrintWriter permite escribir caracteres en el fichero de la misma forma que en la pantalla.
Un objeto PrintWriter se crea a partir de un objeto FileWriter.
Ejemplo de escritura de un fichero de texto:
Programa Java que lee texto por teclado y lo escribe en un fichero de texto. La lectura de texto por teclado acaba cuando se lee la cadena FIN.
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
public class File11 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        PrintWriter salida = null;
        try {
            salida = new PrintWriter("c:/ficheros/datos.txt");
            String cadena;
            System.out.println("Introduce texto. Para acabar introduce la cadena FIN:");
            cadena = sc.nextLine();
            while (!cadena.equalsIgnoreCase("FIN")) {
                salida.println(cadena);
                cadena = sc.nextLine();
            }
            salida.flush();
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } finally {         
            salida.close();
        }
    }
}
El método flush() provoca que se escriban en el fichero los datos que puedan haber en el buffer de salida.
El método close() cierra la conexión con el fichero y libera los recursos que está usando la conexión.

Polimorfismo

En programación orientada a objetos, el polimorfismo se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tipos distintos. El único requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber responder al mensaje que se les envía.
La apariencia del código puede ser muy diferente dependiendo del lenguaje que se utilice, más allá de las obvias diferencias sintácticas.
Por ejemplo, en un lenguaje de programación que cuenta con un sistema de tipos dinámico (en los que las variables pueden contener datos de cualquier tipo u objetos de cualquier clase) como Smalltalk no se requiere que los objetos que se utilizan de modo polimórfico sean parte de una jerarquía de clases.

Clase Abstracta Animal.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public abstract class Animal implements IAnimal {
 
 private String nombre;
  
 /**
  * Constructor de la clase Animal
  * @param nombre
  */
 public Animal (String nombre){
  this.nombre=nombre;
  System.out.println("Constructor Animal, " +
    "nombre del animal : "+this.nombre);
 }
  
 /**
  * Retorna el valor de nombre
  * @return
  */
 public String getNombre(){
  return nombre;
 }
 
  
 /**
  * Metodo Abstracto tipoAnimal, la implementación depende
  * de las clases concretas que extiendan la clase Animal
  */
 public abstract void tipoAnimal();
  
}
Como vemos tenemos la clase Abstracta que implementa la Interface IAnimal pero como mencionamos al principio, esta clase no esta obligada a implementar el método comunicarse() ya que también es clase abstracta.
Tenemos el método tipoAnimal() el cual si debe ser declarado como abstracto, evidenciamos también el atributo nombre el cual lo declaramos como private y solo accederemos a el en nuestro árbol de herencia, con el aplicamos un poquito el concepto de Encapsulación (pero no de la forma ideal, podemos ver una pequeña definición en la entrada sobre conceptos Básicos).