You are on page 1of 10

m Stream 110

y archivos
Usar la clase File
"Mmh", dice el programador novato, "es un poco molesto; mi programa
intentaba abrir un archivo que no exista, justo cuando lo ejecutaba para el
gran jefe". "Bien", decimos, "por qu no probar primero si exista el archivo
utilizando el mtodo exists de la clase File?". El PN dice, "iExplquemelo!"
Puede utilizar la clase File para determinar muchas cosas sobre archivos,
como su tamao, si se puede escribir sobre ellos, si un elemento es un
archivo, directorio o conexin de nombres, y ms an. Aqu tiene el diagrama
de herencia para la clase File:
j ava.lang .0bject
I
+-java.io .File
Observe que puede utilizar isFile para determinar si un elemento es un
archivo verdadero u otra cosa, como un directorio (lo puede comprobar con
isDirectory) o una conexin de nombres. Utilice toURL para convertir la va
de acceso de un archivo a un URL, renombrar archivos y otros con la clase
File.

Examinaremos un ejemplo: haremos funcionar varios mtodos de la clase


File, obteniendo alguna informacin sobre un archivo llamado file.txt. Aqu
tiene la apariencia del cdigo:
import java.io.File;
class file
I
public static void main (String args [ 1 )
(
File filel = new File(nfile.txt");
System.out.println(nArchivo: " + filel.getName0 + (filel.isFile()?
es un archivon :
es un filtron));
System.out.println("Tamai0: " + filel-lengtho);
System.o~t.println(~Va de acceso: " + filel.getPath0);
System.o~t.println(~Va de acceso absoluta: " +
filel.getAbaolutePath());
System.~ut.println(~Ultimamodificacin del archivo: "
filel.lastModified());
System.out.println(fi1e1.existsO 7 "El archivo existen : "El
archivo no existen);
System.out.println(filel.canRead() ? "Se puede leer el archivo":
"No se puede leer el archivom);
System.out.grintln(file1.canWriteO ? "Se puede escribir al
archivom :
.No se puede leer el archivo");
System.out.println(filel.isDirectory~) ? "El archivo es un
directoriom :
"El archivo no es un directoriom);
1
1
Aqu tiene los resultados de este cdigo (observe que la hora en que se
modific por ltima vez el archivo se recibe de la forma habitual; ms desde el
1/1/70, que puede convertir a una fecha ms legible con la clase Date):
java file
Archivo: file.txt es un archivo
Tamao: 23
Va de acceso: file.txt
Va de acceso absoluta: C:\file.txt
Ultima modificacin del archivo: 953020822000
El archivo existe
Se puede leer el archivo
Se puede escribir al archivo
El archivo no es un directorio
Esto es todo. Este ejemplo se encuentra en el archivo file-java del CD queacompaa
a este libro. Como puede ver, el uso de la clase File puede determi-

nar un gran impacto sobre archivos y directorios.

Trabajar con InputStream


El programador novato aparece y dice, "Estoy listo para comenzar a trabajar con archivos. Dnde comienzo?" "Comience", decimos, "con las clases
InputStream y OutputStream".
Las clases InputStream y OutputStream son las clases base de la entrada y
salida orientadas a bytes en Java, por lo que merece la pena examinar los
mtodos que proporcionan estas clases a todas las dems clases orientadas a
stream de bytes. Aqu tiene el diagrama de herencia para la clase InputStream,
en la que se basan los streams de entrada:
Examinaremos la clase OutputStream en el tema siguiente.
Trabajar con OutputStream
El opuesto de la clase InputStream, introducida en el tema previo, es la
clase OutputStream, en la que se basan los streams de salida. Aqu tiene el
diagrama de herencia de OutputStream:
Ahora que hemos visto InputStream y OutputStream, es el momento de
hacer funcionar estas clases, comenzando en el tema siguiente.
Trabajar con Filelnputstream
"Necesito abrir un archivo de imagen y trabajar con sus bytes individuales", dice el programador novato. "Cmo puedo hacerlo?" "Puede utilizar la
clase FileInputStream para trabajar con los bytes de un archivo", decimos. El
PN dice " iExplquemelo!"
La clase FileInputStream est diseada especialmente para trabajar con
archivos de entrada orientados a bytes y deriva de la clase InputStream, como
se muestra aqu:

l +-java.io.File1nputStream
Para crear un stream de entrada de archivo, utilizamos el constructor de la Y
clase FileInputStream. Aqu tiene los mtodos de lectura que debe utilizar
con esta clase:
int read(). Lee un byte de datos desde su stream de entrada y lo
devuelve.
int read(byte[] b). Lee hasta b.length bytes de datos del stream de
entrada en una matriz de bytes y devuelve el nmero ledo de bytes.
int read(byte[] b, int off,int len). Lee hasta len bytes de datos de este
stream de entrada en una matriz de bytes y devuelve el nmero ledo de
bytes.
Vamos a examinar un ejemplo. En este caso, abriremos el propio cdigo
fuente de la aplicacin, leeremos y mostraremos 50 bytes de cdigo, saltaremos 50 bytes con el mtodo skip y despus leeremos y mostraremos 50 bytesms (observe
que tambin podemos determinar cuntos bytes existen a la
espera de lectura utilizando el mtodo available, y que podemos cerrar el
stream al final del cdigo):
import java. io .*;
class fileinputstream
1:
public static void main(String args[l) throws Exception
{
int size;
PileInputStream fileinputstream = new
FileInp~tStream(~fileinputstream.java");
Systa.o~t.println(~Bytesdisponibles: " + (size =
fileinputstream.available0));
System.out.println(m~eyencio50 by te^....^);
byte bytearray [l = new byteC501;
if (fileinputstream.read(bytearray) 1= 50) C
System.~ut.println(~No se pudieron leer 50 bytesn);
1

if (fileinputitrram.read(bytearray) 1= 50) {
Syetem.out.println('No se pudieron leer 50 byteen);
>
syst-.out.println(new String(bytearray, 0, 50));
Aqu tiene la salida de este cdigo:
java f ileinputstream
Bytes disponibles: 982
Leyendo 50 bytes....
import java.io.*;
class fileinputstream
(
Ignorando 50 bytes...
Leyendo 50 bytes....
ception
{
int size;
FileIn
Eso es todo. Este ejemplo se encuentra en el archivo fileinputstream.java
del CD.
Trabajar con FileOutputStream
"Bien", dice el programador novato, "s que se utiliza FileInputStream
para leer desde archivos, pero, qu clase puedo utilizar si quiero escribir en
un archivo?" Sonremos y decimos, "Apuesto a que lo puede adivinar"
Puede utilizar la clase FileOutputStream para escribir datos, byte a byte, a
un archivo. Aqu tiene el diagrama de herencia para esa clase, que deriva de la
clase OutputStream:
Aqu tiene los mtodos de escritura que puede utilizar con esta clase:
int write(byte[] b). Escribe b.length bytes a partir de la matriz de bytes
dada a este stream de archivo de salida.

void write(byte[] b, int off, int len). Escribe len bytes a partir de la
matriz de bytes de entrada, iniciando el desplazamiento en off a este
stream de salida de archivo.
voi write(int b). Escribe el byte dado a este stream de salida de
archivo.
Aqu tiene un ejemplo en el que escribimos la cadena de texto "Esto es una
cadena de texto." a un archivo de tres formas: byte a byte, todos a la vez y en
parte. Aqu tiene la apariencia el cdigo:
import java.io.*;
class fileoutputstream
(
public static void main(String args[li throws Exception
(
byte data[] = -Esto es una cadena de texto.'.getBytes();
~ileOutputStream fileoutputstreaml = new
FileOutputStream("filel.txt");
for (int loop-index = 0; loop-indax < data-lemgth; loop-indax++) (
FileOutputStream fileoutputstread = new
FileOutputStream("file2.txt");
fileoutputstread.write(data);
FileOutputStream fileoutputstread = new
FileOutputStrram("file3.txt");
fileoutputstread.write(data, 5, 10);

Eso es todo. Este ejemplo se encuentra en el archivo fileoutputstream.java


del CD.
Trabajar con ByteArraylnputStream
"Tengo una
novato, "y
tratar una
ella!" "S

matriz de bytes enorme en mi programa", dice el programador


siempre pierdo la posicin en ella. iNo est bien que no podamos
matriz de bytes como un archivo y abrir un stream de entrada para
se puede", decimos. El PN se queda asombrado.

Puede utilizar la clase ByteArrayInputStream para abrir un stream de


entrada desde una matriz de bytes en memoria. Aqu tiene el diagrama de
herencia para esta clase:
Aqu tiene un ejemplo. En este caso, nicamente creamos un bufSer de
memoria con el texto "Aqu tenemos una cadena" y despus abrimos un
ByteArrayInputStream con ese buffer, leemos y visualizamos el texto byte a
byte:
import java.io.*;
class bytearrayinputstream
{
public static void main(String args[l) throws IOException
{
byte data[] = .Aqu tenemos una cadenan.getBytesO;
ByteArrayInputStream in = new ByteArrayInputStream(data)i
int charactert
while((character = in.read0) I= -1)(
Systera.out.printi(char) character);
1
1
1
Aqu tiene la salida de este cdigo:
c:\>java bytearrayniputstream
Aqu tenemos una cadena
Eso es todo. Este ejemplo se encuentra en el archivo bytearrayinputstream.
java del CD.
Trabajar con ByteArrayOutputStream
"Por tanto, podemos leer bytes con ByteArrayInputStreamU, dice el programador novato. "Podemos escribirlos tambin?" "Claro", decimos, "con
ByteArrayOutputStream".
La clase ByteArrayOutputStream permite escribir stream de bytes a buffer. Aqu tiene el diagrama de herencia para esta clase:

Aqu tiene un ejemplo. En este caso, estamos escribiendo bytes a


ByteArrayOutputStream, escribiendo bytes a un buffer de memoria y enviando los bytes a un stream de salida de archivo:
import java. io. *;
class bytearrayoutputstream
(
public static void main(String args[]) throws IOException
{
ByteArrayOutputStream bytearrayoutputatresm = new
ByteArrayOutputStreamO;
byte data[] =
tenemos una cadenan.getBytesO;
byte buffer[] = bytearrayoutputstreauI.toByteArray0;
for (int loop_iPdax = 0; loop-index < data-length; loop-index++) {
System.out.print((char) buffer[loop-indexl);
1
= new FileOUtputStream("file.txt");
Este ejemplo se encuentra en el archivo bytearrayoutputstream.java del
CD. Aqu tiene la salida de este cdigo:
java bytearrayoutputstream
Aqu tenemos una cadena
Aqu tenemos una cadena
OUtputStream fileoutputetream
bytearrayoutputetream.writeTo(fileoutputetream);

You might also like