1. Filesaula

classe de arquivos

Para trabalhar com arquivos, existe uma classe de utilitário inteligente — java.nio.file.Files. Tem métodos para cada ocasião. Todos os métodos desta classe são estáticos e operam no objeto Path. Existem muitos métodos, portanto, consideraremos apenas os mais importantes:

Método Descrição
Path createFile(Path path)
Cria um novo arquivo cujo caminho épath
Path createDirectory(Path path)
Cria um novo diretório
Path createDirectories(Path path)
Cria vários diretórios
Path createTempFile(prefix, suffix)
Cria um arquivo temporário
Path createTempDirectory(prefix)
Cria um diretório temporário
void delete(Path path)
Exclui um arquivo ou diretório se estiver vazio
Path copy(Path src, Path dest)
Copia um arquivo
Path move(Path src, Path dest)
Move um arquivo
boolean isDirectory(Path path)
Verifica se o caminho é um diretório e não um arquivo
boolean isRegularFile(Path path)
Verifica se o caminho é um arquivo e não um diretório
boolean exists(Path path)
Verifica se existe um objeto no caminho especificado
long size(Path path)
Retorna o tamanho do arquivo
byte[] readAllBytes(Path path)
Retorna todo o conteúdo de um arquivo como uma matriz de bytes
String readString(Path path)
Retorna todo o conteúdo de um arquivo como uma string
List<String> readAllLines(Path path)
Retorna todo o conteúdo de um arquivo como uma lista de strings
Path write(Path path, byte[])
Grava uma matriz de bytes em um arquivo
Path writeString(Path path, String str)
Grava uma string em um arquivo
DirectoryStream<Path> newDirectoryStream(Path dir)
Retorna uma coleção de arquivos (e subdiretórios) do diretório fornecido

2. Criando arquivos e diretórios

Arquivos e diretórios são muito fáceis de criar. Vamos nos convencer com alguns exemplos:

Código Observação
Files.createFile(Path.of("c:\\readme.txt"));
Cria um arquivo
Files.createDirectory(Path.of("c:\\test"));
Cria um diretório
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
Cria um diretório e todos os subdiretórios necessários, caso não existam.

3. Copiar, mover e deletar

Copiar, mover e excluir arquivos é igualmente fácil. Isso também se aplica a diretórios, mas eles devem estar vazios.

Código Observação
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
Copia um arquivo
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
Move e renomeia um arquivo
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
Exclui um arquivo

4. Verificando o tipo e a existência de um arquivo

Quando você tem um caminho fornecido por outra pessoa, deseja saber se é um arquivo ou um diretório. E, em geral, esse arquivo/diretório existe ou não?

Existem métodos especiais para isso também. Você também pode descobrir facilmente o comprimento de um arquivo:

Código Observação
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
 Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. Trabalhando com o conteúdo do arquivo

Finalmente, há toda uma série de métodos que facilitam a leitura ou gravação do conteúdo de um arquivo. Exemplo:

Código Descrição
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

Leia o conteúdo do arquivo como uma lista de strings.

Exibir as cordas


6. Obtendo o conteúdo de um diretório

O método mais interessante ainda permanece. É usado para obter arquivos e subdiretórios em um determinado diretório.

Estamos falando do newDirectoryStream()método, que retorna um DirectoryStream<Path>objeto especial. Ele possui um iterador (!) que você pode usar para obter todos os arquivos e subdiretórios de um determinado diretório.

Isto é mais facil do que parece.

Código Descrição
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


Obter um objeto com uma lista de arquivos
Percorrer a lista de arquivos

O DirectoryStream<Path>objeto tem duas propriedades. Primeiramente, ele possui um iterador que retorna caminhos de arquivo, e podemos utilizar este objeto dentro de um for-eachloop.

Em segundo lugar, esse objeto é um fluxo de dados, portanto, deve ser fechado explicitamente usando o close()método ou o uso declarado dentro de um try-with-resourcesbloco.



7. Files.newInputStreammétodo

A partir do Java 5, as classes FileInputStreame FileOutputStreamforam descontinuadas. Uma de suas desvantagens era que, quando os objetos dessas classes são criados, os arquivos são criados imediatamente no disco. E todas as exceções relacionadas à criação de arquivo podem ser lançadas.

Mais tarde, isso foi reconhecido como não sendo a melhor decisão. Assim, é recomendável usar os métodos da java.nio.Filesclasse utilitária para criar objetos de arquivo.

Aqui está uma comparação entre a abordagem antiga e a nova abordagem para criar arquivos:

Antes
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
Depois
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

E há uma substituição semelhante para FileOutputStream:

Antes
String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
Depois
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );