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:
Path
: Esta é a interface que substitui a classejava.io.File
como representação de um arquivo ou diretório quando trabalhamos com Java NIO.- 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:
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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á
- 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á
- 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.
- getLastModifiedTime(Path path, Linkoption… options): Este método retorna o tempo da última modificação do arquivo a partir do caminho fornecido como
- getOwner(Path path, Linkoption… options): Este método retorna um UserPrincipal representando o proprietário do arquivo no caminho fornecido.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- tamanho(Caminho caminho): Este método retorna o tamanho do arquivo no caminho especificado em bytes.
- 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.
- 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.
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.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