Streams en Java Agustín J. González elo-329 Generalidades



Descargar 9,38 Kb.
Fecha de conversión02.10.2017
Tamaño9,38 Kb.

Streams en Java

  • Agustín J. González
  • ELO-329

Generalidades

  • Un Stream es simplemente una fuente o destino de bytes.
  • Los streams más comunes son los archivos. También pueden ser caracteres de un string o bloque de memoria o bytes de un “socket”. La idea es que el programador los trate de la misma forma que archivos.
  • En Java se usan diferentes mecanismos para dar formato a datos. Ofrece clases orientada a manejo de bajo nivel y otras de alto nivel. Da gran flexibilidad y hace uso de “filtros en cascada” para manipular los datos de entrada o salida.
  • En general la flexibilidad en ocasiones resulta más “aparatosa” que lo que desearíamos.

Jerarquía para flujos de caracteres

  • Clase abstracta
  • PrintWriter

Jerarquía para flujos de bytes

  • Lectura de bytes
  • Escritura de bytes
  • Clase abstracta
  • Clase abstracta

Clases bases para Salida

  • La clase OutputStream es una clase abstracta que especifica un número de operaciones para escribir un byte, para escribir un arreglo de bytes, y para cerrar el stream.
  • Clases derivadas de ésta son FileOutputStream y ByteArrayOutputStream, las cuales son clases concretas (no abstractas). Sus operaciones de write envían bytes a archivo o memoria.
  • Para dar formato a los datos (imprimir números y strings) se dispone de las clases “Writers”.
  • PrintWriter es una clase de esa jerarquía, la cual recibe en su constructor el objeto con el cual podrá escribir (write) los bytes.
  • Ej. FileOutputStream fout = new FileOutputStream(“output.dat”); PrintWriter pout = new PrintWiter(fout);

Ejemplo: Copia de un archivo

  • import java.io.*; public class Copy { public static void main(String[] args) throws IOException { File inputFile = new File("farrago.txt"); File outputFile = new File("outagain.txt"); FileReader in = new FileReader(inputFile); FileWriter out = new FileWriter(outputFile); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); } }

Clases bases para Salida (Buffer)

  • Además de formato podemos disponer de un buffer para mejorar el desempeño de algunos dispositivos de entrada y salida.
  • El incorporar un buffer y con ello crear la cadena es un caso de filtrado, se usa: PrintWriter pout = new PrintWriter( new BufferedOutputStream (new FileOutpurStream(“Output.dat”)));
  • Los filtros se pueden construir usando cualquier combinación de clases encadenando una después de la otra.
  • La primera clase es aquella que permite leer o escribir objetos, y la última clase de la cadena envía o recibe los bytes. Las clases intermedias pueden hacer el trabajo que necesitemos (buffer, encriptación etc.)
  • PrintWriter
  • BufferedOutputStream
  • FileOutputStream

Clases bases para Salida

  • Para escribir texto, podemos usar PrintWriter y sus operaciones print o println.
  • PrintWriter out; Employee harry; .... // apertura del PrintWriter entre otras out.println(3.14); out.print(“Harry : “); out.print(harry);
  • Cuando se imprimen objetos, se invoca el método toString del objeto.
  • La clase Object implementa este método, el cual imprime la clase del objeto y su dirección. Lo recomendable es re-definir este método para producir un string que tenga más sentido para la clase específica.

Clases bases para Entrada y Salida de bytes (no necesariamente legible por humanos)

  • Para salida binaria, usamos las clases DataInputStream y DataOutputStream. Ellas proveen las siguientes operaciones:
  • DataInputStream DataOutputStream readInt writeInt readShort writeShort readLong writeLong readFloat writeFloat readDouble writeDouble readBoolean writeBoolean readChar writeChar writeChars
  • Ejemplo: DataOutputStream out = new DataOutputStream(new FileOutputStream(“output.dat”)); out.writeDouble(3.14); out.writeChars(“Harry”);

Clases bases para Entrada y Salida de bytes (no necesariamente legible por humanos)

  • Una propiedad importante de las operaciones previas es que son independiente del procesador (tamaño de datos). Se usa el ordenamiento de la red big-endian.
  • La comunicación es segura pues la clase se encarga de hacer las conversiones si el procesador es little-endian.
  • Ej. Para guardar un string, primero se puede guardar el tamaño y luego los caracteres. String s; .... out.writeInt(s.length()); out.writeChars(s);
  • Para leer el string de vuelta: int len = in.readInt(); StringBuffer b = new StringBuffer(len); for (int i=0; i

Ejemplos

  • Lectura de una página WEB
    • URL url = new URL(“www.elo.utfsm.cl”); InputStream is = url.openStream(); DataInputStream in = new DataInputStream(is); String s; while((s=in.readLine()) != null) { ..... // procesar s ... }
  • Lectura desde archivo comprimido
    • ZipInputStream zin =new ZipInputStream(new FileInputStream(“employee.zip”)); DataInputStream din=DataInputStream(zin);

Archivos

  • Se dispone de las clase FileInputStream y FileOutputStream.
  • Hay que recordar cerrar el archivo. FileInputStream fin = new FileInputStream (“input.dat”); ... fin.close();
  • No hay operaciones muy útiles para trabajar con los archivos en forma directa. Debemos utilizar un adaptador. DataInputStream in = new DataInputStream(fin);
  • Si deseamos hacer ambos lectura y salida de un archivo, se debe usar la clase RandomAccessFile. Esta clase no hereda de InputStream ni OutputStream.
  • Como no hay múltiple herencia en Java, esta clase implementa las interfaces DataInput y DataOutput.
  • Para abrir un archivo random: RandomAccessFile in = new RandomAccessFile(“input.dat”, “r”); RandomAccessFile inOut = new RandomAccessFile(“input.dat”, “rw”);
  • Los archivos random disponen de funciones para hacer un seek como en C.

String como un Stream

  • Se emplean las clases ByteArrayOutputStream y ByteArrayInputStream.
  • Para escribir sobre un string usando print(). Date bday = new Date(1975, 6,16); ByteArrayOutputStream bout = new ByteArrayOutputStream(); PrintWriter out = new PrintWriter(bout); out.print(“Birthday: “); out.println(bday); String b = out.toString();

Lectura de Entradas de Texto

  • Para escribir o leer dados binarios usamos DataInputStream o DataOutputStream.
  • Para escritura formateada, usamos PrintWriter.
  • Para lectura de texto en alto nivel no tenemos ninguna clase. Debemos hacerlo “a mano”.
  • Por ejemplo: Para lectura de líneas podemos usar el método readLine de la clase BufferedReader.
    • BufferedReader in = new BufferedReader(new FileReader(“employee.txt”); String line; while ((line = in.readLine())!=null) { hacemos algo }

Lectura de Entradas de Texto (cont)

  • Para leer números, debemos cargar un string y luego convertirlo.
  • Es posible que debamos extraer el dato desde el string para ello utilizamos la clase utilitaria StringTokenizer.
  • Caso simple:
  • String s=in.readLine(); double x=Double.parseDouble(s);
  • Caso más completo aquí.

Lectura y escritura de objetos

  • Ver ejemplo aquí.
  • Otro ejemplo de entrada y salida variada


La base de datos está protegida por derechos de autor ©absta.info 2016
enviar mensaje

    Página principal