Java NIO.2: Mais uma API para I/O?

41
Java NIO.2: Mais uma API para I/O? UMA RÁPIDA INTRODUÇÃO Francisco Oliveira OzJUG - 2016

Transcript of Java NIO.2: Mais uma API para I/O?

Page 1: Java NIO.2: Mais uma API para I/O?

Java NIO.2: Mais uma API para I/O?UMA RÁPIDA INTRODUÇÃO

Francisco OliveiraOzJUG - 2016

Page 2: Java NIO.2: Mais uma API para I/O?
Page 3: Java NIO.2: Mais uma API para I/O?

Who am I?Analista de Sistemas

● Iron Mountain do BrasilTecnólogo em Análise e Desenvolvimento de Sistemas

● Fatec IpirangaSocial

[email protected]● @delley_fx● facebook.com/delley.fx● github.com/delley

Page 4: Java NIO.2: Mais uma API para I/O?

O que há de errado com java.io.File?

Page 5: Java NIO.2: Mais uma API para I/O?

●Falta de informação sobre o que está acontecendo●Operações com arquivo não são atômicas●Sem acesso em massa para atributos dos arquivos●Difilcudades para escalar listagem de diretórios●Faltam operações básicas●Não é possível copiar atributos de um arquivo

Por que outra API para a MANIPULAÇÃO de ARQUIVOS?

Page 6: Java NIO.2: Mais uma API para I/O?

●Suporte limitado para metadados do arquivo●Suporte limitado para links simbólicos●Não há maneiras de estender a API para implementações

de sistemas de arquivos customizados●Não há suporte para notificações

Por que outra API para a MANIPULAÇÃO de ARQUIVOS?

Page 7: Java NIO.2: Mais uma API para I/O?

O design da API NIO.2Pacotes

● java.nio.file● java.nio.file.attribute● java.nio.file.spi

Path● Um caminho no sistema de arquivos

Paths● Fábrica de objetos Path (caminho)

Files● Classe com métodos estáticos para operações mais comuns

FileSystems● Fábrica de objetos FileSystem

FileStore● Encapsula o sistema de armazenamento

Page 8: Java NIO.2: Mais uma API para I/O?

A interface Path●Representa um caminho absoluto ou relativo●Iterável sobre elementos de um caminho●Imutável●Operações para:

Acesso aos elementos de caminho Combinar caminhos Comparar caminhos

Page 9: Java NIO.2: Mais uma API para I/O?

Criando um caminhoPath path = FileSystems.getDefault().getPath("/foo");

Page 10: Java NIO.2: Mais uma API para I/O?

Criando um caminhoPath path = Paths.get("/foo");

Page 11: Java NIO.2: Mais uma API para I/O?

Criando um caminhoURI uri = URI.create("file:///foo");Path path = Paths.get(uri);

Page 12: Java NIO.2: Mais uma API para I/O?

Criando um caminhoFile file = new File("/foo");Path path = file.getPath();

Page 13: Java NIO.2: Mais uma API para I/O?

Acessando elementos de um caminhoPath path = Paths.get("/","foo","bar","x");Path file = path.getFileName();Path parent = path.getParent();Path root = path.getRoot();Path subpath = path.subpath(1,3);

Page 14: Java NIO.2: Mais uma API para I/O?

Acessando elementos de um caminhoPath path = Paths.get("/","foo","bar","x");

for (Path element : path ) { System.out.format("%s%n", element);}

Page 15: Java NIO.2: Mais uma API para I/O?

Combinando caminhosPath foo = Paths.get("/", "foo");Path bar = foo.resolve("bar");Path baz = foo.resolveSibling("baz");Path qux = Paths.get("/", "baz", "qux");Path relative = foo.relativize(qux);

Page 16: Java NIO.2: Mais uma API para I/O?

Testando caminhosPath path = Paths.get("top", "foo", "bar");boolean isStart = path.startsWith("to");boolean isEnd = path.endsWith("pot");boolean isAbs = path.isAbsolute();

Page 17: Java NIO.2: Mais uma API para I/O?

Outras operaçõesPath path = Paths.get("top", "foo", "bar");Path normal = path.normalize();Path abs = path.toAbsolutePath();Path real = path.toRealPath();URI uri = path.toUri();File file = path.toFile();

Page 18: Java NIO.2: Mais uma API para I/O?

A classe Files●Métodos estáticas para trabalhar com arquivos●A maioria das operações espera um Path como argumento●Operações para:

Leitura e Escrita de arquivos Streams, leitores (readers), escritores (writers) Links Simbólicos Trabalhar com diretórios

●Lança exceções significativas em caso de falha

Page 19: Java NIO.2: Mais uma API para I/O?

Files: Operações básicasPath file = Files.createFile(path);Path dir = Files.createDirectory(pathDir);Path dir = Files.createDirectories(pathDir);

Page 20: Java NIO.2: Mais uma API para I/O?

Files: Operações básicasimport static java.nio.charset.StandardCharsets.*;

List<String> lines = Files.readAllLines(file, UTF_8);byte[] bytes = Files.readAllBytes(file);

Page 21: Java NIO.2: Mais uma API para I/O?

Files.delete(path);Files.deleteIfExists(path);

Files.copy(source, target);

Files.copy(source, target, ATOMIC_MOVE, REPLACE_EXISTING, COPY_ATTRIBUTES);

Files.move(source, target);

Files: Operações básicas

Page 22: Java NIO.2: Mais uma API para I/O?

Files: Links simbólicosPath link = Paths.get("top", "link");

Path target = Paths.get("top", "foo", "tar");

Files.createSymbolicLink(link, target); boolean isSymLink = Files.isSymbolicLink(link);boolean isSame = Files.isSameFile(link, target);

Path tar = Files.readSymbolicLink(link);

Page 23: Java NIO.2: Mais uma API para I/O?

Leitura (reader) e escrita (Writer)import static java.nio.charset.StandardCharsets.*;

import java.nio.file.StandardOpenOption;

Path file = ...

BufferedReader reader = Files.newBufferedReader(file, UTF_8);

BufferedWriter writer = Files.newBufferedWriter(file, UTF_8, StandardOpenOption.CREATE_NEW);

Page 24: Java NIO.2: Mais uma API para I/O?

StreamsPath file = ...

InputStream is = Files.newInputStream(file);

OutputStream os = Files.newOutputStream(file);

OutputStream osAppend = Files.newOutputStream(file, CREATE, APPEND);

Page 25: Java NIO.2: Mais uma API para I/O?

Atributos de arquivo●Metadados dos arquivos●Exemplo:

criado, atualizado, data do último acesso rwxr--r--

●Definido pela plataforma e sistemas de arquivos

Page 26: Java NIO.2: Mais uma API para I/O?

Atributos de arquivoBasicFileAttributes

●Suportado por todas as plataformas●Datas (criação, modificação, último acesso), tipo

arquivo, tamanho, chave do arquivoDosFileAttributes

●Oculto, arquivo, somente leitura, sistemaPosixFileAttributes

●Dono, grupo, conjunto de permissões

Page 27: Java NIO.2: Mais uma API para I/O?

Atributos de arquivoBasicFileAttributes basicAttr = Files.readAttributes(path, BasicFileAttributes.class);

String key = basicAttr.fileKey();long size = basicAttr.size();boolean isDirectory = basicAttr.isDirectory();FileTime lastModified = basicAttr.lastModifiedTime();

Page 28: Java NIO.2: Mais uma API para I/O?

Atributos de arquivoPosixFileAttributes posixAttr = Files.readAttributes(path, PosixFileAttributes.class);

UserPrincipal owner = posixAttr.owner();GroupPrincipal group = posixAttr.group();String perms = PosixFilePermissions.toString( posixAttr.permissions()));

Files.setPosixFilePermissions(path, PosixFilePermissions.fromString("rwxrwxrwx"));

Page 29: Java NIO.2: Mais uma API para I/O?

Listagem de Diretório● Iteração eficiente na listagem de diretórios●Escalabilidade para grandes diretórios, sistemas de

arquivos remotos, etc.●Suporta filtros:

Glob Regex Filtros personalizados

Page 30: Java NIO.2: Mais uma API para I/O?

Listagem de Diretóriostry (DirectoryStream<Path> dirStream = Files.newDirectoryStream(dir,"*.java")) { for (Path path : dirStream) { format("%s%n", path.toAbsolutePath()); }}

Page 31: Java NIO.2: Mais uma API para I/O?

Listagem de DiretórioDirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() { public boolean accept(Path entry) throws IOException { return Files.size(entry) > 1024; } };

try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(dir,filter)) { ...}

Page 32: Java NIO.2: Mais uma API para I/O?

Percorrendo árvores de diretórios● Implementa o Padrão Visitor para percorrer árvores de

diretórios●Files.walkFileTree (start, fileVisitor)

start: nó incial fileVisitor: define operaçõe que serão realizadas

●Travessia em profundidade

Page 33: Java NIO.2: Mais uma API para I/O?

Percorrendo árvores de diretórios●Métodos callbacks de FileVisitor:

preVisitDirectory visitFile postVisitDirectory visitFileFailed

●Enum FileVisitResult CONTINUE TERMINATE SKIP_SUBTREE SKIP_SIBLINGS

Page 34: Java NIO.2: Mais uma API para I/O?

Percorrendo árvores de diretóriosPath start = Paths.get("/foo/bar");Files.walkFileTree(start, new SimpleFileVisitor<Path>(){ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { format("preVisitDirectory: %s%n", dir); return FileVisitResult.CONTINUE; }

public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { format("visitFile: %s%n", file); return FileVisitResult.CONTINUE; }});

Page 35: Java NIO.2: Mais uma API para I/O?

Watch Service●Monitora mudanças

Criar, atualizar, excluir●Usa notificações nativas

Page 36: Java NIO.2: Mais uma API para I/O?

Watch ServiceWatchService watcher = FileSystems.getDefault().newWatchService();

Path dir = …

WatchKey watchKey = dir.register(watcher, ENTRY_MODIFY);

Page 37: Java NIO.2: Mais uma API para I/O?

Watch Serviceboolean keepWatching = true;

while(keepWatching){ WatchKey key = watcher.poll(10, TimeUnit.SECONDS); for (WatchEvent<?> event: key.pollEvents()) { if (event.kind() == ENTRY_MODIFY) { Path name = (Path) event.context(); ... } } key.reset();}

Page 38: Java NIO.2: Mais uma API para I/O?

Watch ServicePontos a observar no Mundo Real●Sub-diretórios não são monitorados●Alguns editores criam um novo arquivo ao atualizar

Esperamos uma ATUALIZAÇÃO, mas recebemos um evento EXCLUIR + CRIAR

●Alguns sistemas de arquivos criam inicialmente um arquivo com zero bytes

Esperamos um evento de CRIAR, mas observamos um CRIAR + ATUALIZAÇÃO

Page 39: Java NIO.2: Mais uma API para I/O?

Sistema de arquivos personalizado●Permite a criação de sistemas de arquivos personalizados

FileSystemProvider●Sistema de arquivos em memória●O Provedor de sistema de arquivo Zip é fornecido como

uma implementação de referência

Page 40: Java NIO.2: Mais uma API para I/O?

Considerações finais●NIO.2 funciona de forma consistente em todas as

plataformas●Suporta novas operações●Suporta o acesso em massa para atributos de arquivo●Exceções melhores●SPI para a interface de provedores de sistemas de

arquivos personalizados

Page 41: Java NIO.2: Mais uma API para I/O?

OBRIGADO!!!