Skip to main content

Command Palette

Search for a command to run...

A classe file do Java

Published
5 min read
A classe file do Java
A

My name is Lucas. I'm a journalist and software developer who can take photos, print zines and make videos, that's no joke. 📸📰🎬💻🕺😅

A classe File fornece uma API muito clara para processar arquivos e diretórios em diferentes plataformas.

É comum que um programa precise processar e armazenar dados localizados fora do código-fonte: configurações, conjuntos de dados para processamento, registros de execução e assim por diante. A maneira mais simples de armazenar dados é usar arquivos. Arquivos são suportados por todos os sistemas operacionais modernos. Um arquivo pode ser considerado uma coleção de dados armazenada em um disco ou outro dispositivo que pode ser manipulada como uma unidade quando acessada pelo seu nome. Os arquivos podem ser organizados em diretórios que funcionam como pastas para outros arquivos e diretórios.

Neste tópico, aprenderemos como trabalhar com arquivos diretamente de um programa Java.

A classe File

Existe uma classe chamada File no pacote java.io. Um objeto dessa classe pode representar um arquivo, um diretório existente ou inexistente. Desse modo, a classe `File` pode ser usada para manipular arquivos e diretórios: criar, remover, acessar propriedades e muito mais.

A maneira mais simples de criar um objeto de arquivo é passar um caminho em formato String para o seu construtor. O formato válido dessa String depende do sistema operacional:

  • O Windows usa barras invertidas para caminhos ( '\'),

  • Linux, OS X, Android e outros sistemas do tipo UNIX usam a barra para frente ( '/').

Você deve ter essa diferença em mente ao trabalhar com arquivos.

Se o seu sistema operacional for Windows, não se esqueça de usar o caractere de escape '\'.

Vamos criar dois objetos da classe File para plataformas diferentes:

File fileOnUnix = new File("/home/username/Documents");    // a directory on a UNIX-like system
File fileOnWin = new File("D:\\Materials\\java-materials.pdf"); // a file on WindowsExplique o código

O código funcionará mesmo que um arquivo ou diretório não exista de fato no seu sistema de arquivos. Ele não cria um novo arquivo ou diretório. Ele apenas representa um arquivo ou diretório "virtual" que já existe ou que poderá ser criado no futuro.

Para exibir o caractere que separa o caminho de um arquivo, no seu caso, você pode imprimir o seguinte:

System.out.println(File.separator); // '/' - for Linux

Os objetos da classe File são imutáveis; ou seja, uma vez criado, o caminho abstrato representado por um objeto nunca mudará.

Caminho relativo e absoluto

Um caminho é absoluto se ele começa com o elemento raiz do sistema de arquivos. Ele contém todas as informações sobre a localização do arquivo, incluindo o tipo de sistema operacional.

É considerada uma má prática localizar um arquivo usando seu caminho absoluto dentro de seus programas, pois isso impede a reutilização do programa em diferentes plataformas. Outro problema é que não é possível transferir o arquivo com o diretório especificado; será necessário alterar o código que acessa o arquivo.

Um caminho relativo é um caminho que não inclui o elemento raiz do sistema de arquivos. Ele sempre começa no seu diretório de trabalho, representado por um ponto (.). Um caminho relativo não está completo e precisa ser combinado com o caminho do diretório atual para alcançar o arquivo desejado.

Aqui está um exemplo com um arquivo dentro do diretório de imagens que está no seu diretório de trabalho:

File fileOnUnix = new File("./images/picture.jpg");
File fileOnWin = new File(".\\images\\picture.jpg");

Como você pode ver, ambos os caminhos são exatamente iguais, o que garante independência de plataforma. Curiosamente, o caractere de ponto pode ser omitido, então o caminho images/picture.jpgtambém está correto.

Para criar programas independentes de plataforma, é uma convenção comum usar caminhos relativos sempre que possível. Você também pode transferir o diretório de trabalho que contém os arquivos images/picture.jpgsem precisar modificar o código.

Para acessar o diretório pai, basta digitar ..(dois pontos). Portanto, ../picture.jpg é um arquivo localizado no diretório pai do diretório de trabalho.

Métodos básicos

Uma instância de File possui uma lista de métodos. Veja alguns deles:

  • String getPath() - Retorna o caminho em formato de string para este arquivo ou diretório;

  • String getName() - Retorna o nome deste arquivo ou diretório (apenas o último nome do caminho).

  • boolean isDirectory() - Retorna true se for um diretório e existir, caso contrário, retorna false;

  • boolean isFile() - Retorna verdadeiro true se for um arquivo que existe (não um diretório), caso contrário, retorna falso.

  • boolean exists() - Retorna truese este arquivo ou diretório realmente existe no seu sistema de arquivos; caso contrário, retorna false;

  • String getParent() - Retorna o caminho em formato de string para o diretório pai que contém este arquivo ou diretório.

A lista não está completa, mas por agora, vamos nos concentrar nestes. Para outros métodos, consulte a documentação do Java: https://docs.oracle.com/javase/7/docs/api/java/io/File.html

Vamos criar uma instância de um arquivo existente e imprimir algumas informações sobre ele.

File file = new File("/home/username/Documents/javamaterials.pdf");

System.out.println("File name: " + file.getName());
System.out.println("File path: " + file.getPath());
System.out.println("Is file: " + file.isFile());
System.out.println("Is directory: " + file.isDirectory());
System.out.println("Exists: " + file.exists());
System.out.println("Parent path: " + file.getParent());Explique o código

Como esperado, o código imprime o seguinte:

File name: javamaterials.pdf
File path: /home/username/Documents/javamaterials.pdf
Is file: true
Is directory: false
Exists: true
Parent path: /home/username/DocumentsExplique o código

Suponha agora que temos uma instância que representa um arquivo inexistente e imprime os detalhes sobre ele:

File name: javamaterials1.pdf
File path: /home/art/Documents/javamaterials1.pdf
Is file: false
Is directory: false
Exists: false
Parent path: /home/art/DocumentsExplique o código

O arquivo não existe, portanto, o aplicativo não sabe qual é o seu tipo.

Existe também um grupo de métodos canRead(), canWrite(), canExecute() para testar se o aplicativo pode ler, modificar ou executar o arquivo indicado pelo caminho. Recomenda-se o uso desses métodos; caso contrário, você poderá encontrar erros de acesso a arquivos quando o usuário não tiver permissões suficientes para realizar uma operação com o arquivo.