Abrir y leer archivos en Java es bastante fácil, ya que, Java trae en su librería io java.io.File
, la clase File para manejo de archivos con variados métodos que sirven para este fin.
Conociendo la clase File
La clase File
es simple de usar.
File file = new File("./ejemplo.txt"); /* Ahora tenemos acceso al archivo ejemplo.txt
*/
El parámetro que recibe el constructor corresponde a la ubicación del archivo, dependiendo del sistema operativo existen distinta forma de escribir la ubicación, por ej.
// windows
File file = new File("C:\\miPrograma\src\ejemplo.txt");
// linux/macos
File file = new File("./miPrograma/src/ejemplo.txt");
Esto es contrario a lo que Java propone, ya que Java es “platform independent”, pero en el ejemplo anterior si escribiéramos un programa para linux y otro para mac, tendríamos que escribir código especifico para cada sistema operativo. Para evitar esto, la clase File provee de un campo estático File.separator
, que dependiendo del sistema operativo en el que se ejecute el programa, cambiará su valor.
Otra forma de crear un “path” que sea compatible, es utilizar el segundo constructor de File
File file = new File("src", "ejemplo.txt");
De esta forma File, concatenará los argumentos con el separador especifico del sistema operativo.
Si el path al que queremos acceder es más complejo podemos crear un método que cree el path utilizando la variable File.separator
public static String buildPath(String... data) {
StringJoiner sj = new StringJoiner(File.separator);
for(String path: data) {
sj.add(path);
}
return sj.toString();
}
buildPath("src", "ejemplo.txt");
/* Retorna
windows: src\\ejemplo.txt
linux/mac: src/ejemplo.txt
*/
Accediendo a datos dentro del archivo
Para utilizar datos que se encuentren dentro del archivo al cual accedimos, podemos utilizar una instancia de java.util.Scanner
para leer el contenido.
/* ---ejemplo.txt---
lorem ipsum multatis fragatis
idomen datumatis colerte di caside
*/
File file = new File("ejemplo.txt");
Scanner sc = new Scanner(file);
System.out.println(sc.next()); // lorem
System.out.println(sc.nextLine()); // ipsum multatis fragatis
Se puede recorrer el contenido utilizando los métodos que posee la clase java.util.Scanner
, esto es bastante util (xd).
Ahora, si el archivo tiene datos que se puedan transformar a otros tipos de datos, ya sea, int
, double
, etc. Todos los métodos que posee Scanner
pueden ser utilizados.
Clase Paths
La clase Paths, es creada para solucionar algunos problemas que se encontraron los desarrolladores con la clase java.io.File
, esto se debe a algunas desventajas que tenía a la hora de usarse.
La clase java.nio.file.Paths
pertenece a un paquete distinto, y no comparte los mismos métodos que java.io.File
, ya que, los métodos de java.io.File
, se recrearon como métodos estáticos que existen en la clase java.nio.file.Files
, a los cuales se les debe pasar una variable de tipo Path
.
Cuidado!
No confundir la interfazPath
con la clasePaths
.
Path path = Paths.get("src/ejemplo.txt");
Files.exists(path); // true
Files.isDirectory(path) // false
También el método Paths.get
, permite pasar varios argumentos tipo string y en tiempo de ejecución dependiendo del tipo de sistema operativo, agregara el separador respectivo.
Path path = Paths.get("src", "ejemplo.txt");
path.toString(); /*
Esto retornaría:
windows: "src\ejemplo.txt"
linux/macos: "src/ejemplo.txt"
*/
Actualmente se recomienda utilizar
java.nio.file.Path
en vez dejava.io.File
para versiones superiores a Java 1.7.
Conclusión
Haciendo un repaso rápido, en el caso que necesitemos manipular archivos en Java, se recomienda utilizar
java.nio.file.Path
y los métodos de java.nio.file.Files
, en vez de java.io.File
.
Al utilizar Paths.get()
, no tendremos que preocuparnos por el separador especifico de cada sistema operativo ya que, el método se encarga de ello.
Paths
y Path
no son lo mismo.