Skip to content

Commit

Permalink
feat(file-io): 🎸 file improvements, translated
Browse files Browse the repository at this point in the history
Refers: #9
  • Loading branch information
rcmoutinho committed Sep 13, 2019
1 parent da0699d commit b74123d
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 97 deletions.
150 changes: 74 additions & 76 deletions book/07-file-io/sections/04-file-improvements.asc
Original file line number Diff line number Diff line change
@@ -1,166 +1,164 @@
:java-package: src/org/j6toj8/fileio
:section-java-package: ../../../{java-package}

=== Files com Streams
=== Files with Streams

.Objetivo
.Objective
--------------------------------------------------
Find a file by using the PathMatcher interface, and use Java SE 8 I/O improvements, including Files.find(), Files.walk(), and lines() methods
-
Encontrar um arquivo usando a interface PathMatcher, e usar as melhorias de I/O do Java SE 8, incluindo os métodos Files.find(), Files.walk(), and lines()
--------------------------------------------------

Nestão seção serão apresentadas melhorias do Java 8 para encontrar e ler arquivos. São operações que já poderiam ser realizadas com outros métodos antes do Java 8. Porém, com essas melhorias, é possível realizar essas operações utilizando Streams.
In this section Java 8 enhancements for finding and reading files will be presented. These are operations that could already be performed with other methods before Java 8. However, with these improvements, you can perform these operations using Streams.

. É possível criar um _Stream_ para acessar todos os arquivos, diretórios e subdiretórios de um `Path`.
. You can create a _Stream_ to access all files, directories and subdirectories of a `Path`.
+
[source,java,indent=0]
.{java-package}/fileimprovements/Improvements_Walk.java
----
include::{section-java-package}/fileimprovements/Improvements_Walk.java[tag=code]
----
+
.Saída no console
.console output
[source,console]
----
Path: /home/rinaldo/arquivos
Todos os arquivos e diretórios:
/home/rinaldo/arquivos
/home/rinaldo/arquivos/arquivo1.txt
/home/rinaldo/arquivos/arquivo3.txt
/home/rinaldo/arquivos/subpasta1
/home/rinaldo/arquivos/subpasta1/subpasta12
/home/rinaldo/arquivos/subpasta1/subpasta12/arquivo122.txt
/home/rinaldo/arquivos/subpasta1/subpasta12/arquivo121.txt
/home/rinaldo/arquivos/subpasta1/arquivo11.txt
/home/rinaldo/arquivos/subpasta1/subpasta11
/home/rinaldo/arquivos/subpasta1/arquivo12.txt
/home/rinaldo/arquivos/subpasta1/arquivo13.txt
/home/rinaldo/arquivos/arquivo2.txt
Os primeiro 5 arquivos e diretórios:
/home/rinaldo/arquivos
/home/rinaldo/arquivos/arquivo1.txt
/home/rinaldo/arquivos/arquivo3.txt
/home/rinaldo/arquivos/subpasta1
/home/rinaldo/arquivos/subpasta1/subpasta12
Path: /home/rinaldo/files
All files and directories:
/home/rinaldo/files
/home/rinaldo/files/file1.txt
/home/rinaldo/files/file3.txt
/home/rinaldo/files/subfolder1
/home/rinaldo/files/subfolder1/subfolder12
/home/rinaldo/files/subfolder1/subfolder12/file122.txt
/home/rinaldo/files/subfolder1/subfolder12/file121.txt
/home/rinaldo/files/subfolder1/file11.txt
/home/rinaldo/files/subfolder1/subfolder11
/home/rinaldo/files/subfolder1/file12.txt
/home/rinaldo/files/subfolder1/file13.txt
/home/rinaldo/files/file2.txt
The first 5 files and directories:
/home/rinaldo/files
/home/rinaldo/files/file1.txt
/home/rinaldo/files/file3.txt
/home/rinaldo/files/subfolder1
/home/rinaldo/files/subfolder1/subfolder12
----
+
Perceba que a instância criada é realmente um `Stream<Path>`, de tal forma que é possível realizar as operações disponíveis em qualquer __Stream__, como o método `filter`.
Note that the created instance is really a `Stream <Path>`, so that you can perform the operations available on any _Stream_, such as the `filter` method.

. Existe uma versão do método `walk` para definir opções adicionais e limitar a profundidade do acesso aos subdiretórios.
. There is a version of the `walk` method for setting additional options and limiting the depth of access to subdirectories.
+
[source,java,indent=0]
.{java-package}/fileimprovements/Improvements_WalkDepth.java
----
include::{section-java-package}/fileimprovements/Improvements_WalkDepth.java[tag=code]
----
+
.Saída no console
.console output
[source,console]
----
Path: /home/rinaldo/arquivos
Path: /home/rinaldo/files
Arquivos e Links simbólicos até o segundo nível:
/home/rinaldo/arquivos
/home/rinaldo/arquivos/arquivo1.txt
/home/rinaldo/arquivos/arquivo3.txt
/home/rinaldo/arquivos/subpasta1
/home/rinaldo/arquivos/subpasta1/subpasta12
/home/rinaldo/arquivos/subpasta1/arquivo11.txt
/home/rinaldo/arquivos/subpasta1/subpasta11
/home/rinaldo/arquivos/subpasta1/arquivo12.txt
/home/rinaldo/arquivos/subpasta1/arquivo13.txt
/home/rinaldo/arquivos/arquivo2.txt
Symbolic files and links to the second level:
/home/rinaldo/files
/home/rinaldo/files/file1.txt
/home/rinaldo/files/file3.txt
/home/rinaldo/files/subfolder1
/home/rinaldo/files/subfolder1/subfolder12
/home/rinaldo/files/subfolder1/file11.txt
/home/rinaldo/files/subfolder1/subfolder11
/home/rinaldo/files/subfolder1/file12.txt
/home/rinaldo/files/subfolder1/file13.txt
/home/rinaldo/files/file2.txt
----

. É possível pesquisar por um arquivo utilizando o método `find` e filtrar por atributos.
. You can search for a file using the `find` method and filter by attributes.
+
[source,java,indent=0]
.{java-package}/fileimprovements/Improvements_Find.java
----
include::{section-java-package}/fileimprovements/Improvements_Find.java[tag=code]
----
+
.Saída no console
.console output
[source,console]
----
Path: /home/rinaldo/arquivos
Path: /home/rinaldo/files
Todos os arquivos, ignorando diretórios, até o segundo nível:
/home/rinaldo/arquivos/arquivo1.txt
/home/rinaldo/arquivos/arquivo3.txt
/home/rinaldo/arquivos/subpasta1/arquivo11.txt
/home/rinaldo/arquivos/subpasta1/arquivo12.txt
/home/rinaldo/arquivos/subpasta1/arquivo13.txt
/home/rinaldo/arquivos/arquivo2.txt
All files, skipping directories, up to the second level:
/home/rinaldo/files/file1.txt
/home/rinaldo/files/file3.txt
/home/rinaldo/files/subfolder1/file11.txt
/home/rinaldo/files/subfolder1/file12.txt
/home/rinaldo/files/subfolder1/file13.txt
/home/rinaldo/files/file2.txt
----
+
Perceba que ao utilizar o `find` a expressão lambda tem acesso ao `Path` e seus atributos, que é uma instância de `BasicFileAttributes`, permitindo uma maior flexibilidade na busca.
Note that by using `find` the lambda expression has access to `Path` and its attributes, which is an instance of `BasicFileAttributes`, allowing for greater flexibility in searching.

. É possível listar o conteúdo de um `Path` utilizando o método `list`.
. You can list the contents of a `Path` using the `list` method.
+
[source,java,indent=0]
.{java-package}/fileimprovements/Improvements_List.java
----
include::{section-java-package}/fileimprovements/Improvements_List.java[tag=code]
----
+
.Saída no console
.console output
[source,console]
----
Path: /home/rinaldo/arquivos
Path: /home/rinaldo/files
Listagem do diretório:
/home/rinaldo/arquivos/arquivo1.txt
/home/rinaldo/arquivos/arquivo3.txt
/home/rinaldo/arquivos/subpasta1
/home/rinaldo/arquivos/arquivo2.txt
Directory listing:
/home/rinaldo/files/file1.txt
/home/rinaldo/files/file3.txt
/home/rinaldo/files/subfolder1
/home/rinaldo/files/file2.txt
Listagem do diretório com filtro:
/home/rinaldo/arquivos/arquivo1.txt
/home/rinaldo/arquivos/arquivo3.txt
/home/rinaldo/arquivos/arquivo2.txt
Directory listing, files only:
/home/rinaldo/files/file1.txt
/home/rinaldo/files/file3.txt
/home/rinaldo/files/file2.txt
----
+
Perceba que o `list` não apresenta elementos dos subdiretórios.
Note that `list` has no subdirectory elements.

. É possível recuperar todas as linhas de um arquivo como um _Stream_ utilizando o método `lines`.
. You can retrieve all lines of a file as a _Stream_ using the `lines` method.
+
[source,java,indent=0]
.{java-package}/fileimprovements/Improvements_Lines.java
----
include::{section-java-package}/fileimprovements/Improvements_Lines.java[tag=code]
----
+
.Saída no console
.console output
[source,console]
----
Path: /home/rinaldo/arquivos/subpasta1/arquivo11.txt
Path: /home/rinaldo/files/subfolder1/file11.txt
Conteúdo do arquivo:
File content:
1
2
3
4
5
Conteúdo do arquivo:
File contents greater than 2:
3
4
5
----


.References
****
* Presenting the New Stream Methods
+
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 486). Wiley. Edição do Kindle.
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 486). Wiley. Kindle Edition.
* https://www.baeldung.com/java-list-directory-files[List Files in a Directory in Java.]
* https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html[Class Files.] Java Plataform SE 7.
****
****
12 changes: 6 additions & 6 deletions src/org/j6toj8/fileio/fileimprovements/Improvements_Find.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ public class Improvements_Find {
public static void main(String[] args) {
// tag::code[]
String userHome = System.getProperty("user.home");
Path path = Paths.get(userHome, "arquivos");
Path path = Paths.get(userHome, "files");
System.out.println("Path: " + path);

try {
System.out.println("\nTodos os arquivos, ignorando diretórios, até o segundo nível: ");
// ao chamar o find:
// primeiro argumento: o path inicial
// segundo argumento: o limite de profundidade
// terceiro argumento: expressão lambda para filtrar
System.out.println("\nAll files, skipping directories, up to the second level: ");
// when calling find:
// first argument: the initial path
// second argument: the depth limit
// third argument: lambda expression to filter
Files.find(path, 2, (p, a) -> a.isRegularFile())
.forEach(System.out::println);
} catch (IOException e) {
Expand Down
10 changes: 5 additions & 5 deletions src/org/j6toj8/fileio/fileimprovements/Improvements_Lines.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@ public class Improvements_Lines {
public static void main(String[] args) {
// tag::code[]
String userHome = System.getProperty("user.home");
Path path = Paths.get(userHome, "arquivos", "subpasta1", "arquivo11.txt");
Path path = Paths.get(userHome, "files", "subfolder1", "file11.txt");
System.out.println("Path: " + path);

try {
System.out.println("\nConteúdo do arquivo: ");
Files.lines(path) // recupera todas as linhas do arquivo como Stream
System.out.println("\nFile content: ");
Files.lines(path) // retrieves all file lines as Stream
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}

try {
System.out.println("\nConteúdo do arquivo maior que 2: ");
System.out.println("\nFile contents greater than 2: ");
Files.lines(path)
.filter(s -> Integer.parseInt(s) > 2) // filtra maior que 2
.filter(s -> Integer.parseInt(s) > 2) // filters greater than 2
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
Expand Down
6 changes: 3 additions & 3 deletions src/org/j6toj8/fileio/fileimprovements/Improvements_List.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ public class Improvements_List {
public static void main(String[] args) {
// tag::code[]
String userHome = System.getProperty("user.home");
Path path = Paths.get(userHome, "arquivos");
Path path = Paths.get(userHome, "files");
System.out.println("Path: " + path);

try {
System.out.println("\nListagem do diretório: ");
System.out.println("\nDirectory listing: ");
Files.list(path)
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}

try {
System.out.println("\nListagem do diretório, apenas arquivos: ");
System.out.println("\nDirectory listing, files only: ");
Files.list(path)
.filter(p -> Files.isRegularFile(p))
.forEach(System.out::println);
Expand Down
10 changes: 5 additions & 5 deletions src/org/j6toj8/fileio/fileimprovements/Improvements_Walk.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ public class Improvements_Walk {
public static void main(String[] args) {
// tag::code[]
String userHome = System.getProperty("user.home");
Path path = Paths.get(userHome, "arquivos");
Path path = Paths.get(userHome, "files");
System.out.println("Path: " + path);

try {
System.out.println("\nTodos os arquivos e diretórios: ");
Files.walk(path) // cria o stream
.forEach(System.out::println); // imprime no console
System.out.println("\nAll files and directories: ");
Files.walk(path) // creates a stream
.forEach(System.out::println); // prints on console
} catch (IOException e) {
e.printStackTrace();
}

try {
System.out.println("\nOs primeiro 5 arquivos e diretórios: ");
System.out.println("\nThe first 5 files and directories: ");
Files.walk(path)
.limit(5)
.forEach(System.out::println);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ public class Improvements_WalkDepth {
public static void main(String[] args) {
// tag::code[]
String userHome = System.getProperty("user.home");
Path path = Paths.get(userHome, "arquivos");
Path path = Paths.get(userHome, "files");
System.out.println("Path: " + path);

try {
System.out.println("\nArquivos e Links simbólicos até o segundo nível: ");
System.out.println("\nSymbolic files and links to the second level: ");
Files.walk(path, 2, FileVisitOption.FOLLOW_LINKS)
.forEach(System.out::println);
} catch (IOException e) {
Expand Down

0 comments on commit b74123d

Please sign in to comment.