Escolar Documentos
Profissional Documentos
Cultura Documentos
1
ALGORITMICA II UNMSM
Generalidades
Un Stream es simplemente una fuente o destino de bytes. Los streams ms comunes son los archivos. Tambin 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 ms aparatosa que lo que desearamos.
UNMSM ALGORITMICA II
Clase abstracta
Clase abstracta
PrintWriter
Clase abstracta
Escritura de bytes
Clase abstracta
ALGORITMICA II
public class Copy { public static void main(String[] args) throws IOException { File inputFile = new File("farrago.txt"); File outputFile = new File("outagain.txt");
UNMSM
Clases bases para Salida (Buffer) formato podemos disponer de un buffer para mejorar el Adems de
ALGORITMICA II
desempeo 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)));
PrintWriter
BufferedOutputStream
FileOutputStream
Los filtros se pueden construir usando cualquier combinacin de clases encadenando una despus de la otra. La primera clase es aquella que permite leer o escribir objetos, y la ltima clase de la cadena enva o recibe los bytes. Las clases intermedias pueden hacer el trabajo que necesitemos (buffer, encriptacin etc.)
UNMSM
ALGORITMICA II
UNMSM
Una propiedad importante de las operaciones previas es que son independiente del procesador (tamao de datos). Se usa el ordenamiento de la red big-endian. La comunicacin 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 tamao 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 <len; i++) b.append(in.readChar()); String s = b.toString();
10
ALGORITMICA II
UNMSM
Ejemplos
Lectura de una pgina 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 ... }
UNMSM
ALGORITMICA II
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 mltiple 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.
UNMSM
12
ALGORITMICA II
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();
13
ALGORITMICA II
14
ALGORITMICA II
15
ALGORITMICA II
16
ALGORITMICA II
Persistencia en Java
UNMSM
Persistencia en Java
Un objeto se dice persistente cuando es almacenado en un archivo u otro medio permanente. Un programa puede grabar objetos persistentes y luego recuperarlos en un tiempo posterior. A diferencia de C++ que slo soporta persistencia a travs de bibliotecas propietarias por lo cual su portabilidad y generalidad es limitada, Java se provee un mecanismo de serializacin para almacenar objetos en disco. La serializacin se obtiene llamando al mtodo writeObject de la clase ObjectOutputStream para grabar el objeto, para recuperarlo llamamos al mtodo readObject de la clase ObjectInputStream. La serializacin adems de persistencia, se puede usar para transferir objetos desde una mquina a otra a travs de un socket .
UNMSM
17
ALGORITMICA II
Interfaz Serializable
Slo objetos que implementen la interfaz Serializable pueden ser escritos a stream. La clase de cada objeto es codificada incluyendo el nombre de la clase y la firma de la clase (su prototipo) los valores de los sus campos y arreglos, y la clausura de cualquier otro objeto referenciado desde el objeto inicial. Para hacer que un objeto sea serializable, slo debemos declarar que implementa la interfaz serializable. Nada ms. No hay ntodos que debamos definir. Por razones de seguridad las clases no son serializable por defecto. Hay que tener claro el orden y tipo de los objetos almacenados en disco para recuperarlos en el mismo orden.
UNMSM
18
ALGORITMICA II
19
ALGORITMICA II
staff
Si grabamos staff, no queremos tres secretarias luego sino algo equivalente a esta vista en memoria.
Secretary=
Manager Secretary= 20
ALGORITMICA II
UNMSM
21
secretary=
ALGORITMICA II
22
ALGORITMICA II
UNMSM
Se aplica en casos que tengamos objetos que no sean serializables (aquellos que tienen algn dato no serializable) Por ejemplo Point2D.Double no es serializable en Java. Para que no reclame el compilador, definimos nuestro dato Point2D.Double como transiente (transient) y luego definimos los mtodos indicados.
23
ALGORITMICA II
24
ALGORITMICA II
25
26
27
out2.writeDouble(3.14159); out2.writeBytes("That was pi\n); out2.writeChars( "That was pi\n); out2.writeDouble(1.41413); out2.writeUTF("Square root of 2"); out2.close();
28
29
30
// throws IOException FileOutputStream out = new FileOutputStream("theTime.dat"); ObjectOutputStream s = new ObjectOutputStream(out); s.writeObject("Today"); s.writeObject(new Date(1,1,2006)); s.close(); // throws IOException y ClassNotFoundException FileInputStream in = new FileInputStream("theTime.dat"); ObjectInputStream s = new ObjectInputStream(in); String today = (String)s.readObject(); Date date = (Date)s.readObject(); s.close();
31
Ejemplo: