Diferencia entre revisiones de «A clase File»

De MediaWiki
Ir a la navegación Ir a la búsqueda
(Página creada con «= A clase File = Utilizaremos a versión de Java JDK 17, unha versión LTS (long term support, con soporte a largo prazo). Podes consultar a documentación dea biblioteca…»)
 
 
(No se muestran 3 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
= A clase File =
 
= A clase File =
−
Utilizaremos a versión de Java JDK 17, unha versión LTS (long term support, con soporte a largo prazo).  
+
Utilizaremos a versión de Java JDK 17, unha versión LTS (''long term support'', con soporte a largo prazo).  
  
−
Podes consultar a documentación dea biblioteca estándar de clases en https://docs.oracle.com/en/java/javase/17/ .
+
Podes consultar a [https://docs.oracle.com/en/java/javase/17/ documentación dea biblioteca estándar de clases].
  
−
En concreto as clases que permiten traballar con ficheiros están no paquete java.io, onde na ***documentación premendo sole el atoparás a lista de interfaces e clases que contén o paquete.
+
En concreto as clases que permiten traballar con ficheiros están no [https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/File.html paquete java.io], onde na documentación atoparás a lista de interfaces e clases que contén o paquete.
  
−
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/File.html
+
O máis relevante pódes atopalo a continuación.
  
−
O máis relevante pódes atopalo a continuación:
+
Os constructores:
−
Constructores
+
* File(String ruta)
−
File(String ruta)
+
* File(String ruta, String nombre)
−
File(String ruta, String nombre)
+
* File(File directorio, String nombre)
−
File(File directorio, String nombre)
 
−
Métodos
 
−
canRead() e canWrite() : comproba se o ficheiro se pode ler/escribir
 
−
delete(): borra o ficheiro
 
−
getPath(): devuelve a ruta do ficheiro
 
−
mkdir(): crea un directorio coa ruta do obxecto que o recibe
 
−
isDirectory() comproba se o ficheiro é un directorio
 
  
−
Podes atopar na coñecida web de referencia w3schools exemplos explicativos con código de manexo de ficheiros con estes métodos:
+
Os métodos:
−
https://www.w3schools.com/java/java_files.asp  
+
* canRead() e canWrite() : comproba se o ficheiro se pode ler/escribir
 +
* delete(): borra o ficheiro
 +
* getPath(): devuelve a ruta do ficheiro
 +
* mkdir(): crea un directorio coa ruta do obxecto que o recibe
 +
* isDirectory() comproba se o ficheiro é un directorio
 +
 
 +
Podes atopar na coñecida web de referencia [https://www.w3schools.com/java/java_files.asp w3schools exemplos explicativos] con código de manexo de ficheiros con estes métodos.
  
 
Con todo, dende Java SE 7, existe un xeito mellor de xestionar os ficheiros: java.nio.
 
Con todo, dende Java SE 7, existe un xeito mellor de xestionar os ficheiros: java.nio.
  
−
Entón, se existe unha forma máis axeitada de xestionar os ficheiros en Java… por qué aprendemos a utilizar esta? Porque debido o enorme número de aplicacións que usan a antigua API (o que se chame legacy), Oracle non ten plan de eliminar ou desaconsellar o seu uso nas vindeiras versións de Java. E por iso, porque podes atopar un montón de código en funcionamento o que lle tes que dar mantemento (ou facer migración), e que non vai desaparecer de xeito inminente, e bo coñecer esta API
+
Entón, se existe unha forma máis axeitada de xestionar os ficheiros en Java... por qué aprendemos a utilizar esta? Porque debido o enorme número de aplicacións que usan a antigua API (o que se chama ''legacy''), Oracle non ten plan de eliminar ou desaconsellar o seu uso nas vindeiras versións de Java. E por iso, porque podes atopar un montón de código en funcionamento o que lle tes que dar mantemento (ou facer migración), e que non vai desaparecer de xeito inminente, e bo coñecer esta API
  
 
Exercicio: adaptar copia de ficheiros para uso de excepcións
 
Exercicio: adaptar copia de ficheiros para uso de excepcións
Línea 32: Línea 31:
 
java.nio para xestión de ficheiros e directorios
 
java.nio para xestión de ficheiros e directorios
 
Agora que xa coñecemos esta nova posibilidade de traballar con ficheiros, que permite contar con toda a funcionalidade que se acadaba antes, indagaremos sobre qué melloras trae e como traballar coa nova API..
 
Agora que xa coñecemos esta nova posibilidade de traballar con ficheiros, que permite contar con toda a funcionalidade que se acadaba antes, indagaremos sobre qué melloras trae e como traballar coa nova API..
−
Melloras de java.nio
+
 
 +
== Melloras de java.nio ==
 
Cales son esas melloras na xestión? Por unha banda, permite facer unha mellor xestión de erros.
 
Cales son esas melloras na xestión? Por unha banda, permite facer unha mellor xestión de erros.
  
Línea 39: Línea 39:
 
  boolean result = file.delete();
 
  boolean result = file.delete();
  
−
Compila e pode funcionar mais no caso de fallar… cómo saberemos se é porque o ficheiro non existe, ou é porque non temos permisos para borrar?
+
Compila e pode funcionar mais no caso de fallar... cómo saberemos se é porque o ficheiro non existe, ou é porque non temos permisos para borrar?
  
 
Rescribindo o código coa nova NIO2 API:
 
Rescribindo o código coa nova NIO2 API:
Línea 131: Línea 131:
 
  Path canonicalPath = path.toRealPath().normalize();
 
  Path canonicalPath = path.toRealPath().normalize();
 
   
 
   
−
Explicación.  While the Path object is immutable, it returns a new instance. Moreover, the NIO2 API has the toRealPath() and normalize() methods that we can use to remove redundancies.
+
Explicación.  O obxecto Path e inmutable, e devolve unha nova instancia. A API NIO2 ten os métodos toRealPath() e normalize() que podemos usar para eliminar redundancias.
  
 
Exercicio para amosar os contidos dun directorio
 
Exercicio para amosar os contidos dun directorio
Línea 147: Línea 147:
  
 
Exercicio 10_1 e pedir recursividade
 
Exercicio 10_1 e pedir recursividade
−
 
 
−
 
−
BBB
 
−
 
−
B
 

Revisión actual del 15:57 28 feb 2022

A clase File

Utilizaremos a versión de Java JDK 17, unha versión LTS (long term support, con soporte a largo prazo).

Podes consultar a documentación dea biblioteca estándar de clases.

En concreto as clases que permiten traballar con ficheiros están no paquete java.io, onde na documentación atoparás a lista de interfaces e clases que contén o paquete.

O máis relevante pódes atopalo a continuación.

Os constructores:

  • File(String ruta)
  • File(String ruta, String nombre)
  • File(File directorio, String nombre)

Os métodos:

  • canRead() e canWrite() : comproba se o ficheiro se pode ler/escribir
  • delete(): borra o ficheiro
  • getPath(): devuelve a ruta do ficheiro
  • mkdir(): crea un directorio coa ruta do obxecto que o recibe
  • isDirectory() comproba se o ficheiro é un directorio

Podes atopar na coñecida web de referencia w3schools exemplos explicativos con código de manexo de ficheiros con estes métodos.

Con todo, dende Java SE 7, existe un xeito mellor de xestionar os ficheiros: java.nio.

Entón, se existe unha forma máis axeitada de xestionar os ficheiros en Java... por qué aprendemos a utilizar esta? Porque debido o enorme número de aplicacións que usan a antigua API (o que se chama legacy), Oracle non ten plan de eliminar ou desaconsellar o seu uso nas vindeiras versións de Java. E por iso, porque podes atopar un montón de código en funcionamento o que lle tes que dar mantemento (ou facer migración), e que non vai desaparecer de xeito inminente, e bo coñecer esta API

Exercicio: adaptar copia de ficheiros para uso de excepcións

Exercicio de ampliación: serialización de obxectos java.nio para xestión de ficheiros e directorios Agora que xa coñecemos esta nova posibilidade de traballar con ficheiros, que permite contar con toda a funcionalidade que se acadaba antes, indagaremos sobre qué melloras trae e como traballar coa nova API..

Melloras de java.nio

Cales son esas melloras na xestión? Por unha banda, permite facer unha mellor xestión de erros.

Poñamos este código de exemplo

File file = new File("probas/titorial.txt");
boolean result = file.delete();

Compila e pode funcionar mais no caso de fallar... cómo saberemos se é porque o ficheiro non existe, ou é porque non temos permisos para borrar?

Rescribindo o código coa nova NIO2 API:

Path path = Paths.get("probas/titorial.txt");
Files.delete(path);

Agora será preciso xestionar unha IOException, que dará os detalles de que foi o que aconteceu (por exemplo, non ter permisos de borrado).

A nova versión tamén mellora o soporte ós metadatos e trae melloras de rendemento evitando problemas de insuficiencia de memoria.

Diferencias con file e como facer uso de java.nio A primeira diferencia que salta rápido a vista dun programador é o cambio no nome do paquete e da clase (observables en letra grosa os cambios):

java.io.File file = new java.io.File("probas/titorial.txt");
java.nio.file.Path path = java.nio.file.Paths.get("probas/titorial.txt");

Antes construíamos un obxecto file via o construtor; agora obteremos un Path usando un método static (get).

Podemos obter o mesmo resultado encadeando o método resolve: Path outroXeitoPath = Paths.get("probas").resolve("titorial.txt");

Finalmente, é posibel convertir obxectos entre APIs:

Path pathFromFile = file.toPath();
File fileFromPath = path.toFile();

Both APIs deliver methods to manage files and directories. We'll demonstrate this using the previously created instance objects.

Para crear files usaremos os métodos createNewFile() e Files.createFile():

boolean result = file.createNewFile();
Path newPath = Files.createFile(path);

Para crear un directorio, mkdir() ou Files.createDirectory():

boolean result = file.mkdir();
File newPath = Files.createDirectory(path);

Hai variantes para incluir subdirectorios que non existan con mkdirs() e Files.createDirectories():

boolean result = file.mkdirs();
File newPath = Files.createDirectories(path);

Para renomear ou mover un ficheiro, precisamos crear outra instancia do obxecto e usar renameTo() ou Files.move():

boolean result = file.renameTo(new File("baeldung/tutorial2.txt"));
Path newPath = Files.move(path, Paths.get("baeldung/tutorial2.txt"));

Finalmente para borrar, usaremos delete() ou Files.delete():

boolean result = file.delete();
Files.delete(Paths.get(path));

Lembra que os métodos legacy devolven un flag cun result set a falso en caso de erro; e os métodos NIO2 devolve unha instancia de Path instance (agás a operación de borrado que lanza unha IOException en caso de erro).

Exercicio para indagar sobre metadatos Sabemos cómo consultar se un file existe con java.io e java.nio API // java.io API boolean fileExists = file.exists();

// java.nio API boolean pathExists = Files.exists(path);

Cal sería o código para saber se o indicado no path é u ficheiro? E se é posible escribir no mesmo? Amosa o código para as dúas apis:

Solución // java.io API boolean fileIsFile = file.isFile(); boolean fileWritable = file.canWrite();

// java.nio API boolean pathIsFile = Files.isRegularFile(path); boolean pathWritable = Files.isWritable(path); https://www.baeldung.com/java-path-vs-file

Exercicio para indagar sobre rutas (absoluta e canónica) Consulta a ruta canónica é absoluta dun ficheiro (o que ti escollas). Amosa o código para as dúas APIs.:

Solución // java.io API

String absolutePathStr = file.getAbsolutePath();
String canonicalPathStr = file.getCanonicalPath();

// java.nio API

Path absolutePath = path.toAbsolutePath();
Path canonicalPath = path.toRealPath().normalize();

Exercicio para indagar sobre rutas (absoluta e canónica) Consulta a ruta canónica é absoluta dun ficheiro (o que ti escollas). Amosa o código para as dúas APIs.:

Solución // java.io API

String absolutePathStr = file.getAbsolutePath();
String canonicalPathStr = file.getCanonicalPath();

// java.nio API

Path absolutePath = path.toAbsolutePath();
Path canonicalPath = path.toRealPath().normalize();

Explicación. O obxecto Path e inmutable, e devolve unha nova instancia. A API NIO2 ten os métodos toRealPath() e normalize() que podemos usar para eliminar redundancias.

Exercicio para amosar os contidos dun directorio Amosa o contido do directorio da túa elección

Solución

// java.io API
String[] list = file.list();
File[] files = file.listFiles();
// java.nio API
DirectoryStream<Path> paths = Files.newDirectoryStream(path);

A API NIO2 devolve o seu propio obxecto DirectoryStream object, que implementa a interface iterable.

Exercicio 10_1 e pedir recursividade