Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java




descargar 450.71 Kb.
títuloTaller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java
página5/6
fecha de publicación14.01.2016
tamaño450.71 Kb.
tipoTaller
med.se-todo.com > Documentos > Taller
1   2   3   4   5   6

Clases comunes de Entrada/Salida

Además de la entrada por teclado y salida por pantalla, se necesita entrada/salida por fichero, como son:

FileInputStream

DataInputStream

FileOutputStream

DataOutputStream

También existen otras clases para aplicaciones más específicas, que no vamos a tratar, por ser de un uso muy concreto:

PipedInputStream

BufferedInputStream

PushBackInputStream

StreamTokenizer

PipedOutputStream

BufferedOutputStream
FICHEROS

Todos los lenguajes de programación tienen alguna forma de interactuar con los sistemas de ficheros locales; Java no es una excepción.

Cuando se desarrollan applets para utilizar en red, hay que tener en cuenta que la entrada/salida directa a fichero es una violación de seguridad de acceso. Muchos usuarios configurarán sus navegadores para permitir el acceso al sistema de ficheros, pero otros no.

Por otro lado, si se está desarrollando una aplicación Java para uso interno, probablemente será necesario el acceso directo a ficheros.

Ficheros

Antes de realizar acciones sobre un fichero, necesitamos un poco de información sobre ese fichero. La clase File proporciona muchas utilidades relacionadas con ficheros y con la obtención de información básica sobre esos ficheros.

Creación de un objeto File

Para crear un objeto File nuevo, se puede utilizar cualquiera de los tres constructores siguientes:

File miFichero;

miFichero = new File( "/etc/kk" );

o

miFichero = new File( "/etc","kk" );

o

File miDirectorio = new File( "/etc" );

miFichero = new File( miDirectorio,"kk" );

El constructor utilizado depende a menudo de otros objetos File necesarios para el acceso. Por ejemplo, si sólo se utiliza un fichero en la aplicación, el primer constructor es el mejor. Si en cambio, se utilizan muchos ficheros desde un mismo directorio, el segundo o tercer constructor serán más cómodos. Y si el directorio o el fichero es una variable, el segundo constructor será el más útil.

Comprobaciones y Utilidades

Una vez creado un objeto File, se puede utilizar uno de los siguientes métodos para reunir información sobre el fichero:

  • Nombres de fichero

String getName()

String getPath()

String getAbsolutePath()

String getParent()

boolean renameTo( File nuevoNombre )

  • Comprobaciones

boolean exists()

boolean canWrite()

boolean canRead()

boolean isFile()

boolean isDirectory()

boolean isAbsolute()

  • Información general del fichero

long lastModified()

long length()

  • Utilidades de directorio

boolean mkdir()

String[] list()

Vamos a desarrollar una pequeña aplicación que muestra información sobre los ficheros pasados como argumentos en la línea de comandos, InfoFichero.java :

import java.io.*;
class InfoFichero {
public static void main( String args[] ) throws IOException {

if( args.length > 0 )

{

for( int i=0; i < args.length; i++ )

{

File f = new File( args[i] );

System.out.println( "Nombre: "+f.getName() );

System.out.println( "Camino: "+f.getPath() );

if( f.exists() )

{

System.out.print( "Fichero existente " );

System.out.print( (f.canRead() ?

" y se puede Leer" : "" ) );

System.out.print( (f.canWrite() ?

" y se puese Escribir" : "" ) );

System.out.println( "." );

System.out.println( "La longitud del fichero son "+

f.length()+" bytes" );

}

else

System.out.println( "El fichero no existe." );

}

}

else

System.out.println( "Debe indicar un fichero." );

}

}

STREAMS DE ENTRADA

Hay muchas clases dedicadas a la obtención de entrada desde un fichero. Este es el esquema de la jerarquía de clases de entrada por fichero:

stream de entrada java

Objetos FileInputStream

Los objetos FileInputStream típicamente representan ficheros de texto accedidos en orden secuencial, byte a byte. Con FileInputStream, se puede elegir acceder a un byte, varios bytes o al fichero completo.

Apertura de un FileInputStream

Para abrir un FileInputStream sobre un fichero, se le da al constructor un String o un objeto File:

FileInputStream mi FicheroSt;

miFicheroSt = new FileInputStream( "/etc/kk" );

También se puede utilizar:

File miFichero FileInputStream miFicheroSt;

miFichero = new File( "/etc/kk" );

miFicheroSt = new FileInputStream(

miFichero );
Lectura de un FileInputStream

Una vez abierto el FileInputStream, se puede leer de él. El método read() tiene muchas opciones:

int read();

Lee un byte y devuelve -1 al final del stream.

int read( byte b[] );

Llena todo el array, si es posible. Devuelve el número de bytes leídos o -1 si se alcanzó el final del stream.

int read( byte b[],int offset,int longitud );

Lee longitud bytes en b comenzando por b[offset]. Devuelve el número de bytes leídos o -1 si se alcanzó el final del stream.

Cierre de FileInputStream

Cuando se termina con un fichero, existen dos opciones para cerrarlo: explícitamente, o implícitamente cuando se recicla el objeto (el garbage collector se encarga de ello).

Para cerrarlo explícitamente, se utiliza el método close():

miFicheroSt.close();

Ejemplo: Visualización de un fichero

Si la configuración de la seguridad de Java permite el acceso a ficheros, se puede ver el contenido de un fichero en un objeto TextArea. El código siguiente contiene los elementos necesarios para mostrar un fichero:

FileInputStream fis;

TextArea ta;
public void init() {

byte b[] = new byte[1024];

int i;
// El buffer de lectura se debe hacer lo suficientemente grande

// o esperar a saber el tamaño del fichero

String s;
try {

fis = new FileInputStream( "/etc/kk" );

} catch( FileNotFoundException e ) {

/* Hacer algo */

}
try {

i = fis.read( b );

} catch( IOException e ) {

/* Hacer algo */

}
s = new String( b,0 );

ta = new TextArea( s,5,40 );

add( ta );

}

Hemos desarrollado un ejemplo, Agenda.java, en el que partimos de un fichero agenda que dispone de los datos que nosotros deseamos de nuestros amigos, como son: nombre, teléfono y dirección. Si tecleamos un nombre, buscará en el fichero de datos si existe ese nombre y presentará la información que se haya introducido. Para probar, intentar que aparezca la información de Pepe.

Objetos DataInputStream

Los objetos DataInputStream se comportan como los FileInputStream. Los streams de datos pueden leer cualquiera de las variables de tipo nativo, como floats, ints o chars. Generalmente se utilizan DataInputStream con ficheros binarios.

Apertura y cierre de DataInputStream

Para abrir y cerrar un objeto DataInputStream, se utilizan los mismos métodos que para FileInputStream:

DataInputStream miDStream;

FileInputStream miFStream;
// Obtiene un controlador de fichero

miFStream = new FileInputStream "/etc/ejemplo.dbf" );

//Encadena un fichero de entrada de datos

miDStream = new DataInputStream( miFStream );
// Ahora se pueden utilizar los dos streams de entrada para

// acceder al fichero (si se quiere...)

miFStream.read( b );

i = miDStream.readInt();
// Cierra el fichero de datos explícitamente

//Siempre se cierra primero el fichero stream de mayor nivel

miDStream.close();

miFStream.close();
Lectura de un DataInputStream

Al acceder a un fichero como DataInputStream, se pueden utilizar los mismos métodos read() de los objetos FileInputStream. No obstante, también se tiene acceso a otros métodos diseñados para leer cada uno de los tipos de datos:

byte readByte()

int readUnsignedByte()

short readShort()

int readUnsignedShort()

char readChar()

int readInt()

long readLong()

float readFloat()

double readDouble()

String readLine()

Cada método leerá un objeto del tipo pedido.

Para el método String readLine(), se marca el final de la cadena con n, r, rn o con EOF.

Para leer un long, por ejemplo:

long numeroSerie;

...

numeroSerie = miDStream.readLong();
Streams de entrada de URLs

Además del acceso a ficheros, Java proporciona la posibilidad de acceder a URLs como una forma de acceder a objetos a través de la red. Se utiliza implícitamente un objeto URL al acceder a sonidos e imágenes, con el método getDocumentBase() en los applets:

String imagenFich = new String( "imagenes/pepe.gif" );

imagenes[0] = getImage( getDocumentBase(),imagenFich );

No obstante, se puede proporcionar directamente un URL, si se quiere:

URL imagenSrc;

imagenSrc = new URL( "http://enterprise.com/~info" );

imagenes[0] = getImage( imagenSrc,"imagenes/pepe.gif" );
Apertura de un Stream de entrada de URL

También se puede abrir un stream de entrada a partir de un URL. Por ejemplo, se puede utilizar un fichero de datos para un applet:

ImputStream is;

byte buffer[] = new byte[24];

is = new URL( getDocumentBase(),datos).openStream();

Ahora se puede utilizar is para leer información de la misma forma que se hace con un objeto FileInputStream:

is.read( buffer,0,buffer.length );

NOTA: Debe tenerse muy en cuenta que algunos usuarios pueden haber configurado la seguridad de sus navegadores para que los applets no accedan a ficheros.

STREAMS DE SALIDA

La contrapartida necesaria de la lectura de datos es la escritura de datos. Como con los Streams de entrada, las clases de salida están ordenadas jerárquicamente:

stream de salida java

Examinaremos las clases FileOutputStream y DataOutputStream para complementar los streams de entrada que se han visto. En los ficheros fuente del directorio $JAVA_HOME/src/java/io se puede ver el uso y métodos de estas clases, así como de los streams de entrada ($JAVA_HOME es el directorio donde se haya instalado el Java Development Kit, en sistemas UNIX).

Objetos FileOutputStream

Los objetos FileOutputStream son útiles para la escritura de ficheros de texto. Como con los ficheros de entrada, primero se necesita abrir el fichero para luego escribir en él.

Apertura de un FileOutputStream

Para abrir un objeto FileOutputStream, se tienen las mismas posibilidades que para abrir un fichero stream de entrada. Se le da al constructor un String o un objeto File.

FileOutputStream miFicheroSt;

miFicheroSt = new FileOutputStream( "/etc/kk" );

Como con los streams de entrada, también se puede utilizar:

File miFichero FileOutputStream miFicheroSt;

File miFichero FileOutputStream miFicheroSt;
miFichero = new File( "/etc/kk" );

miFicheroSt = new FileOutputStream( miFichero );

Escritura en un FileOutputStream

Una vez abierto el fichero, se pueden escribir bytes de datos utilizando el método write(). Como con el método read() de los streams de entrada, tenemos tres posibilidades:

void write( int b );

Escribe un byte.

void write( byte b[] );

Escribe todo el array, si es posible.

void write( byte b[],int offset,int longitud );

Escribe longitud bytes en b comenzando por b[offset].

Cierre de FileOutputStream

Cerrar un stream de salida es similar a cerrar streams de entrada. Se puede utilizar el método explícito:

miFicheroSt.close();

O, se puede dejar que el sistema cierre el fichero cuando se recicle miFicheroSt.

Ejemplo: Almacenamiento de Información

Este programa, Telefonos.java, pregunta al usuario una lista de nombres y números de teléfono. Cada nombre y número se añade a un fichero situado en una localización fija. Para indicar que se ha introducido toda la lista, el usuario especifica "Fin" ante la solicitud de entrada del nombre.

Una vez que el usuario ha terminado de teclear la lista, el programa creará un fichero de salida que se mostrará en pantalla o se imprimirá. Por ejemplo:

95-4751232,Juanito

564878,Luisa

123456,Pepe

347698,Antonio

91-3547621,Maria

El código fuente del programa es el siguiente:

import java.io.*;
class Telefonos {

static FileOutputStream fos;

public static final int longLinea = 81;
public static void main( String args[] ) throws IOException {

byte tfno[] = new byte[longLinea];

byte nombre[] = new byte[longLinea];
fos = new FileOutputStream( "telefono.dat" );

while( true )

{

System.err.println( "Teclee un nombre ('Fin' termina)" );

leeLinea( nombre );

if( "fin".equalsIgnoreCase( new String( nombre,0,0,3 ) ) )

break;
System.err.println( "Teclee el numero de telefono" );

leeLinea( tfno );

for( int i=0; tfno[i] != 0; i++ )

fos.write( tfno[i] );

fos.write( ',' );

for( int i=0; nombre[i] != 0; i++ )

fos.write( nombre[i] );

fos.write( 'n' );

}

fos.close();

}
private static void leeLinea( byte linea[] ) throws IOException {

int b = 0;

int i = 0;
while( (i < ( longLinea-1) ) &&

( ( b = System.in.read() ) != 'n' ) )

linea[i++] = (byte)b;

linea[i] = (byte)0;

}

}

Streams de salida con buffer

Si se trabaja con gran cantidad de datos, o se escriben muchos elementos pequeños, será una buena idea utilizar un stream de salida con buffer. Los streams con buffer ofrecen los mismos métodos de la clase FileOutputStream, pero toda salida se almacena en un buffer. Cuando se llena el buffer, se envía a disco con una única operación de escritura; o, en caso necesario, se puede enviar el buffer a disco en cualquier momento.

Creación de Streams de salida con buffer

Para crear un stream BufferedOutput, primero se necesita un stream FileOutput normal; entonces se le añade un buffer al stream:

FileOutputStream miFileStream;

BufferdOutpurStream miBufferStream;

// Obtiene un controlador de fichero

miFileStream = new FileOutputStream( "/tmp/kk" );

// Encadena un stream de salida con buffer

miBufferStream = new BufferedOutputStream( miFileStream );
Volcado y Cierre de Streams de salida con buffer

Al contrario que los streams FileOutput, cada escritura al buffer no se corresponde con una escritura en disco. A menos que se llene el buffer antes de que termine el programa, cuando se quiera volcar el buffer explícitamente se debe hacer mediante una llamada a flush():

// Se fuerza el volcado del buffer a disco

miBufferStream.flush();

// Cerramos el fichero de datos. Siempre se ha de cerrar primero el

// fichero stream de mayor nivel

miBufferStream.close();

miFileStream.close();
1   2   3   4   5   6

similar:

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconIntroduccion al lenguaje quimico

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconDibujo tecnico introducción al curso. Alfabeto de líneas. Letras...

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconIntroducción al lenguaje de Jesús Tusón Valls (Editorial uoc. Aragón, España. 2003)

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconManual de Introducción

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconIntroducción a la programación gráfica en C

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconTaller de Introducción a la Ingeniería en Alimentos

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconProgramación general. Introducción (fundamentos legales y datos informativos)

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconIntroducción a la Epistemología Introducción

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconEvaluacion 2012 1° taller de la lic. En bioquímica, modificatoria...

Taller com/manual-java/introduccion-java php >Introducción a Java Introducción al lenguaje de programación Java iconEvaluacion 2014 1° taller de la lic. En bioquímica, modificatoria...


Medicina



Todos los derechos reservados. Copyright © 2015
contactos
med.se-todo.com