Aprende programación






12 sept 2009

Experimento práctico - Buscando en un directorio con Java


Estaba revisando el Analytics de javaHispano y curiosamente, y no sé por qué, habia un texto desde google que tenia muchas entradas en el que ponia "java buscando en un directorio". Si se busca en Google por ese texto hace referencia a un link de una pregunta en el foro que pretendía esto y muy bién contestada por Rugi.

Por ello, he pensando en ampliar dicha información y preparar un buscador de ficheros utilizando Netbeans 6.7.1 que permite navegar por los directorios y ejecutar un fichero haciendo doble click sobre este. Adicionalmente se puede escribir un texto y buscar en el directorio activo y directorio que cuelgan de este los ficheros que tengan ese texto. Del mismo modo, haciendo doble click sobre los ficheros se pueden ejecutar con el programa predeterminado según su extensión.

Lectura de ficheros de un directorio
Para la lectura de ficheros de un directorio hemos utilizado la clase File. Esta clase permite a través del método listFiles() devolver todos los elementos que existen en la ruta configurada en el File donde se ejecuta. Después para separar los directorios de los ficheros preguntamos a cada unos de los elementos si es un directorio con la función isDirectory(). También para cada elemento hemos utilizado las funciones getName() para ver el nombre del fichero o directorio y getAbsoluteFile() para conocer la ruta. Y en principio no hay mucho más (No es muy complicado).

Buscar por los directorios.
El algoritmo de busqueda también es sencillo. Hemos utilizado un algoritmo recursivo en el que se envia un directorio y obtiene todos los elementos de ese directorio. A continuación recorre los elementos y si encuentra otro directorio ejecuta la llamada a si mismo enviando el nuevo directorio. En caso de ser un fichero se comprueba que el nombre contenga el texto que hemos introducido con la función indexOf. Esta función devuelve la posición donde se encuentra o -1 si no encuentra el texto. Antes de comprobar, convertimos estos textos a mayúsculas para que no sea sensitivo a mayúsculas/minúsculas.

Ejecutandolo con un hilo.
Algo que aborrecí cuando hacia procesos largos y que ejecutaban muchas operaciones en aplicaciones de escritorio era que me dijesen:
- "Oye! Mira a ver que la aplicación se ha colgado."
Tenia que contestar:
- "No se ha colgado. Aún esta haciendo la operación".
Sin embargo, si hacian click por la ventana a veces se quedaba en blanco y volvian a insistir:
- "Que no! Que no! Que se ha quedado colgado. Mira todo en blanco".

En realidad si que estaba ejecutandose las operaciones. La razón de que se quedase la pantalla en blanco es que si se realizan las operaciones con el hilo principal hasta que no se finaliza el proceso no hace otra cosa. Esto incluye repintar la pantalla. Por ello, si en algún momento teneis que programar un proceso que va a costar mucho, es preferible lo hagais en un hilo y a poder ser hagais alguna barra de progresión o alguna animación. Así el usuario se siente más seguro de que está funcionando (aunque sea mentira). En esta aplicación podreis ver que la clase que contiene la busqueda es implements de Runnable y, al iniciar la búsqueda, el algoritmo recursivo se invoca desde el método run(). Otra cosa que puede ser interesante es ir mostrando los resultados o una barra de progresión mientras se realiza la búsqueda. Esto lo hemos programado utilizando el interface Observer de manera que cada vez que encuentra un fichero se ejecuta el método update del Frame y actualiza la lista.

Ejecutar un fichero externo:
Algunas veces, es de nuestro interes lanzar una aplicación externa. Para ello podemos utilizar Runtime.getRuntime().exec. Sin embargo, esto solo sirve para ficheros .exe (en el caso de Windows) pero no sirve para el resto de ficheros (.bmp, .jpg, .mp3, etc). Pero ¿como podemos saber si la aplicación por defecto de cada una de las extensiones?. La respuesta es, "No te preocupes, no hace falta saberlo". Existe un .exe que se encarga de esto llamado rundll32. Si invocas el método .exe de este modo, entiendiendo que sRuta es la ruta del fichero, verás que se abre con el programa predeterminado en el sistema operativo. Comentar que esto solo funcionará bajo Windows
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + sRuta);

Un poco de Swing.
Y finalmente, aunque no voy a explicar nada en este post, si estais interesados en el Swing le podeis dar un vistazo a como hacer para que algo se ejecuta cuando se hace doble click getClickCount(), la clase DefaultListModel, y poco más. La parte gráfica no tiene mucho que podamos destacar.

Pues nada, espero que os sirva de utilidad:

No hay comentarios:

Publicar un comentario