"Hola, Amigo. Mucho tiempo, sin verte".
"Hola, Bilaabo. ¿De qué vas a hablar?"
"Hoy les hablaré sobre cómo trabajar con archivos. Java tiene una clase especial (Archivo) que puede usar para administrar archivos en un disco duro. Para administrar el contenido de los archivos, existen otras clases: FileInputStream, FileOutputStream, etc. "
"Interesante. Pero cuando dices 'administrar archivos', ¿a qué te refieres?"
"Eso es justo lo que voy a explicar ahora. Los archivos se pueden crear, eliminar, renombrar y mucho más. Puede pasar un objeto de archivo a prácticamente todas las clases que trabajan con (lee, escribe, cambia) el contenido de un archivo . Por ejemplo:"
FileInputStream input = new FileInputStream("c:/path/a.txt");
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);
"Pero la segunda opción es más larga. Todavía no entiendo por qué necesitamos estos objetos de archivo".
"Para este ejemplo específico, tienes razón. "Este no es un ejemplo de cómo tienes que hacerlo, sino más bien cómo puedes hacerlo.
Pero imagine que necesita mostrar una lista de todos los archivos ubicados en un directorio específico. Así es como se puede hacer esto usando objetos de archivo:"
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
System.out.println(file.getName());
}
"¿Es listFiles() un método que devuelve una lista de archivos en la carpeta indicada por «c:/ruta/»?"
"Sí. Pero los programadores suelen decir 'directorio'. El término 'carpeta' se empezó a usar hace relativamente poco tiempo, pero en principio, ambos términos son correctos y puedes decir el que prefieras".
"OK. ¿Y qué hace getName ()? ¿Devuelve el nombre del archivo? ¿Qué se incluye exactamente en el nombre? ¿El nombre completo, incluida la ruta, o solo el nombre del archivo en sí?"
"Solo el nombre del archivo en sí. Para la ruta completa, está file.getAbsolutePath()".
"Entonces, ¿qué otros métodos tiene la clase File?"
"Mira esto:"
Método | Descripción |
---|---|
boolean isDirectory() |
¿El objeto File es un directorio? |
boolean isFile() |
¿El objeto es un archivo? |
long length() |
Devuelve el tamaño/longitud del archivo en bytes. |
boolean createNewFile() |
Crea un nuevo archivo vacío si aún no existe un archivo con este nombre. |
boolean mkdir() |
Crea un directorio. El nombre «mkdir» proviene de «make directory». |
boolean mkdirs() |
Crea un directorio y todos sus subdirectorios. |
boolean delete() |
Elimina el archivo asociado al objeto. Si el objeto es un directorio, entonces el directorio se elimina solo si no hay archivos en él. |
void deleteOnExit() |
Agrega el archivo a una lista especial de archivos que se eliminarán automáticamente cuando finalice el programa. |
File createTempFile( String prefix, String suffix, File directory) |
Crea un archivo temporal con un nombre único generado aleatoriamente, algo así como «dasd4d53sd». Los parámetros adicionales son un prefijo y un sufijo de nombre. Si no se especifica un directorio, el archivo se crea en un directorio especial del sistema operativo para archivos temporales. |
boolean exists() |
Devuelve verdadero si existe un archivo con el mismo nombre en el disco duro. |
String getAbsolutePath() |
Devuelve la ruta completa del archivo con todos sus subdirectorios. |
String getCanonicalPath() |
Devuelve la ruta del archivo canónico. Por ejemplo, convierte la ruta «c:/dir/dir2/../a.txt» a «c:/dir/a.txt» |
String[] list() |
Devuelve una matriz de los nombres de los archivos contenidos en el directorio representado por el objeto actual. |
File[] listFiles() |
Devuelve una matriz de archivos contenidos en el directorio representado por el objeto File actual. |
long getTotalSpace() |
Devuelve la cantidad de espacio total (número de bytes) en el disco en el que se encuentra el archivo. |
long getFreeSpace() |
Devuelve la cantidad de espacio libre (número de bytes) en el disco en el que se encuentra el archivo. |
boolean renameTo(File) |
Cambia el nombre del archivo, es decir, el contenido del archivo en realidad recibe un nuevo nombre. En otras palabras, puede cambiar el nombre del archivo «c:/dir/a.txt» a «d:/out/text/b.doc». |
String getName() |
Devuelve solo el nombre del archivo sin la ruta. |
String getParent() |
Devuelve solo la ruta (directorio) al archivo actual, sin el nombre en sí. |
Path toPath() |
Devuelve un objeto Path que corresponde al objeto File actual. |
"¡Vaya! No es una lista muy pequeña, ¿eh? Y parece que puedes hacer mucho con ella: crear y eliminar archivos, cambiarles el nombre,..."
"Entonces, para obtener el directorio del archivo actual, ¿necesito llamar a getParent()?"
"Sí, pero devuelve una cadena, la ruta del archivo, no un objeto de archivo. En realidad, la clase de archivo duplica casi todos sus métodos: una versión devuelve una cadena, la otra, un objeto de archivo. Compruébalo:"
File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();
Si tiene una cadena con la ruta del archivo y necesita un objeto de archivo , use el constructor. Si la situación es la inversa (tiene un objeto de archivo pero necesita una cadena), use getAbsolutePath (). Por ejemplo:"
String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();
"Entiendo."
"Genial. Entonces aquí hay una pequeña tarea para ti: muestra los nombres de todos los archivos ubicados en el mismo directorio que el archivo actual".
"Nada podría ser más fácil. Aquí, mira:"
//Some file
File originalFile = new File("c:/path/dir2/a.txt");
//An object representing the directory
File folder = originalFile.getParentFile();
//Print the file list on screen
for (File file : folder.listFiles())
{
System.out.println(file.getName());
}
"Mmm. Correcto".
"Pero es un poco confuso que la misma clase, Archivo, se use tanto para el archivo como para el directorio. Eso no me parece muy lógico".
"Funcionó así por razones históricas. Un directorio solía ser un archivo especial 'vacío' en el disco. Por supuesto, ahora muchas cosas han cambiado, pero no todo. Eso es todo lo que tengo hoy".
"Gracias por la interesante lección, Bilaabo".
GO TO FULL VERSION