domingo, 16 de enero de 2011

Averiguar el Directorio Temporal desde Java


Muchas veces mientras desarrollamos aplicaciones tenemos la necesidad de generar archivos intermedios, lo mas común es asignar un directorio fijo para este propósito como muchas veces hacemos los estudiantes universitarios, "C:\\miArchivo.txt" lo cual en su momento resulto ser una salida rápida pero que a la larga nos presenta también ciertos problemas, en mi caso particular lo deje de hacer cuando aun usaba Windows XP, y mi cuenta de usuario tenia privilegios de administrador con lo cual no había ningún problema, mi programa en java podía hacer con el sistema de archivos lo que quisiera, si, incluso escribir en la raíz del disco :P, mi lección llego el día que me toco calificarme en la universidad, con una computadora prestada, esta tenia Windows Vista y escribir en la raíz del disco "C:\" era una herejía, por mas que intente darle permisos a todo el disco duro, al usuario, nada funciono, mi JAR simplemente no podía escribir en los archivos necesarios para terminar el proceso, sin mi IDE de confianza a la mano, y el auxiliar a la par esperando la calificación, me dice el dueño de la compu prestada "pero ahí tengo Linux también, podes correr java ahí", y yo como todo un tonto, errr tenia "c:\" fijo como path de los temporales, y sin el ide re generar el JAR a mano era otra tarea imposible (también aprendí a hacer JAR a mano a partir de ese día, si me traumatice #yoconfieso).

ese día aprendí dos cosas validas para java, y para otros lenguajes.

la primera, por seguridad, el sistema operativo no te va a dejar escribir en cualquier lado, mejor hacerlo en el lugar que esta pensado para resolver ese problema, si, la carpeta temporal, algo tan simple que ha estado ahí siempre y que muy pocos usamos jejeje.

la segunda, por potabilidad, jamas hagas algo en java que dependa del sistema operativo, del sistema de archivos en este caso, ya que eso limita las opciones de tu programa para servir de algo.

y finalmente la solución, tan simple como obtener un valor almacenado en una colección.

public static void main(String[] args) {
        System.out.println("El Directorio Temporal del Sistema Es: ");
        System.out.println( System.getProperty("java.io.tmpdir") );
    }


así de fácil es averiguar el Path del directorio temporal, con esto podemos asegurarnos de no tener problemas de permisos para crear archivos en ese directorio.

esta propiedad no nos sirve de mucho, es decir sirve para el asunto de los privilegios, pero si ademas queremos que sea portable tenemos que usar también la propiedad "file.separator" para averiguar el separador en las path, esto es en Windows "\" y en Linux "/" y con esto ya podemos crear archivos y carpetas temporales, independientemente del SO.


public static void main(String[] args) {
        
        String tempFolder =  System.getProperty("java.io.tmpdir") ;
        String pathSeparator = System.getProperty("file.separator") ;
        
        String tempFile = tempFolder + "temporal.txt" ; 
                                                                       
        System.out.println(tempFile);                                                              
        
        String tempNewFolder = tempFolder + "carpeta" + pathSeparator ;
        
        System.out.println(tempNewFolder);
        
    }


aquí una larga e interesante lista de propiedades del sistema que podemos utilizar para hacer nuestros
programas mas independientes del SO

http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html