Bienvenidos sean a este post, hoy continuaremos con el post anterior donde vimos que son los streams, algunos de ellos y como manejar metodos de entrada (teclado) y salida (monitor). En el caso de hoy comenzaremos viendo como es la lectura y escritura de archivos, por lo visto anteriormente se podria decir que un stream es una secuencia de datos, InputStream es la lectura de datos desde un origen y OutputStream es la accion de escribir datos en un destino.

Pasemos a ver el primero de los metodos que utilizaremos con mas frecuencia FileInputStreamer, como dijimos con esta clase podremos leer cualquier origen que le informemos, en general van a ser archivos, tambien como vimos antes se puede crear un nuevo objeto con el metodo new y algunos de los constructores disponibles, luego le informaremos por medio de un String el archivo y/o su ubicacion, veamos un ejemplo:

FileInputStream f = new FileInputStream("/home/tinchicus/hello.txt");

Con esto le informamos donde esta el archivo al cual debe acceder para leer toda la informacion almacenada en ella, otra forma de hacerlo podria hacerse de la siguiente forma:

File a = new File("/home/tinchicus/hello.txt");
FileInputStream f = new FileInputStream(a);

En este caso crearemos un objeto de la clase File y la llamaremos a para luego asignarselo a nuestro objeto creado de la clase FileInputStream, a continuacion veremos algunos metodos utiles para poder trabajar con esta clase:

  • public void close(), este metodo se encargara de cerrar el stream que hayamos abierto y libera cualquier elemento del sistema asociado
  • protected void finalize(), este metodo se utiliza para limpiar la conexion con el objeto y en general es llamado para asegurarse de que no hay mas conexiones a ese objeto
  • public int read(int r), este metodo lee el byte de dato especificado del InputStream, devuelve un valor entero, el proximo byte de data y cuando devuelve -1 significa el fin del origen
  • public int read(byte[] r), toma la longitud en bytes de r y lo almacena en un array, devuelve el numero total de bytes leido, si devuelve -1 significa que es el fin del origen
  • public int available(), devuelve el numero de bytes disponibles en nuestro stream de entrada.

Todos los metodos anteriormente descriptos deben ser usados con throws IOException que como vimos en el post anterior podemos declararla en el comienzo del main() y este bajara a todos los metodos que corresponda. Tambien existen otras dos clases importantes:

  • ByteArrayInputStream, permite tener un buffer en memoria para ser usado como un InputStream, les dejo este link para mas informacion y ejemplos.
  • DataInputStream, es usada en el contexto de DataOutputStream y nos permite leer primitivos, les dejo este link para mas informacion y ejemplos.

La clase anterior era la encargada de leer informacion de un InputStream, pasemos ahora a la clase FileOutputStream la cual se encargara de escribir en un destino la informacion recibida, por lo general el destino es un archivo y si dicho archivo no existe primero lo creara para poder escribir en el mismo. La forma de definirlo es similar al anterior:

FileOutputStream f = new FileOutputStream("/home/tinchicus/salida");

O como en el caso anterior tambien podemos hacerlo de esta forma:

File a = new File("/home/tinchicus/salida");
FileOutputStream f = new FileOutputStream(a);

Pasemos a ver algunos metodos disponibles para poder trabajar con esta clase:

  • public void close(), este metodo se encargara de cerrar el stream que hayamos abierto y libera cualquier elemento del sistema asociado
  • protected void finalize(), este metodo se utiliza para limpiar la conexion con el objeto y en general es llamado para asegurarse de que no hay mas conexiones a ese objeto
  • public void write(int w), este metodo escribe el byte especificado al stream de salida (Output stream)
  • public void write(byte[] w), escribe la longitud de w en bytes desde el array de bytes mencionado al stream de salida (Output stream)

Al igual que la clase anterior esta tambien son a traves de throws IOException, el cual se puede declarar en el main() y este sera utilizado por los metodos que correspondan, tambien dispondremos de dos metodos interesantes:

  • ByteArrayOutputStream, crea un buffer en memoria y toda la informacion enviada al stream es almacenada en este buffer, para mas informacion usa este link
  • DataOutputStream, te permite escribir los primitivos en una salida, para mas informacion usa este link

Para entender un poco mejor este concepto veamos el siguiente ejemplo:

import java.io.*;

public class fileStreamTest
{

        public static void main(String[] args)
        {

        try
        {
                byte bWrite[] = { 11,21,3,40,5 };
                OutputStream os = new FileOutputStream("prueba.txt");
                for(int x = 0; x < bWrite.length; x++)
                        os.write( bWrite[x] );
                os.close();

                InputStream is = new FileInputStream("prueba.txt");
                int tamano = is.available();

                for(int i = 0; i < tamano; i++)
                        System.out.print((char)is.read() + "  ");
                System.out.print("\n");
                is.close();
        }

        catch(IOException e)
        {
                System.out.print("Excepcion");
        }
        }
}

En este ejemplo crearemos un Array de tipo byte donde almacenaremos algunos valores, despues por medio de la clase OutputStream crearemos un objeto llamado os, y le diremos cual va a ser su archivo de destino, despues por medio de un bucle for iremos escribiendo en ese archivo los valores almacenados en bWrite, despues cerraremos ese archivo, creamos otros objeto en este caso de tipo InputStream donde le diremos cual va a ser nuestro origen, es decir el archivo recien creado, luego crearemos una variable llamado tamano donde almacenaremos el tamaño de nuestro origen, el cual actuara como limite para nuestro bucle for y despues por medio de la linea de bucle mostraremos todos los valores almacenados y una vez finalizado generara un Enter y cerrara el objeto para liberar el archivo, en el bloque del catch ante un error mostrara un mensaje, si lo compilamos y ejecutamos obtendremos la siguiente salida:

tinchicus@dbn001vrt:~/programacion/java/program$ java fileStreamTest
(
PuTTYtinchicus@dbn001vrt:~/programacion/java/program$ PuTTY

Como pueden ver no es la salida que deseamos ver, para ello debemos modificar la siguiente linea:

System.out.print((char)is.read() + "  ");

Lo reemplazamos por la siguiente linea:

 System.out.print((byte)is.read() + "  "); 

En lugar de byte puede ser int, en ambos casos si lo compilamos y ejecutamos obtendremos esta salida:

tinchicus@dbn001vrt:~/programacion/java/program$ java fileStreamTest
11 21 3 40 5
tinchicus@dbn001vrt:~/programacion/java/program$

Observen como ahora funciono, esto puede deberse al motivo de porque al guardar datos en formato de byte al intentar recuperarlo puede no coincidir con el tipo char pero si al tipo de como se guardo, byte, o del formato original de los mismos, int, porque para esto podria entrar el tema de los segmentos de memoria pero no lo veremos en este post.

Pasemos a ver la navegacion de archivos y E/S, para conocer los conceptos basicos existen estas tres clases:

  • File, es el encargado de todos los metodos relacionados con las acciones para directorios, archivos, etc. Para mas informacion les dejo este link.
  • FileReader, esta clase es utilizada para leer stream de caracteres. Para mas informacion les dejo este link.
  • FileWriter, esta clase es utilizada para escribir stream de caracteres. Para mas informacion les dejo este link,

Por medio de la clase File podemos manipular los archivos y directorios de nuestro ordenador, para mas informacion usaremos otro post pero aqui veremos como crear directorios y como listarlos. Para crear un directorio debemos usar alguno de estos dos metodos:

  • mkdir, es para crear un directorio, si se creo correctamente devolvera un verdadero de lo contrario devuelve un falso, esto puede deberse a dos motivos, uno que no tenemos los permisos o el path fue mal informado o no existe
  • mkdirs, este metodo sirve para crear un directorio y todos sus parientes

En java a diferencia de Windows para diferenciar un directorio de otro se utiliza la barra de division (/) como en Unix o Linux, tanto para las plataformas Unix o Windows asi por ejemplo para indicar un path debemos usar la siguiente forma:

/home/tinchicus/hola.txt

Esto es para las plataformas Unix, en cambio para las plataformas Windows se deberia hacer asi:

c:/java/prueba/hola.txt

Este formato es valido para Java en Windows, pasemos a ver como hacer listados de un directorio, para poder listar todos el contenido de un directorio se utiliza el metodo list(), para entender un poco mejor todo esto veamos un ejemplo donde primero crearemos un directorio y luego lo listaremos:

import java.io.File;

public class ListDir
{
        public static void main(String[] args)
        {
                String dirname = "/tmp/user/java/bin";
                File d = new File(dirname);

                d.mkdirs();

                File lista = null;
                String[] paths;

                lista = new File("/tmp/user");

                paths = lista.list();

                for(String path: paths)
                        System.out.println(path);
        }
}

Este caso esta pensado para Linux, si lo necesitas para Windows modifica el directorio, pero en este caso primero crearemos una variable llamado dirname donde almacenaremos todo un path y de tipo String, luego crearemos un objeto de la clase File llamado d para luego usar el metodo mkdirs y crear los directorios faltantes, luego crearemos un objeto llamado lista de la clase File, despues un array llamado paths de tipo String, a lista le asignaremos un path, en este caso usaremos un intermedio a cuando creamos nuestros directorios, /tmp/user, y en paths almacenaremos el listado obtenido del metodo list() despues por medio de for avanzado mostraremos el contenido de paths, si lo compilamos y probamos se puede ver asi, recuerden que la salida puede variar dependiendo de lo que tengas:

tinchicus@dbn001vrt:~/programacion/java/program$ java ListDir
archivo03.txt
archivo01.txt
java
archivo02.txt
tinchicus@dbn001vrt:~/programacion/java/program$

En este caso podemos ver tres archivos y uno de los directorios que creamos, java, porque nosotros creamos el path /tmp/user/java/bin y aca le hicimos listar el contenido de la mitad.

En resumen, hoy hemos terminado con los metodos mas utilizados para manipular informacion en nuestro ordenador, desde las lecturas, hasta el listado de los direcorios, pasando por la escritura de las mismas, y creacion de los directorios, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios