Existe uma versão legado da API para manipulação de arquivos java.io.File, mas é fortemente recomendada a utilização de java.nio.file (a classe File foi subdividia em três classes Path, Files e FileSystem)
utilizando os métodos toFile de Path e toPath de File é possível migrar entre a API antiga e a nova
A classe Path representa arquivos e diretórios; são objetos imutáveis
A classe Files possuí métodos para lidar com objetos Path
A classe FileSystem descreve os sistemas de arquivos disponíveis e suas propriedades:
acessar propriedades de arquivos
descobrir a raiz do sistema de arquivos
pegar o separador de nós do sistema (e.g. "/" ou "\")
Path
O método Path.of permite criar novos objetos Path
Podem representar um caminho absoluto ou relativo, podendo transitar entre um e outro
É possível criar Path's de caminhos inexistentes sem causar exceções até executar alguma ação sobre eles
Pode ser representado como uma sequência de elementos de um caminho
O método resolve gera um novo Path a partir de outro, de forma relativa
O método resolveSibling gera um novo Path a partir de outro, de forma relativa dentro do diretório atual
O método normalize retira caminhos auxiliares como . e .. (e.g. /users/joe/../pics/baby.jpg → /users/joe/pics/baby.jpg)
O método toRealPath garante que o caminho em Path existe
O método relativize gera um novo Path com o caminho relativo, a partir de outro Path
Files
Possibilita a navegação em objetos Path
O método list retorna uma Stream dos Path's no caminho dado como parâmetro
O método walk retorna uma Stream com todos Path's no caminho dado como parâmetro entrando em cada diretório até não haver mais subdiretórios
O método createSymbolicLink permite a criação de um link onde um caminho leva a outro
O método readSymbolicLink retorna o Path referenciado por um link criado com o createSymbolicLink
Existem diversos outros métodos auxiliares, como isDirectory, isExecutable, isHidden, isReadable, isWritable, isRegularFile, isSymbolicLink, isSameFile(um caminho pode ser representado de forma absoluta, relativa, como um link), probeContentType, ...
Existem métodos para criar Path's: createDirectory, createDirectories, createFile, createTempDirectory, createTempFile
pode ocorrer de arquivos temporários não serem automaticamente deletados. Por isso uma boa prática é utilizar o método deleteIfExists ao iniciar o programa
Métodos para copiar (copy) e mover (move) arquivos também existem
É possível ainda ler e alterar as propriedades de um Path
Não é possível deletar diretórios com conteúdo; deve-se deletar os arquivos no nível mais inferior da hierarquia antes de ir para os superiores
Lidar com Arquivos Zipados
As classes ZipInputStreams e ZipOutputStream possibilitam leitura e escrita de arquivos zip
Exemplo de como lidar com compressão de arquivos zip
Representando um arquivo zip como um sistema de arquivos