Download - Java NIO.2: Mais uma API para I/O?
![Page 1: Java NIO.2: Mais uma API para I/O?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/1.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/2.jpg)
![Page 3: Java NIO.2: Mais uma API para I/O?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/3.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/4.jpg)
O que há de errado com java.io.File?
![Page 5: Java NIO.2: Mais uma API para I/O?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/5.jpg)
●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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/6.jpg)
●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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/7.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/8.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/9.jpg)
Criando um caminhoPath path = FileSystems.getDefault().getPath("/foo");
![Page 10: Java NIO.2: Mais uma API para I/O?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/10.jpg)
Criando um caminhoPath path = Paths.get("/foo");
![Page 11: Java NIO.2: Mais uma API para I/O?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/11.jpg)
Criando um caminhoURI uri = URI.create("file:///foo");Path path = Paths.get(uri);
![Page 12: Java NIO.2: Mais uma API para I/O?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/12.jpg)
Criando um caminhoFile file = new File("/foo");Path path = file.getPath();
![Page 13: Java NIO.2: Mais uma API para I/O?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/13.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/14.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/15.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/16.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/17.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/18.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/19.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/20.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/21.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/22.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/23.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/24.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/25.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/26.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/27.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/28.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/29.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/30.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/31.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/32.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/33.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/34.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/35.jpg)
Watch Service●Monitora mudanças
Criar, atualizar, excluir●Usa notificações nativas
![Page 36: Java NIO.2: Mais uma API para I/O?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/36.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/37.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/38.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/39.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/40.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022052606/58822c6b1a28ab52368b62e7/html5/thumbnails/41.jpg)
OBRIGADO!!!