ENTRADA Y SALIDA DE DATOS EN JAVA En Java se define la abstracción de stream (flujo) para tratar la comunicación de información entre el programa y el exterior. Entre una fuente y un destino fluye una secuencia de datos. Los flujos actúan como interfaz con el dispositivo o clase asociada. Operación independiente del tipo de datos y del dispositivo Mayor flexibilidad (p.e. redirección, combinación) Diversidad de dispositivos (fichero, pantalla, teclado, red) Diversidad de formas de comunicación • Modo de : secuencial, aleatorio • Información intercambiada: binaria, caracteres, líneas System.in
Instancia de la clase InputStream: flujo de bytes de entrada Metodos read() permite leer un byte de la entrada como entero skip(n ) ignora n bytes de la entrada available() número de bytes disponibles para leer en la entrada
System.out
Instancia de la clase PrintStream: flujo de bytes de salida Metodos para impresión de datos print(), println() flush() vacía el buffer de salida escribiendo su contenido
System.err
Funcionamiento similar a System.out Se utiliza para enviar mensajes de error (por ejemplo a un fichero de log o a la consola)
Entrada y Salida en Java Una de las operaciones más habituales que tiene que realizar un programa Java es intercambiar datos con el exterior. Para ello, el paquete java.io de J2SE incluye una serie de clases que permiten gestionar la entrada y salida de datos en un programa, independientemente de los dispositivos utilizados para el envió/recepción de los datos. 1.El paquete de Salida es PrintStream. 2.El paquete de Entrada es InputStream, que deriva en BufferedReader e InputStreamReader.
Salida de Datos El envió de datos al exterior se gestiona a través de la clase PrintStream, utilizándose un objeto de la misma para acceder al dispositivo de salida. Posteriormente, con los métodos proporcionados por esta clase, podemos enviar la información al exterior. El proceso de envió de datos a la salida debe realizarse siguiendo dos pasos: 1.- Obtención del objeto PrintStream. Se debe crear un objeto PrintStream asociado al dispositivo de salida, la forma de hacerlo dependerá del dispositivo en cuestion. La clase System proporciona el atributo estatico out que contiene una referencia al objeto PrintStream asociado a la salida estándar, representada por la consola 2.- Envio de datos al stream. La clase PrintStream dispone de los metodos print() (String cadena) y println() (String cadena) para enviar una cadena de caracteres al dispositivo de salida, diferenciandose uno de otro en que el segundo añade un salto de linea al final de la cadena. Esto explica que para enviar un mensaje a la consola se use la expresión System.out.println(). Ambos métodos se encuentran sobrecargados, es decir, existen varias versiones de los mismos para distintos tipos soportados por el lenguaje. En general, para enviar datos desde un programa Java al exterior habrá que utilizar la expresión: objeto_printstream.println(dato); objeto_printstream.print(dato); siendo dato un valor de tipo String, int, float, double, char o boolean.
BUFFER Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer. Un objeto String representa una cadena alfanumérica
de un valor constante que no puede ser cambiada después de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamaño puede variar. La clase StringBuffer dispone de muchos métodos para modificar el contenido de los objetos StringBuffer. Si el contenido de una cadena va a ser modificado en un programa, habrá que sacrificar el uso de objetos String en beneficio de StringBuffer, que aunque consumen más recursos del sistema, permiten ese tipo de manipulaciones. Al estar la mayoría de las características de los StringBuffers basadas en su tamaño variable, se necesita un nuevo método de creación: StringBuffer(); StringBuffer( int len ); StringBuffer( String str ); Se puede crear un StringBuffer vacío de cualquier longitud y también se puede utilizar un String como punto de partida para un StringBuffer. StringBuffer Dos = new StringBuffer( 20 ); StringBuffer Uno = new StringBuffer( "Hola Mundo" ); Cambio de Tamaño El cambio de tamaño de un StringBuffer necesita varias funciones específicas para manipular el tamaño de las cadenas: int length(); char charAt( int index ); void getChars( int srcBegin,int srcEnd,char dst[],int dstBegin ); String toString(); void setLength( int newlength ); void setCharAt( int index,char ch ); int capacity(); void ensureCapacity( int minimum ); void copyWhenShared(); Obervar que una de las funciones devuelve una cadena constante normal de tipo String. Este objeto se puede usar con cualquier función String, como por ejemplo, en las funciones de comparación. Modificación del Contenido Para cambiar el contenido de un StringBuffer, se pueden utilizar dos métodos: append() e insert().
En el ejemplo CadAppend.java, vemos el uso de estos dos métodos: class CadAppend { public static void main( String args[] ) { StringBuffer str = new StringBuffer( "Hola" ); str.append( " Mundo" ); System.out.println( str ); } } En este otro ejemplo, CadInversa.java, mostramos un método muy simple que le da la vuelta a una cadena: class CadInversa { public static String cadenaInversa( String fuente ) { int longitud = fuente.length(); StringBuffer destino = new StringBuffer( longitud ); for( int i=(longitud-1); i >= 0; i-- ) destino.append( fuente.charAt( i ) ); return( destino.toString() ); } public static void main( String args[] ) { System.out.println( cadenaInversa( "Hola Mundo" ) ); } }
ARCHIVOS EN JAVA (FICHEROS) Creación de un objeto File Para crear un objeto File nuevo, se puede utilizar cualquiera de los tres constructores siguientes: Constructores de la clase File
ejemplo
public File(String pathname) ;
new File(“/carpeta/archivo”);
public File(String parent, String child) ;
new File(“carpeta”, “archivo”);
public File(File parent, String child) ;
new File(new File(“/carpeta”), “archive”)
public File(URI uri) ;
new File(new URI(str);
El constructor utilizado depende a menudo de otros objetos File necesarios para el . 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. Objetos FileInputStream La clase 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: El ejemplo siguiente crea dos FileInputStreams que están utilizando el mismo archivo de disco real. Cualquiera de los dos constructores disponibles en esta clase puede lanzar una FileNotFoundException. InputStream f1 = new FileInputStream("/archivo.txt"); File f = new file("/archive.txt"); InputStream f2 = new FileInputStream(f); FileInputStream fichero=new FileInputStream("/carpeta/archive.txt"); File fichero = new File( "/carpeta/archive.txt" ); FileInputStream ficheroSt= new FileInputStream( fichero );
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(); Visualización de un fichero Si la configuración de la seguridad de Java permite el a ficheros, se puede ver el contenido de un fichero en un objeto JTextArea. El código siguiente contiene los elementos necesarios para mostrar un fichero: FileInputStream fis; JTextArea 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( "/carpeta/archivo.txt"); } catch( FileNotFoundException e ) { } try {
i = fis.read( b ); } catch( IOException e ) { } s = new String( b,0 ); ta = new TextArea( s,5,40 ); add( ta ); }