Skip to content

Latest commit

 

History

History
276 lines (245 loc) · 7.84 KB

File metadata and controls

276 lines (245 loc) · 7.84 KB

Paths

Objetivo
Operate on file and directory paths by using the Paths class
-
Operar em arquivos e diretórios usando a classe Paths

As classes Path e Paths são novidades do Java 7.

A classe Path representa um arquivo ou um diretório no sistema de arquivos, e a maioria das suas operações não altera diretamente arquivos ou diretórios.

A classe Paths contém métodos estáticos para a criação de Path.

Para que os exemplos executem independente do sistema, será utilizado o diretório do usuário, que no Java está disponível em uma propriedade da JVM chamada user.home.

  1. Existem inúmeras formas de obter uma instância de Path.

    src/org/j6toj8/fileio/paths/Paths_Creation.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_Creation.java[role=include]
    Saída no console
    User home: /home/rinaldo
    Path 1: /home/rinaldo
    Path 2: /home/rinaldo
    Path 3: /home/rinaldo
    Path 4: /home/rinaldo/arquivo.txt
    Path 5: /home/rinaldo/arquivo.txt
    Path 6: C:/users/rinaldo
    Path 7: C:/users/rinaldo
    Path 8: rinaldo
    Path 9: /home/rinaldo/arquivo.txt
    Path 10: /home/rinaldo
  2. É possível criar uma instância de Path apontando para um diretório ou arquivo que não existe.

    src/org/j6toj8/fileio/paths/Paths_CreationDoesntExists.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_CreationDoesntExists.java[role=include]
    Saída no console
    User home: /home/rinaldo
    Path: /home/rinaldo/arquivoQueNaoExiste.txt
  3. É possível converter um Path para um File.

    src/org/j6toj8/fileio/paths/Paths_ToFile.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_ToFile.java[role=include]
    Saída no console
    User home: /home/rinaldo
    Path: /home/rinaldo/arquivoQueNaoExiste.txt
    File: /home/rinaldo/arquivoQueNaoExiste.txt
  4. Existem inúmeros método no Path para recuperar informações a seu respeito.

    src/org/j6toj8/fileio/paths/Paths_Information.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_Information.java[role=include]
    Saída no console
    User home: /home/rinaldo
    
    Representação em String: /home/rinaldo/arquivos/arquivo.txt
    Nome do Arquivo: arquivo.txt
    Diretório Superior: /home/rinaldo/arquivos
    Diretório Raiz: /
    É absoluto? true
    
    Representação em String: home/rinaldo/arquivos
    Nome do Arquivo: arquivos
    Diretório Superior: home/rinaldo
    Diretório Raiz: null
    É absoluto? false
  5. É possível recuperar os elementos do Path individualmente.

    src/org/j6toj8/fileio/paths/Paths_Names.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_Names.java[role=include]
    Saída no console
    User home: /home/rinaldo
    
    home
    rinaldo
    arquivos
    arquivo.txt
  6. É possível converter um Path relativo para um absoluto.

    src/org/j6toj8/fileio/paths/Paths_ToAbsolute.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_ToAbsolute.java[role=include]
    Saída no console
    arquivos
    É absoluto? false
    
    /home/rinaldo/Desenvolvimento/git/java6-to-java8/arquivos
    É absoluto? true

    Neste caso a saída do console vai depende do diretório onde a aplicação está sendo executada.

  7. É possível criar Sub-Paths a partir de um Path.

    src/org/j6toj8/fileio/paths/Paths_SubPath.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_SubPath.java[role=include]
    Saída no console
    User home: /home/rinaldo
    Path: /home/rinaldo/arquivos/arquivo1.txt
    home
    home/rinaldo
    rinaldo/arquivos
    arquivos/arquivo1.txt
    Exception in thread "main" java.lang.IllegalArgumentException
    	at sun.nio.fs.UnixPath.subpath(UnixPath.java:348)
    	at sun.nio.fs.UnixPath.subpath(UnixPath.java:43)
    	at org.j6toj8.fileio.paths.Paths_SubPath.main(Paths_SubPath.java:28)
  8. É possível remover redundâncias de um Path com o método normalize.

    src/org/j6toj8/fileio/paths/Paths_Normalize.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_Normalize.java[role=include]
    Saída no console
    User home: /home/rinaldo
    
    Path: /home/rinaldo/arquivos/./arquivo1.txt
    Path normalize: /home/rinaldo/arquivos/arquivo1.txt
    
    Path: /home/rinaldo/arquivos/../arquivo1.txt
    Path normalize: /home/rinaldo/arquivo1.txt
  9. É possível unir duas instâncias de Path com o método resolve.

    src/org/j6toj8/fileio/paths/Paths_Resolve.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_Resolve.java[role=include]
    Saída no console
    User home: /home/rinaldo
    
    Absoluto + Relativo: /home/rinaldo/arquivos/arquivo1.txt
    Relativo + Absoluto: /home/rinaldo/arquivos
    Absoluto + Absoluto: /home/rinaldo/arquivos
    Relativo + Relativo: arquivo1.txt/arquivo1.txt

    Perceba que sempre que o argumento é um Path absoluto, o resultado final é ele mesmo.

    Quando o argumento é um Path relativo, ele é acrescentado ao original, seja este absoluto ou relativo.

  10. É possível derivar um Path de outro com o método relativize.

    src/org/j6toj8/fileio/paths/Paths_Relativize.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_Relativize.java[role=include]
    Saída no console
    User home: /home/rinaldo
    
    Absoluto 1: /home/rinaldo/arquivos
    Absoluto 2: /home/rinaldo/arquivos/arquivo1.txt
    Relativo 1: arquivo1.txt
    Relativo 2: arquivos/arquivo1.txt
    Absoluto 1 + Absoluto 2: arquivo1.txt
    Absoluto 2 + Absoluto 1: ..
    Relativo 1 + Relativo 2: ../arquivos/arquivo1.txt
    Relativo 2 + Relativo 1: ../../arquivo1.txt
    java.lang.IllegalArgumentException: 'other' is different type of Path
    	at sun.nio.fs.UnixPath.relativize(UnixPath.java:416)
    	at sun.nio.fs.UnixPath.relativize(UnixPath.java:43)
    	at org.j6toj8.fileio.paths.Paths_Relativize.main(Paths_Relativize.java:33)
    java.lang.IllegalArgumentException: 'other' is different type of Path
    	at sun.nio.fs.UnixPath.relativize(UnixPath.java:416)
    	at sun.nio.fs.UnixPath.relativize(UnixPath.java:43)
    	at org.j6toj8.fileio.paths.Paths_Relativize.main(Paths_Relativize.java:40)

    Todas essas combinações podem aparecer no exame, então entenda bem como cada uma delas se comporta. Lembre-se principalmente de que não é possível derivar um Path absoluto de um relativo, e vice-versa.

  11. É possível converter um Path sintético, que não aponta de fato para um arquivo no sistema de arquivos, em um Path real, que aponta para um arquivo ou diretório que existe no sistema de arquivos.

    src/org/j6toj8/fileio/paths/Paths_ToRealPath.java
    link:../../../src/org/j6toj8/fileio/paths/Paths_ToRealPath.java[role=include]
    Saída no console
    User home: /home/rinaldo
    realPath: /home/rinaldo/arquivo1.txt
    java.nio.file.NoSuchFileException: /home/rinaldo/arquivoQueNaoExiste.txt
    	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
    	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    	at sun.nio.fs.UnixPath.toRealPath(UnixPath.java:837)
    	at org.j6toj8.fileio.paths.Paths_ToRealPath.main(Paths_ToRealPath.java:25)

    Perceba que é lançada exceção caso o arquivo realmente não exista no sistema de arquivos.

Referências
  • Introducing NIO.2

    Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 454). Wiley. Edição do Kindle.

  • Java NIO2 Path API.

  • Class Paths. Java Plataform SE 7.

  • Path Operations. The Java™ Tutorials.