Arquivos Java – Classe java.nio.file.Files

A classe Java Files foi introduzida no Java 1.7 e faz parte do pacote java.nio.file.

Classe Java Files

  • A classe Java Files contém métodos estáticos que operam em arquivos e diretórios.
  • Esta classe é utilizada para operações básicas em arquivos, como criar, ler, escrever, copiar e excluir arquivos ou diretórios do sistema de arquivos.

Antes de prosseguir, vamos dar uma olhada nos termos abaixo:

  1. Path: Esta é a interface que substitui a classe java.io.File como representação de um arquivo ou diretório quando trabalhamos com Java NIO.
  2. Paths: Esta classe contém um método estático para criar uma instância de Path.

java.nio.file.Path interface é como a antiga classe java.io.File. Path representa a localização do arquivo e quando criamos um Path para um novo arquivo, ele não cria o arquivo real até que o criemos usando Files.createFile(Path filePath). Como podemos ver no diagrama acima, a classe Paths é usada para criar uma instância de Path e a classe Files usa a instância Path para trabalhar em um arquivo. Objetos File e Path sabem como se converter um ao outro, é assim que podemos usar código mais antigo para interagir com a nova utilidade Files.

Java IO vs NIO

Como Criar um Path

Podemos criar um objeto Path chamando o método Paths.get(String primeiro, String... mais) da classe Paths.

Path path1 = Paths.get("/tmp/file.txt"); // For UNIX

Path path2 = Paths.get("D:/data/file.txt"); // For Windows

Também podemos criar um objeto Path separando as partes do caminho no método Paths.get().

Path path1 = Paths.get("/tmp", "file.txt");

Path path2 = Paths.get("D:", "data", "file.txt");

Path path3 = Paths.get("D:/data", "file.txt") ;

Como podemos ver, podemos passar o nome da pasta e do arquivo no método Paths.get() separadamente.

Métodos de Arquivos Java

A classe Java NIO Files contém métodos estáticos que são usados para manipular arquivos e diretórios, e esses métodos na maioria das vezes trabalham com objetos Path. Vamos dar uma olhada nos métodos abaixo da classe Files:

  1. copy(InputStream in, Path target, CopyOption… options): Este método copia todos os bytes do fluxo de entrada especificado para o arquivo de destino especificado e retorna o número de bytes lidos ou escritos como um valor longo.
  2. copy(Path source, OutputStream out): Este método copia todos os bytes do arquivo de origem especificado para o fluxo de saída fornecido e retorna o número de bytes lidos ou escritos como um valor longo.
  3. copy(Path source, Path target, CopyOption… options): Este método copia o arquivo de origem fornecido para o arquivo de destino especificado e retorna o caminho do arquivo de destino.
  4. createDirectories(Path dir, FileAttribute<?>… attrs): Este método cria diretórios usando o caminho fornecido, criando todos os diretórios pai inexistentes primeiro. Este método não lançará uma exceção se o diretório não puder ser criado porque ele já existe. FileAttribute é um parâmetro opcional para definir automaticamente ao criar os diretórios inexistentes e retorna o caminho do diretório criado.
  5. createDirectory(Path dir, FileAttribute<?>… attrs): Este método cria um diretório usando o caminho fornecido. Se o diretório for criado com sucesso, ele retornará o caminho do diretório criado. Se o diretório já existir, lançará nio.file.FileAlreadyExistsException.
  6. createFile(Path path, FileAttribute<?>… attrs): Este método cria um novo arquivo vazio usando o caminho fornecido e retorna o caminho do arquivo recém-criado se for criado com sucesso. Se o arquivo já existir, lançará nio.file.FileAlreadyExistsException.
  7. createTempDirectory(Path dir, String prefix, FileAttribute<?>… attrs): Este método cria um diretório temporário usando o caminho fornecido e gera o nome do diretório usando o prefixo fornecido. Ele retornará o caminho do diretório temporário recém-criado.
  8. createTempDirectory(String prefix, FileAttribute<?>… attrs): Este método cria um diretório temporário no diretório de arquivos temporários padrão e gera o nome do diretório usando o prefixo fornecido. Ele retornará o caminho do diretório temporário recém-criado associado ao Sistema de Arquivos padrão.
  9. createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>… attrs): Este método cria um arquivo temporário no diretório especificado, gera o nome do arquivo usando o prefixo e o sufixo fornecidos, e retorna o caminho do arquivo recém-criado.
  10. createTempFile(String prefix, String suffix, FileAttribute<?>… attrs): Este método cria um arquivo temporário no diretório padrão de arquivos temporários e gera o nome do arquivo usando o prefixo e sufixo fornecidos, retornando o caminho do arquivo recém-criado.
  11. delete(Path path): Este é um método void que simplesmente exclui o arquivo do caminho especificado. Este método lança NoSuchFileException se o arquivo não existir no caminho especificado e se o arquivo for um diretório e não puder ser excluído porque não está vazio, nesse caso ele lançará
  12. deleteIfExists(Path path): Este método verifica se o arquivo existe antes de excluí-lo e retorna o valor booleano true se o arquivo no caminho especificado for excluído com sucesso e retorna false se o arquivo não existir no caminho fornecido. Se o arquivo for um diretório e não puder ser excluído porque não está vazio, nesse caso ele lançará
  13. exists(Path path): Este método verifica se o arquivo existe no caminho especificado e se o arquivo existir, ele retornará true, caso contrário, retornará false.
  14. getLastModifiedTime(Path path, Linkoption… options): Este método retorna o tempo da última modificação do arquivo a partir do caminho fornecido como
  15. getOwner(Path path, Linkoption… options): Este método retorna um UserPrincipal representando o proprietário do arquivo no caminho fornecido.
  16. isDirectory(Caminho caminho, Opção de link… opções): Este método verifica se o arquivo é um diretório a partir do caminho fornecido. Retorna verdadeiro se o arquivo for um diretório e falso se o arquivo não existir ou não for um diretório, ou se não for possível determinar se o arquivo é um diretório ou não.
  17. isExecutable(Caminho caminho): Este método verifica se o arquivo no caminho fornecido é executável ou não, e também verifica se o arquivo existe e se esta JVM tem privilégio apropriado para executar o arquivo. Retorna verdadeiro se o arquivo existir no caminho fornecido e for executável, e falso se o arquivo não existir, ou se a JVM não tiver privilégio suficiente para executar o arquivo, ou se o acesso não puder ser determinado.
  18. isHidden(Caminho caminho): Este método indica se o arquivo no caminho fornecido é considerado oculto ou não. A definição exata de oculto depende do sistema operacional ou do provedor. No caso do sistema UNIX, um arquivo é considerado oculto se o nome do arquivo começar com o caractere de período (‘.’). E no caso do WINDOWS, um arquivo é considerado oculto se não for um diretório e o atributo oculto do DOS estiver definido. Retorna verdadeiro se o arquivo no caminho fornecido for considerado oculto, caso contrário, retorna falso.
  19. isReadable(Caminho caminho): Este método testa se o arquivo no caminho fornecido é legível ou não. Retorna verdadeiro se o arquivo no caminho especificado existir e for legível, e falso se o arquivo não existir, ou se o acesso de leitura for negado porque a JVM não tem privilégio suficiente, ou se o acesso não puder ser determinado.
  20. isWritable(Caminho caminho): Este método testa se o arquivo no caminho especificado é gravável ou não. Retorna verdadeiro se o arquivo no caminho especificado existe e é gravável e falso se o arquivo não existe ou o acesso de escrita é negado porque o JVM não tem privilégios suficientes ou o acesso não pode ser determinado.
  21. mover(Caminho origem, Caminho destino, OpçãoCopia… opções): Este método move ou renomeia um arquivo de origem para o arquivo de destino e retorna o caminho do arquivo de destino. O parâmetro de opção pode incluir o seguinte: REPLACE_EXISTING: Significa que se o arquivo de destino existir, substitui-o se não for um diretório não vazio. ATOMIC_MOVE: Significa que a movimentação é realizada como uma operação atômica do sistema de arquivos e todas as outras opções são ignoradas. Este método lança FileAleadyExistsException se o arquivo de destino existir, mas não puder ser substituído porque a opção REPLACE_EXISTING não está especificada. Este método lança DirectoryNotEmptyException se a opção REPlACE_EXISTING for especificada, mas o arquivo não puder ser substituído porque é um diretório não vazio.
  22. novoBufferedReader(Caminho caminho, Charset cs): Este método abre um arquivo usando o caminho especificado para leitura, retornando um BufferedReader usado para ler texto do arquivo. Bytes do arquivo são decodificados em caracteres usando o conjunto de caracteres especificado.
  23. newBufferedWriter(Path path, Charset cs, Openoption… opções): Este método abre ou cria um arquivo usando o caminho fornecido para escrita, retornando um BufferedWriter que é usado para escrever texto no arquivo. O parâmetro de opções especifica como o arquivo é criado ou aberto. Se nenhuma opção for especificada, considera-se as opções CREATE, TRUNCATE_EXISTING e WRITE por padrão, o que significa que ele abre o arquivo para escrita e o cria se o arquivo não existir, ou trunca o arquivo existente para o tamanho de 0 se ele existir. Este método lança uma UnsupportedOperationException se uma opção não suportada for especificada.
  24. newByteChannel(Path path, OpenOption… opções): Este método cria ou abre o arquivo usando o caminho especificado, retornando um canal de bytes pesquisável para acessar o arquivo. Este método lança uma UnsupportedOperationException se uma opção não suportada for especificada.
  25. newDirectoryStream(Path path): Este método abre um diretório retornando um DirectoryStream para iterar sobre todas as entradas no diretório a partir do caminho especificado. Os elementos retornados pelo iterador do DirectoryStream são do tipo Path e cada um representa uma entrada no diretório. Este método lança uma NotDirectoryException se o arquivo no caminho especificado não puder ser aberto porque não é um diretório.
  26. newDirectoryStream(Path path, Filter<? super Path > filter): Este método abre um diretório retornando um DirectoryStream para iterar sobre todas as entradas no diretório a partir do caminho especificado. Os elementos retornados pelo iterador do DirectoryStream são do tipo Path e cada um representa uma entrada no diretório, sendo filtrados pelo filtro especificado. Este método lança NotDirectoryException se o arquivo no caminho fornecido não puder ser aberto porque não é um diretório.
  27. newDirectoryStream(Path path, String glob): Este método abre um diretório retornando um DirectoryStream para iterar sobre todas as entradas no diretório a partir do caminho especificado. Os elementos retornados pelo iterador do DirectoryStream são do tipo Path e cada um representa uma entrada no diretório, sendo filtrados pela correspondência da representação String de seus nomes de arquivo com o padrão de glob especificado. Este método lança NotDirectoryException se o arquivo no caminho fornecido não puder ser aberto porque não é um diretório, e PatternSyntaxException se o padrão for inválido.
  28. newInputStream(Path path, Openoption… options): Este método abre um arquivo retornando um fluxo de entrada para ler o arquivo a partir do caminho especificado. O parâmetro options determina como o arquivo é aberto e, se nenhuma opção for especificada, ele abre o arquivo com READ. Este método lança IllegalArgumentException se uma combinação inválida de opções for especificada e UnsupportedOperationException se uma opção não suportada for especificada.
  29. newOutputStream(Caminho caminho, OpçãoAberta… opções): Este método abre um arquivo retornando um fluxo de saída para escrever bytes no arquivo no caminho especificado. O parâmetro de opções determina como o arquivo é aberto e se nenhuma opção for especificada, considera as opções CREATE, TRUNCATE_EXISTING e WRITE por padrão, o que significa que abre o arquivo para escrita e cria se o arquivo não existir ou trunca o arquivo existente para o tamanho 0 se ele existir. Este método lança IllegalArgumentException se uma combinação inválida de opções for especificada e UnsupportedOperationException se uma opção não suportada for especificada.
  30. notExists(Caminho caminho, OpçãoLink opções): Este método testa se o arquivo no caminho especificado não existe. O parâmetro de opções é usado para indicar como os links simbólicos são tratados se o arquivo for um link simbólico. Por padrão, os links simbólicos são seguidos. Se a opção NOFOLLOW_LINK estiver presente, os links simbólicos não são seguidos. Este método retorna true se o arquivo não existir no caminho especificado e false se o arquivo existir ou se sua existência não puder ser determinada.
  31. readAllBytes(Caminho caminho): Este método lê todos os bytes do arquivo no caminho fornecido e retorna a matriz de bytes contendo os bytes lidos do arquivo.
  32. readAllLines(Caminho caminho, Charset cs): Este método lê todas as linhas do arquivo no caminho fornecido e retorna a Lista contendo as linhas do arquivo.
  33. tamanho(Caminho caminho): Este método retorna o tamanho do arquivo no caminho especificado em bytes.
  34. caminharÁrvoreDeArquivos(Caminho inicio, VisitanteDeArquivo<? Super Caminho> visitante): Este método é usado para percorrer o diretório. Ele percorre o diretório no caminho especificado recursivamente e retorna o arquivo inicial.
  35. escrever(Caminho caminho, byte[] bytes, OpçãoAberta… opções): Este método escreve bytes em um arquivo no caminho especificado. O parâmetro de opções especifica como o arquivo é criado ou aberto. Se nenhuma opção for especificada, então ele considera as opções CREAR, TRUNCAR_EXISTENTE e ESCREVER por padrão, o que significa que ele abre o arquivo para escrita e cria se o arquivo não existir ou trunca o arquivo existente para o tamanho 0 se ele existir. Todos os bytes no array de bytes são escritos no arquivo. Este método garante que o arquivo seja fechado quando todos os bytes forem escritos e retorna o caminho do arquivo escrito.

Criar Arquivo Usando a Classe Files

A classe Files fornece o método criarArquivo(Caminho caminhoDoArquivo, AtributoDeArquivo<?>… attrs) para criar um arquivo usando o Caminho especificado. Vamos dar uma olhada no programa de exemplo abaixo.

package com.journaldev.examples;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Create file using Files class
 * 
 * @author pankaj
 *
 */
public class FilesCreateFileExample {

	public static void main(String[] args) {
		
		//inicializar objeto Caminho
		Path path = Paths.get("D:/data/file.txt");
		//criar arquivo
		try {
			Path createdFilePath = Files.createFile(path);
			System.out.println("File Created at Path : "+createdFilePath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

A saída do programa acima é a seguinte:

File Created at Path : D:\data\file.txt

Criar Diretórios Usando a Classe Files

A classe Files fornece os métodos createDirectory(Path dir, FileAttribute<?>… attrs) e createDirectories(Path dir, FileAttribute<?>… attrs) para criar diretórios simples e de vários níveis usando o Path especificado. Vamos dar uma olhada no programa de exemplo abaixo.

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Create directories using Files class
 * 
 * @author pankaj
 *
 */
public class FilesCreateDirectoriesExample {

	public static void main(String[] args) {
		// inicializar objetos Path
		Path path1 = Paths.get("D:/pankaj");
		Path path2 = Paths.get("D:/pankaj/java7");
		Path path3 = Paths.get("D:/pankaj/java7/Files");
		
		try {
			Path createdDir1 = Files.createDirectory(path1);//first level directory
			Path createdDir2 = Files.createDirectory(path2);//second level directory
			Path createdDir3 = Files.createDirectory(path3);//all level directories
			System.out.println("First Level Directory Created at Path : "+createdDir1);
			System.out.println("Second Level Directory Created at Path : "+createdDir2);
			System.out.println("All Level Directories Created at Path : "+createdDir3);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

O resultado do programa acima é o seguinte:

First Level Directory Created at Path : D:\pankaj
Second Level Directory Created at Path : D:\pankaj\java7
All Level Directories Created at Path : D:\pankaj\java7\Files

Converter Arquivo para Path e Vice-Versa

Objetos File e Path podem ser convertidos um no outro usando os métodos abaixo:

File file = new File(“D:/data/file.txt”);

Path path = file.toPath();

File file1 = path.toFile();

Ler Dados de Arquivo usando a Classe Files

A classe Files fornece os seguintes métodos para ler arquivos.

  1. readAllBytes(Path path): Este método lê todos os bytes do arquivo no caminho fornecido e retorna o array de bytes contendo os bytes lidos do arquivo.
  2. readAllLines(Path path, Charset cs): Este método lê todas as linhas do arquivo no caminho fornecido e retorna a Lista contendo as linhas do arquivo.

Vamos dar uma olhada no programa de exemplo abaixo.

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * Java Files read file example
 * 
 * @author pankaj
 *
 */
public class FilesReadFileExample {

	public static void main(String[] args) {
		
		Path path = Paths.get("D:/data/file.txt");
		try {
			byte[] bs = Files.readAllBytes(path);
			List<String> strings = Files.readAllLines(path);
			
			System.out.println("Read bytes: \n"+new String(bs));
			System.out.println("Read lines: \n"+strings);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

A saída do programa acima é a seguinte:

Read bytes: 
Hello world
This is Read file example
Thank you
Read lines: 
[Hello world, This is Read file example, Thank you]

Copiar Arquivo usando a Classe Files

A classe Files fornece o método copy(Path source, Path target, CopyOption… options) que copia o arquivo de origem fornecido para o arquivo de destino especificado e retorna o caminho do arquivo de destino. Vamos dar uma olhada no programa de exemplo abaixo:

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * Java Files copy file example
 * 
 * @author pankaj
 *
 */
public class FilesCopyFileExample {

	public static void main(String[] args) {
		Path sourcePath = Paths.get("D:/data/sourceFile.txt");
		Path targetPath = Paths.get("D:/data/targetFile.txt");
		
		try {
			Path path = Files.copy(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//copy with REPLACE_EXISTING option
			System.out.println("Target file Path : "+path);
			System.out.println("Copied Content : \n"+new String(Files.readAllBytes(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

A saída do programa acima é a seguinte:

Target file Path : D:\data\targetFile.txt
Copied Content : 
Hello world
This is Copy file example
Thank you

Mover Arquivo usando a Classe Files

A classe Files do Java fornece o método move(Path source, Path target, CopyOption… options), que move ou renomeia um arquivo de origem para um arquivo de destino e retorna o caminho do arquivo de destino. O parâmetro de opção pode incluir o seguinte: REPLACE_EXISTING: Isso significa que se o arquivo de destino existir, ele será substituído se não for um diretório não vazio. ATOMIC_MOVE: Significa que a movimentação é realizada como uma operação atômica no sistema de arquivos, e todas as outras opções são ignoradas. Este método lança a exceção FileAleadyExistsException se o arquivo de destino existir, mas não puder ser substituído porque a opção REPLACE_EXISTING não foi especificada. Este método lança a exceção DirectoryNotEmptyException se a opção REPLACE_EXISTING for especificada, mas o arquivo não puder ser substituído porque é um diretório não vazio. Vamos dar uma olhada no exemplo de programa abaixo:

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * Java Files move file example
 * 
 * @author pankaj
 *
 */
public class FilesMoveFileExample {

	public static void main(String[] args) {
		Path sourcePath = Paths.get("D:/data/sourceFile.txt");
		Path targetPath = Paths.get("D:/data/targetFile.txt");
		try {
			Path path = Files.move(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//move with REPLACE_EXISTING option
			System.out.println("Target file Path : "+path);
			System.out.println("Moved Content : \n"+new String(Files.readAllBytes(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Escrever Arquivo usando a Classe Files

A classe Java NIO Files fornece o método write(Path path, byte[] bytes, OpenOption… options) que escreve bytes em um arquivo no caminho especificado. O parâmetro options especifica como o arquivo é criado ou aberto. Se nenhuma opção for especificada, então são consideradas as opções CREATE, TRUNCATE_EXISTING e WRITE por padrão. Isso significa que ele abre o arquivo para escrita e o cria se o arquivo não existir ou o trunca para o tamanho de 0 se ele existir. Todos os bytes no array de bytes são escritos no arquivo. Este método garante que o arquivo seja fechado quando todos os bytes tiverem sido escritos e retorna o caminho do arquivo escrito.

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Files write file example
 * 
 * @author pankaj
 *
 */
public class FilesWriteFileExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/data/test.txt");
		try {
			String str = "This is write file Example";
			byte[] bs = str.getBytes();
			Path writtenFilePath = Files.write(path, bs);
			System.out.println("Written content in file:\n"+ new String(Files.readAllBytes(writtenFilePath)));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Walk File Tree

A classe Files fornece o método walkFileTree(Path start, FileVisitor<? Super Path> visitor) que é usado para percorrer o diretório. Ele percorre o diretório no caminho especificado recursivamente e retorna o arquivo inicial.

package com.journaldev.examples;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

/**
 * Java Files walk file tree example
 * 
 * @author pankaj
 *
 */
public class FilesWalkFileTreeExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/pankaj");
		try {
			Files.walkFileTree(path, new FileVisitor<Path>() {

				@Override
				public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
					System.out.println("Post Visit Directory: "+dir);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
					System.out.println("Pre Visit Directory: "+dir);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
					System.out.println("Visit File: "+file);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
					System.out.println("Visit Failed File: "+file);
					return FileVisitResult.CONTINUE;
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

A saída do programa acima é a seguinte:

Pre Visit Directory: D:\pankaj
Pre Visit Directory: D:\pankaj\java6
Pre Visit Directory: D:\pankaj\java6\Files
Visit File: D:\pankaj\java6\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java6\Files
Post Visit Directory: D:\pankaj\java6
Pre Visit Directory: D:\pankaj\java7
Pre Visit Directory: D:\pankaj\java7\Files
Visit File: D:\pankaj\java7\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java7\Files
Post Visit Directory: D:\pankaj\java7
Pre Visit Directory: D:\pankaj\java8
Pre Visit Directory: D:\pankaj\java8\Files
Visit File: D:\pankaj\java8\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java8\Files
Post Visit Directory: D:\pankaj\java8
Post Visit Directory: D:\pankaj

Observe que todos os arquivos e pastas são processados recursivamente. Isso é muito útil quando você deseja fazer algum processamento comum em todos os arquivos, como renomear todos os arquivos em um diretório recursivamente. Isso é tudo para a classe Files do Java. Referência: API Doc

Source:
https://www.digitalocean.com/community/tutorials/java-files-nio-files-class