CodeGym /Cursos /JAVA 25 SELF /Obtendo e alterando atributos de arquivos

Obtendo e alterando atributos de arquivos

JAVA 25 SELF
Nível 39 , Lição 4
Disponível

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?
creationTime()
Data e hora de criação do arquivo/pasta
lastModifiedTime()
Data e hora da última modificação
lastAccessTime()
Data e hora do último acesso
size()
Tamanho do arquivo (em bytes)
isDirectory()
É um diretório?
isRegularFile()
É um arquivo regular?
isSymbolicLink()
É 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).

1
Pesquisa/teste
Trabalho com sistema de arquivos, nível 39, lição 4
Indisponível
Trabalho com sistema de arquivos
Trabalho com sistema de arquivos
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION