1. Leitura de atributos básicos: BasicFileAttributes
Quando falamos de um arquivo ou pasta, não nos referimos apenas ao nome ou tamanho. Cada arquivo tem um “passaporte” — um conjunto de atributos que contém:
- Data e hora de criação
- Data e hora da última modificação
- Data e hora do último acesso
- Tamanho
- Permissões de acesso (quem pode ler, escrever, executar)
- Informações do proprietário (em Unix)
- Atributos “oculto”, “somente leitura” e outros
Em Java, há uma API prática e poderosa no pacote java.nio.file.attribute para trabalhar com esses atributos. Não é preciso escrever código dependente de plataforma: tudo o que você precisa está na biblioteca padrão.
Para começar — vamos importar as classes necessárias:
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
Como obter os atributos básicos de um arquivo?
Use o método Files.readAttributes:
Path path = Paths.get("example.txt");
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("Criado: " + attrs.creationTime());
System.out.println("Modificado: " + attrs.lastModifiedTime());
System.out.println("Último acesso: " + attrs.lastAccessTime());
System.out.println("Tamanho: " + attrs.size());
System.out.println("É um diretório? " + attrs.isDirectory());
System.out.println("É um arquivo? " + attrs.isRegularFile());
System.out.println("É um link simbólico? " + attrs.isSymbolicLink());
} catch (IOException e) {
System.out.println("Erro ao ler atributos: " + e.getMessage());
}
Imagine que você é um inspetor e veio verificar um apartamento. Você não apenas olha se há uma porta (o arquivo existe), mas também pergunta aos moradores: “Quando o prédio foi construído? Quando foi a última reforma? Quem é o proprietário?”.
Resumo das propriedades de BasicFileAttributes
| Propriedade | O que retorna? |
|---|---|
|
Data e hora de criação do arquivo/pasta |
|
Data e hora da última modificação |
|
Data e hora do último acesso |
|
Tamanho do arquivo (em bytes) |
|
É um diretório? |
|
É um arquivo regular? |
|
É um link simbólico? |
2. Atributos avançados: POSIX e DOS
Atributos POSIX (Linux, macOS e outros sistemas tipo Unix)
Se você estiver em um sistema Unix, é possível obter informações avançadas: permissões de acesso, proprietário e grupo.
try {
PosixFileAttributes posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
System.out.println("Proprietário: " + posixAttrs.owner().getName());
System.out.println("Grupo: " + posixAttrs.group().getName());
System.out.println("Permissões: " + PosixFilePermissions.toString(posixAttrs.permissions()));
} catch (UnsupportedOperationException e) {
System.out.println("Atributos POSIX não são suportados neste SO.");
} catch (IOException e) {
System.out.println("Erro ao ler atributos POSIX: " + e.getMessage());
}
Observação: No Windows, esse código lançará UnsupportedOperationException — e isso é normal.
Atributos DOS (Windows)
No Windows é possível trabalhar com os flags “somente leitura”, “oculto”, “arquivado” e “de sistema”:
try {
DosFileAttributes dosAttrs = Files.readAttributes(path, DosFileAttributes.class);
System.out.println("Oculto: " + dosAttrs.isHidden());
System.out.println("Somente leitura: " + dosAttrs.isReadOnly());
System.out.println("De sistema: " + dosAttrs.isSystem());
System.out.println("Arquivado: " + dosAttrs.isArchive());
} catch (UnsupportedOperationException e) {
System.out.println("Atributos DOS não são suportados neste SO.");
} catch (IOException e) {
System.out.println("Erro ao ler atributos DOS: " + e.getMessage());
}
3. Alterando atributos de arquivos
Ler o “passaporte” de alguém é uma coisa, mas alterar a data de nascimento ou o sobrenome é outra! Em Java, podemos alterar atributos de arquivos (claro, com as permissões necessárias).
Alterar o horário da última modificação
import java.nio.file.attribute.FileTime;
Path file = Paths.get("example.txt");
try {
FileTime newTime = FileTime.fromMillis(System.currentTimeMillis() - 24 * 60 * 60 * 1000); // menos 1 dia
Files.setLastModifiedTime(file, newTime);
System.out.println("Horário da última modificação alterado!");
} catch (IOException e) {
System.out.println("Erro ao alterar o horário: " + e.getMessage());
}
Alterar permissões de acesso (POSIX)
Apenas para sistemas Unix! Por exemplo, tornar o arquivo executável para todos:
try {
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-xr-x");
Files.setPosixFilePermissions(file, perms);
System.out.println("Permissões alteradas!");
} catch (UnsupportedOperationException e) {
System.out.println("Permissões POSIX não são suportadas neste SO.");
} catch (IOException e) {
System.out.println("Erro ao alterar permissões: " + e.getMessage());
}
Explicação para a string "rwxr-xr-x":
- r — read (leitura)
- w — write (escrita)
- x — execute (execução)
- O primeiro bloco de 3 caracteres — proprietário; o segundo — grupo; o terceiro — outros.
Alterar o status de oculto/somente leitura (atributos DOS, Windows)
Tornar o arquivo oculto:
try {
Files.setAttribute(file, "dos:hidden", true);
System.out.println("O arquivo ficou oculto (Windows)!");
} catch (UnsupportedOperationException e) {
System.out.println("Atributos DOS não são suportados neste SO.");
} catch (IOException e) {
System.out.println("Erro ao alterar o atributo: " + e.getMessage());
}
Tornar o arquivo “somente leitura”:
try {
Files.setAttribute(file, "dos:readonly", true);
System.out.println("O arquivo agora é somente leitura (Windows)!");
} catch (UnsupportedOperationException e) {
System.out.println("Atributos DOS não são suportados neste SO.");
} catch (IOException e) {
System.out.println("Erro ao alterar o atributo: " + e.getMessage());
}
4. Verificando permissões de acesso
Às vezes é importante verificar rapidamente se é possível abrir o arquivo para leitura, escrita ou execução:
Path file = Paths.get("example.txt");
System.out.println("Leitura permitida: " + Files.isReadable(file));
System.out.println("Gravação permitida: " + Files.isWritable(file));
System.out.println("Execução permitida: " + Files.isExecutable(file));
Isso funciona da mesma forma em todas as plataformas, embora o comportamento real dependa do SO e das configurações de segurança.
5. Prática: exibindo informações detalhadas sobre um arquivo
Vamos escrever um miniaplicativo que, dado um caminho de arquivo, mostre o máximo de informações possível e tente alterar alguns atributos.
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.Set;
import java.io.IOException;
public class FileAttributesDemo {
public static void main(String[] args) throws IOException {
Path path = Paths.get("example.txt");
if (!Files.exists(path)) {
System.out.println("Arquivo não encontrado!");
return;
}
// Atributos básicos
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("Nome: " + path.getFileName());
System.out.println("Caminho: " + path.toAbsolutePath());
System.out.println("Tamanho: " + attrs.size() + " bytes");
System.out.println("Criado: " + attrs.creationTime());
System.out.println("Modificado: " + attrs.lastModifiedTime());
System.out.println("Último acesso: " + attrs.lastAccessTime());
System.out.println("É um diretório? " + attrs.isDirectory());
System.out.println("É um arquivo? " + attrs.isRegularFile());
// Verificação de permissões de acesso
System.out.println("Leitura permitida: " + Files.isReadable(path));
System.out.println("Gravação permitida: " + Files.isWritable(path));
System.out.println("Execução permitida: " + Files.isExecutable(path));
// Vamos tentar atualizar o horário de modificação
FileTime now = FileTime.fromMillis(System.currentTimeMillis());
Files.setLastModifiedTime(path, now);
System.out.println("Horário da última modificação atualizado!");
// Vamos tentar tornar o arquivo oculto (se for suportado)
try {
Files.setAttribute(path, "dos:hidden", true);
System.out.println("O arquivo ficou oculto (se o SO suportar).");
} catch (UnsupportedOperationException e) {
System.out.println("Arquivos ocultos não são suportados neste SO.");
}
// Vamos tentar exibir permissões POSIX (se for suportado)
try {
PosixFileAttributes posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
System.out.println("Proprietário: " + posixAttrs.owner().getName());
System.out.println("Permissões: " + PosixFilePermissions.toString(posixAttrs.permissions()));
} catch (UnsupportedOperationException e) {
System.out.println("Atributos POSIX não são suportados neste SO.");
}
}
}
6. Dicas úteis
Diferenças multiplataforma e dicas
- Nem todos os atributos estão disponíveis em todos os SO! No Windows não há permissões POSIX; no Linux não há atributos DOS.
- Sempre use try-catch! Os métodos podem lançar UnsupportedOperationException ou IOException.
- Permissões não são sempre apenas “rwx”! No Windows, o modelo de permissões é diferente; “somente leitura” pode ser definido pela política de segurança do SO.
- Arquivo oculto é um conceito relativo. No Unix, um arquivo é oculto se o nome começar com ponto (.hidden); no Windows, se o atributo dos:hidden estiver definido.
Tabela: quais atributos estão disponíveis onde
| Atributo | Windows (dos:*) | Linux/macOS (posix:*) |
|---|---|---|
| Data de criação | + | + |
| Data da última modificação | + | + |
| Data do último acesso | + | + |
| Arquivo oculto | + | Apenas nome com ponto |
| Somente leitura | + | + |
| Permissões (rwx) | - | + |
| Proprietário, grupo | - | + |
| Arquivado, de sistema | + | - |
7. Erros comuns ao trabalhar com atributos de arquivos
Erro nº 1: tentar ler ou alterar atributos POSIX no Windows. No Windows, você receberá UnsupportedOperationException. Sempre trate essa exceção ao escrever código multiplataforma.
Erro nº 2: alterar o horário de modificação de um arquivo que está aberto por outro processo. Em alguns sistemas, o arquivo pode estar bloqueado e a operação falhará.
Erro nº 3: esperar que a operação “ocultar arquivo” funcione da mesma forma em todos os SO. No Unix, um arquivo é oculto se começar com ponto (.gitignore); no Windows, se o atributo dos:hidden estiver definido. Não confunda essas abordagens.
Erro nº 4: ignorar a verificação de existência do arquivo antes da operação. Se o arquivo não existir, você receberá NoSuchFileException ao tentar obter ou alterar atributos.
Erro nº 5: não verificar as permissões de acesso. Se o usuário não tiver permissões para alterar atributos, a operação falhará. Antes de fazer alterações, verifique Files.isWritable(path).
GO TO FULL VERSION