Pular para o conteúdo principal

NIO.2 do Java 7: uma nova API do Java para file system

Uma das novidades mais importantes e aguardadas do Java 7 foi a NIO.2, a nova API para a manipulação I/O com Java. A NIO.2, também conhecida como JSR 203, disponibiliza um conjunto de novos componentes, projetados para melhorar caracterísiticas de I/O com Java como por exemplo: uma nova API para o acesso e manipulação de conteúdo do file system (sistema de arquivos); outra API para operações assíncronas com I/O; e a atualização da API para comunicação via sockets (channel sockets). 

O Java, antes da versão 7, tratava a manipulação do sistema de arquivos de forma primitiva. O programador tinha de trabalhar com a classe File para representar arquivos e/ou diretórios, com um número escasso de funcionalidades. Uma operação simples como copiar um arquivo demandava um código relativamente grande. Outras funcionalidades triviais, como por exemplo o uso de links simbólicos, não eram suportadas. Esses são alguns dos motivos para justificar o uso de bibliotecas terceiras, com funcionalidades complementares a API I/O do Java, durante o desenvolvimento de um sistema. 

API para o sistema de arquivos
No novo pacote java.nio.file estam contidos boa parte dos componentes da API para a manipulação do sistema de arquivos. Um dos pontos de partida para essa nova API é a interface Path. Ela representa o caminho hierárquico do file system de um diretório ou arquivo. Essa classe possui métodos para recuperar informações do caminho do arquivo, acessar outro elemento na estrutura hierárquica ou converter uma estrutura de diretórios.  

É possível criar um objeto Path de várias formas, uma dela é através da classe Paths (plural), uma classe helper com métodos estáticos especificos para a criação de objetos Path. O trecho de código a seguir demonstra como criar e utilizar objetos da classe Path, representando o caminho para o arquivo logo.png.
Path logo = Paths.get("/home/yaw/logo.png"); //passa o caminho completo
Path logo2 = Paths.get("/home", "yaw", "logo.png"); //outra forma

System.out.println(logo.equals(logo2));
System.out.format("%s é igual a %s? %b%n", logo, logo2, logo.equals(logo2));
System.out.format("Nome do arquivo: %s%n", logo.getFileName());
System.out.format("Qtde de elementos no path: %d%n", logo.getNameCount());
System.out.format("Volume: %s%n", logo.getRoot());
System.out.format("1o diretório: %s%n", logo.getName(0));
System.out.format("Pedaço do path (1o e 2o dir): %s%n", logo.subpath(0, 2));
System.out.format("Diretório do arquivo: %s%n", logo.getParent());
Outra opção seria criar o Path a partir do FileSystem. A classe abstrata FileSystem provê uma representação do sistema de arquivos, com funcionalidades para criar ou acessar elementos nessa estrutura. Mas para recuperar um objeto do tipo FileSystem, precisamos de outra classe helper: FileSystems (plural novamente) que atua como um fábrica desses objetos. A seguir o trecho de código com essa estratégia:
FileSystem fileSystem = FileSystems.getDefault(); //recupera o File System
Path logo3 = fileSystem.getPath("/home/yaw/logo.png"); //cria o Path
O método resolve é util para criar um Path a partir de outro Path, respeitando a hierarquia. Veja um exemplo:
Path home = Paths.get("/home/yaw"); //diretorio home
Path logo4 = home.resolve("logo.png"); //arquivo dentro do diretorio
System.out.format("Arquivo: %s%n", logo4.toAbsolutePath());

Backup com NIO.2
Já conhecemos os componentes que representam o sistema de arquivos e o path para um arquivo ou diretório. O próximo passo é manipular os arquivos! Para isso precisamos da classe Files, uma classe helper composta por métodos que operam sobre arquivos e/ou diretórios. A seguir o trecho de código que realiza a cópia de um arquivo:
Path home = Paths.get("/home/yaw");
Path txt = home.resolve("instrucoes.txt");
Path backup = home.resolve("instrucoes.txt.backup");

//caso exista, substitui
Files.copy(txt, backup, StandardCopyOption.REPLACE_EXISTING);
System.out.format("A cópia foi criada? %s%n", Files.exists(backup));
O método copy recebe o caminho do arquivo origem e destino para reliazar a cópia. Caso o arquivo de backup já exista ele será substítuido. Agora se o arquivo de origem não existir o método lança uma IOException. Repare que para trabalhar com os métodos da classe Files, devemos tratar IOException. Seguindo no exemplo do backup, o trecho de código a seguir move o arquivo cópia para outro diretório:
Path dirDestino = Paths.get("/home/yaw/backup");
if (Files.exists(backup)) {
    Files.move(backup, dirDestino.resolve(backup.getFileName()));
}
Nos dois últimos exemplos utilizo o método exists de Files, para verificar se o arquivo realmente existe no sistema de arquivos.

Links simbólicos
A partir do Java 7 é possível criar e utilizar links simbólicos com API de I/O, através da classe Files. O próximo trecho de código demonstra como criar um link para um determinado arquivo e como verificar se o arquivo é um link.
Path alvo = Paths.get("/home/yaw/inicializacao_v1.sh");
Path link = Paths.get("/home/yaw/scripts/inicializacao.sh");

//cria o link
Files.createSymbolicLink(link, alvo);

Path f = Paths.get("/home/yaw/scripts/inicializacao.sh");

//verifica se o path eh um link
if (Files.isSymbolicLink(f)) {
  System.out.format("'%s' é link de '%s'%n", f, Files.readSymbolicLink(f));
}
Listar o conteúdo do diretório
Outra vantangem dessa API são as várias opções para consultar o conteúdo de um diretório. É possível realizar consultas simples, com filtro na extensão do arquivo, e avançadas navegando recursivamente na estrutura de diretórios.

A interface DirectoryStream nos permite iterar nos elementos contidos dentro de um diretório. A classe Files fornece várias versões do método newDirectoryStream, uma delas utilizamos a seguir indicando o filtro pela extensão jpg:

Path dir = Paths.get("/home/yaw");
String filtro = "*.jpg";

DirectoryStream<Path> stream = Files.newDirectoryStream(dir, filtro);

//iterator com os elementos da pasta
for (Path p : stream) {
  System.out.println("\t" + p);
}
Com a interface SimpleFileVisitor, que implementa o pattern Visitor, é possível criar um mecanismo mais inteligente para percorrer o conteúdo de um diretório. O método walkFileTree, da classe Files, utiliza o SimpleFileVisitor aplicado um dado diretório. Veja um exemplo dessa estratégia nessa url.

Leitura e escrita de arquivos
Outra novidade são os métodos para leitura e escrita de arquivos compactos, pequenos. Esses métodos podem ser utilizados para escrever ou ler em formato binário (bytes) ou texto (string). Veja um exemplo que lê e escreve texto:
Path txt = Paths.get("/home/yaw/instrucoes.txt");
List<String> linhas = Files.readAllLines(txt, Charset.defaultCharset());
for (String l: linhas) {
  System.out.format("%s%n",l);
}

linhas.add("novo conteudo para o arquivo texto...");
Files.write(txt, linhas, Charset.defaultCharset());
O método readAllLines retorna uma lista com todas as linhas contidas no arquivo. Repare que não foi necessário escrever código para fechar o arquivo, isso quem faz é o próprio médodo. O mesmo aconcete com o método write, logo após escrever o conteúdo ele fecha o arquivo.

Propriedades
A interface BasicFileAttributes foi criada para resgatar atributos básicos de um arquivo dentro do sistema de arquivos. Veja um exemplo de como recuperar propriedades básicas de um arquivo/diretório:
BasicFileAttributes info = Files.readAttributes(txt, BasicFileAttributes.class);

System.out.format("Data de criação: %s%n", info.creationTime());
System.out.format("Último acesso: %s%n", info.lastAccessTime());
System.out.format("Última modificação: %s%n", info.lastModifiedTime());
System.out.format("É um diretorio: %s%n", info.isDirectory());
System.out.format("Tamanho: %s bytes%n", info.size());

O código demonstrado nesse post e outros exemplos estam disponíveis no github. fique a vontade para visualizar, copiar e modificar!

O Java 7 disponibiliza outros recursos, esses links complementam o aprendizado e as novidades da linguagem:

[]s
Eder Magalhães
www.yaw.com.br
twitter.com/youandwe
twitter.com/edermag

Comentários

André Valenti disse…
Muito bom o post! E muito boa a nova API também. Gostei principalmente da nova maneira de ler linhas de e escrever linhas em arquivo. Ficou quase tão compacto quanto Python!
Yara Senger disse…
Ótimo post! Valeu!
markblog disse…
Muy buen aporte!!

Postagens mais visitadas deste blog

Você já pensou em ser palestrante em algum evento ?

Você já deve ter participado de algum evento e pensado como deve ser legal ser palestrante... E para falar a verdade, é muito bom mesmo. Eu adoro, o Vinicius adora e conheço muitas pessoas que curtem cada minuto da participação no evento como palestrante. Com certeza é uma responsabilidade a mais. Você sente medo, adrenalina, tem que se preparar. Literalmente coloca a cara a tapa para qualquer pessoa te avaliar em todos os sentidos. Qual o seu tom de voz?  Seus slides são legais? Você manja mesmo ?  Seu português está ok?  E as palavras em inglês ?  Teve algum deslize técnico? E MUITO mais.  Mas é claro que a exposição tem dois lados... e os resultados podem ser ótimos. Normalmente conhecemos mais pessoas como palestrantes e podem surgir boas oportunidades de negócio. É sempre positivo ter uma nova referência positiva quando as pessoas buscam nosso nome no Google, podemos fazer a diferença para quem está assistindo a palestra e muito mais.  No The Developer's

TDC INNOVATION lança University Pass

Modalidade de ingresso tem como objetivo ajudar na capacitação dos universitários Uma pesquisa realizada em 2020 pela Associação Brasileira das Empresas de Tecnologia da Informação e Comunicação (Brasscom) diz que até o ano de 2024 o Brasil precisará de cerca de 420 mil profissionais na área de Tecnologia da Informação. Porém, por ano, a mesma pesquisa diz que o país forma apenas 46 mil profissionais capacitados no nicho. Pensando nisso, para ajudar na formação e capacitação desses jovens profissionais, o TDC INNOVATION, segunda edição do ano do The Developer's Conference, lança o University Pass, modalidade de ingresso que possibilita aceso digital gratuito a todas as palestras do evento, ou com 50% de desconto para quem preferir ir pessoalmente. Com o tema central “Desafios para a criação do futuro Digital”, o TDC INNOVATION ocorrerá entre 1 e 3 de junho, de forma híbrida: presencialmente no Centro de Convenções CentroSul, em Florianópolis, e com transmissão simultaneamente pela

TDC ONLINE: SUA PLATAFORMA DE PALESTRAS GRAVADAS DO TDC DISPONÍVEL

Além do conteúdo ao vivo transmitido online nas edições do TDC, agora você pode ter acesso à centenas de palestras gravadas, através da nossa nova plataforma de vídeos - o TDC Online, que reúne todas as Trilhas premium, Stadium e Salas dos Patrocinadores das edições anteriores de 2022, TDC Innovation e TDC Connections.  Para acessar, basta clicar na edição em que você participou ( TDC Innovation ou TDC Connections ); Fazer o mesmo login (com e-mail e senha) cadastrados na hora de adquirir ou resgatar o seu ingresso no TDC; E clicar na Trilha de sua opção, e de acordo com a modalidade do seu ingresso. Logo em seguida, você será direcionado para a seguinte página com a lista de todas as palestras por Trilha: Pronto! Agora você tem acesso à centenas de palestras gravadas da sua área de interesse, para assistir como e quando quiser! Caso tenha esquecido a senha, clique na opção "Esqueci a senha" , insira o e-mail que você realizou para o cadastro no evento, e aparecerá a op

Entendendo como funciona a programação de computadores: linguagens de programação, lógica, banco de dados

Nesse post, diferente dos últimos que foram mais enfáticos nas experiências com tecnologias, vou focar um pouco mais nos profissionais que estão começando, ou pretendem ingressar na área de desenvolvimento de software, falando sobre conceitos fundamentais relacionados a programação em geral . Mercado de trabalho para programação Conforme já sabemos, o mercado de desenvolvimento de software, especialmente no Brasil, continua em franca expansão, sendo que cada vez mais as empresas buscam desenvolver seus próprios sistemas usando as mais diferentes e novas tecnologias. Algumas matérias interessantes: As seis profissões mais valorizadas em 2010 no IDG Now! Muitas vagas e sensação de reaquecimento da economia Por isso, a área de desenvolvimento de software tem despertado interesse em muitos profissionais de outras áreas que desejam mudar de profissão, já que as oportunidades de trabalho tendem a ser maiores. Esse é um perfil presente em muitos dos clientes da Globalcode que acabou m

Segurança da informação no alvo: o que esperar do futuro?

A segurança da informação não se trata apenas de proteger os dados contra acesso não autorizado. Na prática, refere-se aos recursos que impedem: uso; registro; inspeção; divulgação; interrupção; modificação; destruição de dados. O uso de dados pode abranger desde um perfil nas redes sociais a detalhes financeiros, biometrias ou novos projetos. Por isso, a preocupação com a proteção dos dados é crescente, tanto para empresas quanto clientes. Para muitas pessoas, a coleta de dados é considerada invasão de privacidade, criando desconfiança do titular dos dados, pois o uso dos dados pode ser facilmente corrompido, utilizado para fins não declarados. Apesar de o uso dos dados terem impulsionado os avanços tecnológicos na última década, as organizações lidam com o desafio de distinguir dados de informações pessoais de modo a proteger a privacidade e as preferências dos clientes. Neste artigo, abordaremos o impacto da segurança da informação e o que esperar do futuro. Confira casos conhecido

TDC Digital: o que você precisa saber para transformar sua carreira em 2022

O TDC Digital é o maior evento de TI do mercado e proporciona crescimento profissional a partir de palestras com especialistas e oportunidades de networking com o mundo todo, direto da sua casa. Através da escolha individual de cada participante é possível obter experiências imersivas e transformadoras conforme o tema-chave de cada trilha.  O evento também é o lugar ideal para ajudar no desenvolvimento de carreiras, permitindo que qualquer pessoa com vontade — e um tema interessante — seja palestrante e compartilhe suas experiências e conhecimentos. Para aqueles que querem  participar como ouvinte a plataforma do TDC favorece conferências dinâmicas, e o encontro de diversas comunidades e ecossistemas de TI. E, após a escolha de uma trilha, fica mais fácil acompanhar especialistas para aprender e se inspirar. Em 2021, o The Developer’s Conference (TDC) foi 100% digital e, em três dias de evento, contou com mais de 300 horas de conteúdos , incluindo: Agile; Testes; Design; Web e Mobile;