Archivos en Java
AUTOR:
-
Introduccin
int read() lee un slo byte de datos y los devuelve en el rango [0..255].
Devuelve -1 cuando se alcanza el final del flujo y no puede seguir leyendo
bytes.
int read(byte [] buf, int off, int len) lee len bytes del flujo (o los que pueda)
y los coloca a partir de la posicin off del array.
long skip(long count) salta hasta count bytes de entrada o hasta el final
del flujo de entrada, devolviendo el nmero de bytes saltados.
void write(byte [] buf, int offset, int count) escribe un array buf de bytes,
empezando en la posicin offset y escribiendo count de ellos, deteniendose
antes si encuentra el final del array.
void flush() vacia el flujo de modo que los bytes que quedaran por escribir
son escritos.
void close() cierra el flujo de salida liberando los recursos asociados a ese
flujo.
lanzan
una
Un constructor que toma un objeto de tipo File que se refiere al fichero (ver
la clase File).
El programador puede utilizar para la E/S los tres flujos del sistema que estn
disponibles
como
campos
estticos
de
la
clase System: System.in, System.out y System.err:
tipo PrintStream, por tanto los mensajes de salida normal, como los de error, son
mostrados utilizando los mtodos print de la clase PrintStream.
Por mucho, los mtodos ms importantes de un Stream son Read y Write, para
leer y escribir bytes (que a final de cuentas es el principal propsito de un flujo).
Alternativamente existen BeginRead, EndRead, BeginWrite y EndWrite para leer y
escribir de forma asncrona, pero stos mtodos al final se basan en Read y Write,
respectivamente.
El siguiente ejemplo muestra la forma bsica de leer bytes, aunque de
momento no nos importa qu tipo de flujo tratamos ni cmo lo hemos obtenido.
0
1
0
2
byte[] buffer;
int singleByte;
0
3
0
4
0
5
0
6
0
7
0
8
0
9
1
singleByte = stream.ReadByte();
11
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
En las lneas 7 a 11, se leen bloques de 1024 bytes hasta que ya no haya ms
que leer: Stream.Read copia los bytes en el primer parmetro, y regresa el nmero
de bytes que faltan por leer. Esto es especialmente til cuando tratamos con flujos
muy grandes, de tal suerte que evitamos consumir nuestra memoria RAM. Las
lneas 14 y 15 muestran cmo leer todos los bytes de un jaln. Esto es
especialmente til cuando el flujo que queremos leer suele ser un tamao
relativamente pequeo. Y finalmente, las lneas 18 en adelante muestra cmo leer
byte por byte. Esta forma es la que menos memoria consume pero la ms
ineficiente.
2
3
byte[] buffer;
byte singleByte;
5
6
7
buffer = ObtenerBufferDeAlgunLado();
stream.Write(buffer, 0, 1024);
8
9
1
0
// escribir un byte
singleByte = ObtenerAlgunByte();
stream.WriteByte(singleByte);
11
Los flujos se leen/escriben de forma secuencial. Por ello, cuando se leen o
escriben bytes, la posicin del flujo avanza el nmero de bytes ledos/escritos. As,
en nuestro ejemplo anterior, cada vez que leo 1024 bytes, el puntero del siguiente
byte aumenta en 1024 (especificado por la propiedad Position). Por supuesto, si
queremos saltarnos hasta una posicin en particular, podemos utilizar el mtodo
Seek. As, en el siguiente ejemplo:
1
stream.Seek(1024, SeekOrigin.Begin);
3
4
stream.Seek(1024, SeekOrigin.Current);
stream.Seek(1024, SeekOrigin.End);
using (stream)
3
4
5
{
// hacer algo con el flujo
terminado en ".java" contiene el texto del cdigo fuente escrito por el programador.
Los archivos se agrupan en directorios (hoy en da denominados carpetas). Un
directorio es un conjunto de archivos guardados bajo un nombre comn, el nombre
del directorio. Un directorio puede estar dentro de otro directorio, llamado a veces
"directorio padre. Se forma as un rbol de directorios, una organizacin
jerrquica de directorios y subdirectorios contenidos en ellos, en varios niveles. La
lista ordenada de directorios que lleva desde la raz del rbol hasta un archivo
especfico se denomina una ruta o en ingls "path".
Serializacin de objetos
Si dentro de la clase hay atributos que son otras clases, stos a su vez
tambin deben ser Serializable. Con los tipos de java (String, Integer, etc.) no hay
problema porque lo son. Si ponemos como atributos nuestras propias clases,
stas a su vez deben implementar Serializable. Por ejemplo:
1
2
3
4
5
6
7
8
9
Datos f;
3.
if (fichero.createNewFile())
4.
5.
6.
ioe.printStackTrace();
9. }
3. else
4.
Renombrar: Entre las muchas operativas que se pueden hacer sobre un fichero
tenemos el renombrado de un fichero. Para ello la librera de Java, Java IO, nos
ofrece un mtodo sobre la clase File.
Lo primero que tenemos que hacer es instanciar la clase File sobre el fichero
que queramos realizar el renombrado. Para ello utilizamos el constructor de la
clase File, como podemos ver en la siguiente lnea de cdigo:
1. File f1 = new File("fichero1.txt");
Lo siguiente ser instanciar una nueva clase File con el nombre del fichero que
queramos poner. Vemos la lnea de cdigo:
1. File f2 = new File("fichero2.txt");
Con las dos abstraciones de los ficheros solo nos quedar el ejecutar el
mtodo .renameTo(File) sobre el primer fichero. El mtodo .renameTo(File) recibe
como parmetro un objeto File con el nuevo nombre. El que nosotros hemos
llamado f2
3. else
4.
Conclusin
Los programas nos entregan informacin producto de las funciones que se
le han definido, esta debe provenir de alguna fuente de datos (discos, CD-RW,
memoria) y seguramente necesitaremos enviar esta informacin o datos hacia otro
lugar para mostrarla o almacenarla. Estos son los flujos (en ingls stream) de
informacin.
En JAVA, un flujo es un objeto que sirve de intermediario entre el origen y el
destino de los datos. Esto tiene la ventaja que el programa leer y escribir en el
flujo de informacin sin importar el origen o el destino (la pantalla, un archivo, la
memoria, Internet, etc.). Adems, tampoco va a tener relevancia el tipo de dato
que se encuentra en este objeto. Por otro lado, esto significa un nuevo nivel de
abstraccin pues al programa ya no le importa saber nada acerca del dispositivo
del cual vienen o al cual van los datos.