Mostrando entradas con la etiqueta ficheros. Mostrar todas las entradas
Mostrando entradas con la etiqueta ficheros. Mostrar todas las entradas

3 dic 2015

Formatos en ficheros de texto

Se trata de dotar de una organización interna a los ficheros de texto.

El caso extremo sería, sin ningún formato, en este caso sería una secuencia de caracteres de principio a fin. Sería el caso, por ejemplo, de muchos libros disponibles en la red. Su utilidad en muchos casos es el análisis de determinados aspectos lingüísticos.

Los principales formatos serían:
Con longitud de campos fija.
Con separador entre campos.
Con un campo por línea.



Con longitud de campos fija o encolumnados.

Cada campo se almacena con una longitud fija para todos los elementos.
Es necesario conocer estos valores de longitudes para poder leer y escribir.
Supongamos que queremos guardar datos de empleados (dni (9 caracteres), edad (2 dígitos), nombre (20 caracteres) y salario mensual (5 dígitos y 2 decimales). Podríamos escribir con un formato  %9s%2d%20s%7.2f\n

Ejemplo:
14567432F32    Ana Martín Pérez 1654.43
 4322224M28Manuel Rodríguez Mar 998.32
  657897H45  Jesús López Castro10234.23   



Con separador entre campos.

Cada campo está separado del siguiente por un separador, que puede ser cualquier carácter, pero que debe ser elegido de forma que no forme parte del contenido de los campos.  Caracteres habituales son el tabulador, la coma (,), el punto y coma (;), los dos puntos (:), los dobles dos puntos (::),  la almohadilla (#),  asterisco (*), etc.
El separador (,) es muy habitual dando nombre a un tipo de ficheros llamado .csv (del inglés comma-separated values).
La mayoría de las hojas de cálculo, los procesadores de textos y los sistemas gestores de bases de datos permiten importar y exportar a este formato.

Ejemplo:

14567432F#32#Ana Martín Pérez#1654.43
4322224M#28#Manuel Rodríguez Mar#998.32
657897H#45#Jesús López Castro#10234.23


Por ejemplo, en Word, nos preguntaría por el tipo de codificación del fichero:



En Excel, nos permitiría separarlo en columnas, indicándole primero la codificación y posteriormente la separación:




En otras hojas de cálculo de forma muy similar, como en Calc de Libre Office:



Con un campo por línea.

Aparece cada campo en una línea.

Ejemplo:
14567432F
32
Ana Martín Pérez
1654.43
4322224M
28
Manuel Rodríguez Mar
998.32
657897H
45
Jesús López Castro
10234.23


18 nov 2015

Acceso aleatorio a ficheros en Java

Java dispone de la clase RandomAccessFile que permite acceder al contenido de un fichero binario de forma aleatoria.

Para crear objetos de esta clase, al constructor se le puede pasar, o la ruta mediante un String o mediante un File. En cualquiera de los dos casos hay que pasar un segundo parámetro con el modo de acceso. El modo de acceso puede ser “r”, “rw”

Ejemplos:
Fich= new RandomAccessFile(String nombre, String modoAcceso)
Fich = new RandomAccessFile(File fic, String modoAcceso)


Los métodos más importantes son:
long getFilePointer()
Devuelve la posición del puntero en el fichero.
void seek(long pos)
Pone el puntero en la posición dada por pos, tomada desde el inicio.
long length()
Devuelve el tamaño del fichero en bytes.
Int skipBytes (int desplaz)
Mueve el puntero desde su posición el número de bytes indicado por desplaz.

Ejemplo:
Vamos a guardar los datos de una serie de empleados. Interesa que los datos de cada persona tengan la misma longitud para poder saltar e ir a una persona, para ello limitamos (fijamos) el tamaño de los String antes de escribirlos:

buffer = new StringBuffer(apellidos[i]);
buffer.setLength(10);

El resto de campos tienen una longitud fija, porque son enteros y double.
En total: int (4 bytes), string (20 bytes), int (4 bytes) y double (8 bytes) = 36 bytes.
Tamaño del fichero= 8 registros x 36 bytes = 288 bytes

public class EscribirFichAleatorio {
public static void main(String[] args) throws IOException {
        // TODO code application logic here
        File fich = new File("Empl_aleat.dat");
        RandomAccessFile file = new RandomAccessFile(fich, "rw");
        String[] apellidos = {"MARTÍN", "SORIA", "FERNÁNDEZ", "LUNA", "GARCÍA", "PÉREZ", "RODRÍGUEZ", "MARTÍNEZ"};
        int[] dept = {10, 20, 30, 20, 10, 40, 30, 40};
        Double[] salario = {850.65, 12035.36, 2156.36, 1500.32, 989.23, 1566.32, 1866.88, 2356.78};
        StringBuffer buffer = null;
        for (int i = 0; i < apellidos.length; i++) {
            file.writeInt(i + 1); //identificador de empleado
            buffer = new StringBuffer(apellidos[i]);
            buffer.setLength(10);
            file.writeChars(buffer.toString());
            file.writeInt(dept[i]);
            file.writeDouble(salario[i]);
        }
        file.close();
    }
}


6 nov 2015

Lectura/Escritura de ficheros de caracteres en Java

Se utilizan las clases FileReader y FileWriter

Lo primero es crear un ejemplar de la clase pasando al constructor una cadena con el nombre del fichero o un File.

Para la lectura y la escritura se utilizan los métodos read o write, que se encargan de leer o escribir un carácter.

Los caracteres alfanuméricos se pueden tratar en muchos esquemas de codificación, por defecto utilizan UTF-8, pero se puede pasar como argumento a FileReader y FileWriter una Charset determinado (ASCII, UNICODE, ISO-8859-1, etc)

Cuando se terminan las operaciones sobre los datos se cierra el fichero con el método close.

FileReader además proporciona los siguientes métodos, que devuelven el número de caracteres leídos, o -1, si se ha llegado al final del fichero:
int read (),  lee un carácter.
int read (char[] buf), lee caracteres en un array buf.
int read(char[] buf, int despl, int n), lee como máximo n caracteres en el array buf y empezando en buf[despl].

FileWriter además proporciona los siguientes métodos:
void write (int car), escribe un carácter.
void write (char[] buf), escribe un array de caracteres.
void write (char[] buf, int despl, int n), escribe n caracteres en el array buf y empezando en buf[despl].
void write (String st), escribe una cadena de caracteres.
append (char car), añade un carácter al fichero.


Lectura/Escritura en ficheros de caracteres utilizando memoria intermedia (buffered)

Las clases anteriores traducen directamente cada operación de E/S a una llamada al sistema operativo subyacente. Esto puede ser muy ineficiente cuando se procesan grandes volúmenes de información; resulta mucho más rápido leer y escribir siempre en una zona de memoria intermedia, que solo se llena o vacía (mediante llamadas al sistema operativo) cuando es necesario.

Las clases con memoria intermedia para el tratamiento de caracteres son: BufferedReader y BufferedWriter.

El constructor de la clase con memoria intermedia recibe un ejemplar de la clase sin memoria intermedia.

Además nos permiten procesar líneas de texto completas, mediante los métodos readLine().

Ejemplos:
FileReader fr = new FileReader(fichent)
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(fichsal);
BufferedWriter bw = new BufferedWriter(fw);


Lectura/Escritura en ficheros de caracteres haciendo lectura por líneas

Para leer textos por líneas se emplean las clases BufferedReader y PrintWriter. El método de funcionamiento puede ser leer una línea completa, procesarla y escribirla en el archivo de destino.

Hay que tener en cuenta que cada sistema operativo hace uso de marcadores de fin de línea diferentes.

BufferedReader flujoDeEntrada = null;       
PrintWriter flujoDeSalida = null;       
try {           
flujoDeEntrada =  new BufferedReader(new FileReader(libro.txt"));           
flujoDeSalida =  new PrintWriter(new FileWriter("copia_libro.txt"));
String linea;
while ((linea = flujoDeEntrada.readLine()) != null) {
flujoDeSalida.print(linea);
}
}  finally {
if (flujoDeEntrada != null) {
flujoDeEntrada.close();
}
if (flujoDeSalida != null) {
flujoDeSalida.close();

}

5 nov 2015

Lectura/Escritura de ficheros binarios en Java


Se utilizan las clases FileInputStream y FileOutputStream

Lo primero es crear un ejemplar de la clase pasando al constructor una cadena, con el nombre del fichero, o un File.

Para la lectura y la escritura se utilizan los métodos read o write, que se encargan de leer o escribir un byte.

Cuando se terminan las operaciones sobre los datos se cierra el fichero con el método close.

Ejemplo:
FileInputStream in =  new FileInputStream(fichero);
FileOutputStream out = new FileOutputStream("copia_"+fichero);           
int c;           
while ((c = in.read()) != -1) {
out.write(c);
int.close();
out.close();


Lectura/Escritura en ficheros binarios utilizando memoria intermedia (buffered)

Para leer y escribir bytes con memoria intermedia:
FileInputStream fis;
fis = new FileInputStream(“imagen.jpg”)
BufferedInputStream bis= new BufferedInputStream(fis);
FileOutputStream fos;
fos = new FileOutputStream(“copia_imagen.jpg”);
BufferedOutputStream bos = new BufferedOutputStream(fos);