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: <syntaxhighlight lang="java" line enclose="div" highlight="" > Path file = ...; try {

   // Create the empty file with default permissions, etc.
   Files.createFile(file);

} catch (FileAlreadyExistsException x) {

   System.err.format("O ficheiro chamado  %s" +  " xa existe%n", file);

} catch (IOException x) {

   // Outro tipo de fallo, coma os relacionados con permisos.
   System.err.format("createFile da erro: %s%n", x);

} <syntaxhighlight>

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 documetación https://docs.oracle.com/javase/tutorial/essential/io/file.html#createStream].

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:

Path dir = ...; try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {

   for (Path file: stream) {
       System.out.println(file.getFileName());
   }

} catch (IOException | DirectoryIteratorException x) {

   // IOException nunca será lazanda pola iteracion neste exemplo
   // so pode ser lanzado por newDirectoryStream.
   System.err.println(x);

}

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 try {

   Files.delete(path);

} catch (NoSuchFileException x) {

   System.err.format("%s: no such" + " file or directory%n", path);

} catch (DirectoryNotEmptyException x) {

   System.err.format("%s not empty%n", path);

} catch (IOException x) {

   // File permission problems are caught here.
   System.err.println(x);

}

O método deleteIfExists(Path) → a direferencia 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.*;): 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...) 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: