1. Pathaula

Se você quiser escrever um programa que faça algo com arquivos em disco, isso é muito fácil. Java tem muitas classes que ajudam você a trabalhar com os próprios arquivos e seus conteúdos.

As primeiras versões do Java usavam classes como Filee FileInputStreampara trabalhar com arquivos. No entanto, a Fileclasse agora está obsoleta e não é recomendada para uso. Claro, você ainda pode encontrá-lo no código, parâmetros de método ou construtores de classe.

Desde o início, começaremos a aprender como trabalhar com arquivos usando a Pathclasse. Pathé a classe que substituiu File. É mais seguro e eficiente.

Pathaula

Tecnicamente, Pathnão é uma classe — é uma interface. Isso é feito para permitir a escrita de um descendente da Pathclasse para cada sistema operacional (e sistema de arquivos).

O Windows tem um padrão para escrever caminhos de arquivo e o Linux tem outro. Claro, existem muitos outros sistemas operacionais no mundo e cada um tem seu próprio padrão.

É por isso que a Pathinterface é usada em todos os métodos que trabalham com arquivos, embora na realidade o trabalho seja feito por meio de suas classes descendentes: WindowsPath, UnixPath, ...

Criando um Pathobjeto

Para criar um Pathobjeto (que na verdade será um objeto da WindowsPathclasse descendente), você precisa usar uma declaração como esta:

Path name = Path.of(path);

Onde nameé o nome de uma Pathvariável e pathé o caminho para o arquivo (ou diretório), incluindo o nome do arquivo (ou diretório). E ofé um método estático da Pathclasse.

O of()método é usado para criar WindowsPathobjetos se o programa estiver sendo executado no Windows. Se o programa for executado no Linux, os UnixPathobjetos serão criados. Você não pode criar um Pathobjeto usando código como .new Path()

Exemplos:

Código Observação
Path file = Path.of("c:\\projects\\note.txt");
Caminho para o arquivo
Path directory = Path.of("c:\\projects\\");
Caminho para o diretório

O arquivo (ou diretório) não precisa existir para que um Pathobjeto válido exista. Talvez você queira apenas criar um arquivo... Um Pathobjeto é como uma sopa String: ele não está vinculado a um arquivo específico no disco — apenas armazena um determinado caminho no disco. É isso.


2. Métodos do Pathtipo

A Pathinterface tem alguns métodos interessantes. Os mais interessantes são apresentados na tabela abaixo.

Método Descrição
Path getParent()
Retorna o diretório pai
Path getFileName()
Retorna o nome do arquivo sem o diretório
Path getRoot()
Retorna o diretório raiz de um caminho
boolean isAbsolute()
Verifica se o caminho atual é absoluto
Path toAbsolutePath()
Converte o caminho para absoluto
Path normalize()
Remove curingas em um nome de diretório.
Path resolve(Path other)
Constrói um novo caminho absoluto a partir de caminhos absolutos e relativos.
Path relativize(Path other)
Obtém um caminho relativo de dois caminhos absolutos.
boolean startsWith(Path other)
Verifica se o caminho atual começa com um determinado caminho
boolean endsWith(Path other)
Verifica se o caminho atual termina com um determinado caminho
int getNameCount()
Divide o caminho em partes usando /como delimitador.
Retorna o número de peças.
Path getName(int index)
Divide o caminho em partes usando /como delimitador.
Retorna uma parte por seu índice.
Path subpath(int beginIndex, int endIndex)
Divide o caminho em partes usando /como delimitador.
Retorna o subcaminho que corresponde ao intervalo fornecido.
File toFile()
Converte um Pathobjeto em um Fileobjeto obsoleto
URI toUri()
Converte um Pathobjeto em um URIobjeto

Abaixo está uma breve descrição dos métodos existentes.


3. Dividindo um caminho em partes

O getParent()método retorna o caminho que aponta para o diretório pai do caminho atual. Independentemente de este caminho ser um diretório ou um arquivo:

Código Valor
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getParent();
"c:\\windows\\projects\\"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getParent();
"c:\\windows\\"
String str = "c:\\";
Path path = Path.of(str).getParent();
null

O getFileName()método retorna um único nome de arquivo (ou diretório) — o que vier depois do último delimitador:

Código Valor
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getFileName();
"note.txt"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getFileName();
"projects"
String str = "c:\\";
Path path = Path.of(str).getFileName();
null

O getRoot()método retorna o caminho para o diretório raiz:

Código Valor
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4. Caminhos absolutos e relativos

Existem dois tipos de caminhos: absolutos e relativos. Um caminho absoluto começa no diretório raiz. Para Windows, pode ser a c:\pasta; para Linux — o /diretório

Um caminho relativo é significativo em relação a algum diretório. Ou seja, é como o fim da estrada, mas sem o começo. Você pode transformar um caminho relativo em um caminho absoluto e vice-versa

boolean isAbsolute()método

O método verifica se o caminho atual é absoluto

Código Valor
String str = "c:\\windows\\projects\\note.txt";
boolean abs = Path.of(str).isAbsolute();
true
String str = "src\\com\\codegym\\Main.java";
boolean abs = Path.of(str).isAbsolute();
false

Path toAbsolutePath()método

Converte o caminho em absoluto. Se necessário, adicione o diretório de trabalho atual a ele:

Código Valor
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).toAbsolutePath();
"c:\\windows\\projects\\note.txt"
String str = "src\\com\\codegym\\Main.java";
Path path = Path.of(str).toAbsolutePath();
"d:\\work\\src\\com\\codegym\\Main.java"

Path normalize()método

No caminho, em vez de um nome de diretório, você pode escrever "..", o que significa voltar um diretório . A normalização elimina essas coisas. Exemplos:

Código Valor
String str = "c:\\windows\\..\\projects\\note.txt";
Path path = Path.of(str).normalize();
"c:\\projects\\note.txt"
String str = "src\\com\\codegym\\..\\Main.java";
Path path = Path.of(str).normalize();
"src\\com\\Main.java"

Path relativize(Path other)método

O relativize()método permite construir as "diferenças entre caminhos": um caminho relativo a outro

Código Valor
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.relativize(path1);
"projects\\note.txt"
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.relativize(path2);
"..\\.."
Path path1 = Path.of("c:\\aaa\\bbb\\1.txt");
Path path2 = Path.of("d:\\zzz\\y.jpg");
Path result = path1.relativize(path2);
Exceção de argumento ilegal:
os dois caminhos têm uma "raiz" diferente (discos diferentes)

Path resolve(Path other)método

O resolve()método faz o contrário de relativize(): ele constrói um novo caminho absoluto a partir de um caminho absoluto e um relativo.

Código Valor
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.resolve(path2);
"c:\\windows"
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.resolve(path1);
"c:\\windows\\projects\\note.txt"

toFile()método

O método retorna um objeto obsoleto Fileque armazena o mesmo caminho de arquivo que o Pathobjeto.

toURI()método

O método converte o caminho em um URI padrão e retorna um objeto que contém o caminho para o arquivo:

Caminho para o arquivo URI para o arquivo
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt