Java e o uso do sistema de ficheiros do S.O

De MediaWiki
Ir a la navegación Ir a la búsqueda

Java e o uso do sistema de ficheiros

Profundizaremos a continuación con algúns exemplos de operacións habituais para programar o acceso ó sistema de ficheiros do sistema operativo.

Creando un ficheiro

Podemos crear un ficheiro baleiro cos atributos que desexemos co método:

  • createFile(Path, FileAttribute<?>)

Se non se especifican atríbutos, será creado con atríbutos por defecto. E de xa existir o ficheiro indicado na ruta, lanzarase unha excepción.

O seguinte código crea un ficheiro con atributos por defecto:

 1 Path file = ...;
 2 try {
 3     // Create the empty file with default permissions, etc.
 4     Files.createFile(file);
 5 } catch (FileAlreadyExistsException x) {
 6     System.err.format("O ficheiro chamado  %s" +  " xa existe%n", file);
 7 } catch (IOException x) {
 8     // Outro tipo de fallo, coma os relacionados con permisos.
 9     System.err.format("createFile da erro: %s%n", x);
10 }

Outra posibilidade para crear un ficheiro e empregrando os métodos de newOutputStream; será suficiente con abrir un fluxo de saída e pechalo para que quede creado un ficheiro baleiro. Podes atopar información na documentación.

Creando un directorio

Pódese facer usando o método: createDirectory(Path, FileAttribute<?>)

Se non se especifica ningún atributo, terá os que correspondan por defecto.

Un exemplo: Path dir = ...; Files.createDirectory(path);

E outro exemplo con permisos específicos nun sistema de ficheiros POSIX: Set<PosixFilePermission> perms =

   PosixFilePermissions.fromString("rwxr-x---");

FileAttribute<Set<PosixFilePermission>> attr =

   PosixFilePermissions.asFileAttribute(perms);

Files.createDirectory(file, attr);

Mostrando o contido dun directorio Pódese facer usando o método:

newDirectoryStream(Path) 

Este método devolve un obxecto que implementa a interfaz DirectoryStream, que a súa vez implementa Iterable.

Recorda que o devolto DirectoryStream é un fluxo, e que se non o chamas desde un try-with-resources debes pechar o fluxo no bloque finally block-

A continuación un exemplo que amosa os contidos dun directorio:

 1 Path dir = ...;
 2 try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
 3     for (Path file: stream) {
 4         System.out.println(file.getFileName());
 5     }
 6 } catch (IOException | DirectoryIteratorException x) {
 7     // IOException nunca será lazanda pola iteracion neste exemplo
 8     // so pode ser lanzado por newDirectoryStream.
 9     System.err.println(x);
10 }

Borrando un ficheiro, enlace simbólico ou directorio

Debes ter en conta que para borrar un directorio éste non debe ter contido, ou a operación de borrado fallará. Cando o que se borra é un enlace simbólico, o destino do enlace non será borrado.

A clase File facilita dous métoodos para o borrado.

O método delete(Path) → borra o ficheiro ou lanza unha expección se a operación falla (por exemplo, non existe a excepción ou non se gozan dos permisos requiridos.

Por exemplo:

 1 try {
 2     Files.delete(path);
 3 } catch (NoSuchFileException x) {
 4     System.err.format("%s: no such" + " file or directory%n", path);
 5 } catch (DirectoryNotEmptyException x) {
 6     System.err.format("%s not empty%n", path);
 7 } catch (IOException x) {
 8     // File permission problems are caught here.
 9     System.err.println(x);
10 }

O método deleteIfExists(Path) → a diferencia do anterior, non lanzará excepción se o ficheiro non existe (o cal pode ser útil cando se traballa con varios fíos).

Copiando un ficheiro ou directorio

Para copiar un ficheiro ou directorio existe o método:

copy(Path, Path, CopyOption...) 

A copia falla se o destino existe agás a opción REPLACE_EXISTING se atope específicada.

Os directorios poden ser copiados, pero debese ter en contacta que os ficheiros contidos na ruta orixe non o serán: o novo directorio sempre será creado baleiro.

O seguinte código exemplifica o funcionamento do método copy (recorda que será preciso importar o paquete con import static java.nio.file.StandardCopyOption.*;):

1 Files.copy(orixe, destino, REPLACE_EXISTING);

Existen outros métodos da clase Files que permiten facer a copia entre un ficheiro e un fluxo:

  • copy(InputStream, Path, CopyOptions… → todos os bytes dun dun fluxo de entrada a un ficheiro
  • copy(Path, OutputStream) → todos os bytes dun ficheiro a un fluxo de saída

Movendo un ficheiro ou directorio

É posible mover un ficheiro e directorio usando move(Path, Path, CopyOption...)

1 Files.move(source, target, REPLACE_EXISTING);

Neste exemplo empregouse a opción REPLACE_EXISTING que sobreescribe de xa existir na ruta de destino o ficheiro ou directorio

Outras operacións

Explicaronse algunhas das operacións máis comúns no uso de Java en relación co sistema de ficheiros. Con todo, a lista non é exhaustiva. Deixanse como enlaces para a comprensión estudo do programador interesado os seguintes: