Java e o uso do sistema de ficheiros do S.O
Sumario
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:
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);
}
Outra posibilidade para crear un ficheiro e empregrando os métodos de newOutputStream methods; 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:
- Atopando ficheiros → https://docs.oracle.com/javase/tutorial/essential/io/find.html
- Vixiliando cambios nun directorio → https://docs.oracle.com/javase/tutorial/essential/io/notification.html
- Determinando o tipo MIME → https://docs.oracle.com/javase/tutorial/essential/io/misc.html#mime
- Coñecendo o seperador de ficheiros do sistema (/ ou \) → https://docs.oracle.com/javase/tutorial/essential/io/misc.html#separator