Skip to content

Commit da0699d

Browse files
committed
feat(file-io): 🎸 recursive access, translated
Refers: #9
1 parent fea3267 commit da0699d

File tree

8 files changed

+138
-142
lines changed

8 files changed

+138
-142
lines changed
Lines changed: 93 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,189 +1,188 @@
11
:java-package: src/org/j6toj8/fileio
22
:section-java-package: ../../../{java-package}
33

4-
=== DirectoryStream e FileVisitor
4+
=== DirectoryStream and FileVisitor
55

66
.Objetivo
77
--------------------------------------------------
88
Recursively access a directory tree by using the DirectoryStream and FileVisitor interfaces
9-
-
10-
Acessar recursivamente uma árvore de diretório usando as interfaces DirectoryStream e FileVisitor
119
--------------------------------------------------
1210

13-
Nestão seção serão apresentadas duas classes para percorrer diretórios: `DirectoryStream` e `FileVisitor`.
11+
In this section we will present two classes for traversing directories: `DirectoryStream` and `FileVisitor`.
1412

15-
. É possível checar vários atributos de um `Path` utilizando a classe `Files`.
13+
. You can check various attributes of a `Path` using the `Files` class.
1614
+
1715
[source,java,indent=0]
1816
.{java-package}/recursiveaccess/Recursive_DirectoryStream.java
1917
----
2018
include::{section-java-package}/recursiveaccess/Recursive_DirectoryStream.java[tag=code]
2119
----
2220
+
23-
.Saída no console
21+
.console output
2422
[source,console]
2523
----
26-
Path: /home/rinaldo/arquivos
27-
/home/rinaldo/arquivos/arquivo1.txt
28-
/home/rinaldo/arquivos/arquivo3.txt
29-
/home/rinaldo/arquivos/subpasta1
30-
/home/rinaldo/arquivos/arquivo2.txt
31-
/home/rinaldo/arquivos/arquivo1.txt
32-
/home/rinaldo/arquivos/arquivo3.txt
33-
/home/rinaldo/arquivos/subpasta1
34-
/home/rinaldo/arquivos/arquivo2.txt
24+
Path: /home/rinaldo/files
25+
/home/rinaldo/files/file1.txt
26+
/home/rinaldo/files/file3.txt
27+
/home/rinaldo/files/subfolder1
28+
/home/rinaldo/files/file2.txt
29+
/home/rinaldo/files/file1.txt
30+
/home/rinaldo/files/file3.txt
31+
/home/rinaldo/files/subfolder1
32+
/home/rinaldo/files/file2.txt
3533
----
3634
+
37-
Perceba que a instância de `DirectoryStream`:
35+
Note that the instance of `DirectoryStream`:
3836
+
39-
* Pode ser utilizada com try-with-resources.
40-
* Pode ser iterada com a sintaxe de for-each.
41-
* Pode ser iterada com o método `forEach` que recebe uma expressão lambda.
42-
* Lança exceção caso o arquivo não exista.
43-
* Não lista os subdiretórios de forma recursiva, mas sim apenas o primeiro nível.
44-
* Não tem relação com a API de _Streams_ do Java 8.
37+
* Can be used with try-with-resources.
38+
* Can be iterated with for-each syntax.
39+
* Can be iterated with the `forEach` method that receives a lambda expression.
40+
* Throws exception if the file does not exist.
41+
* Do not list subdirectories recursively, but only the first level.
42+
* Not related to the Java 8 _Streams_ API.
4543

46-
. É possível acessar toda uma árvore de diretórios utilizando um `FileVisitor`.
44+
. You can access an entire directory tree using a `FileVisitor`.
4745
+
4846
[source,java,indent=0]
4947
.{java-package}/recursiveaccess/Recursive_SimpleFileVisitor.java
5048
----
5149
include::{section-java-package}/recursiveaccess/Recursive_SimpleFileVisitor.java[tag=code]
5250
----
5351
+
54-
.Saída no console
52+
.console output
5553
[source,console]
5654
----
57-
Path: /home/rinaldo/arquivos
58-
Arquivo visitado: /home/rinaldo/arquivos/arquivo1.txt. Tamanho: 2
59-
Arquivo visitado: /home/rinaldo/arquivos/arquivo3.txt. Tamanho: 10
60-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta12/arquivo122.txt. Tamanho: 10
61-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta12/arquivo121.txt. Tamanho: 10
62-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo11.txt. Tamanho: 10
63-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo12.txt. Tamanho: 2
64-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo13.txt. Tamanho: 2
65-
Arquivo visitado: /home/rinaldo/arquivos/arquivo2.txt. Tamanho: 2
55+
Path: /home/rinaldo/files
56+
Visited file: /home/rinaldo/files/file1.txt. Size: 2
57+
Visited file: /home/rinaldo/files/file3.txt. Size: 10
58+
Visited file: /home/rinaldo/files/subfolder1/subfolder12/file122.txt. Size: 10
59+
Visited file: /home/rinaldo/files/subfolder1/subfolder12/file121.txt. Size: 10
60+
Visited file: /home/rinaldo/files/subfolder1/file11.txt. Size: 10
61+
Visited file: /home/rinaldo/files/subfolder1/file12.txt. Size: 2
62+
Visited file: /home/rinaldo/files/subfolder1/file13.txt. Size: 2
63+
Visited file: /home/rinaldo/files/file2.txt. Size: 2
6664
----
6765
+
68-
Perceba que todos os arquivos do diretório e subdiretórios foram visitados e impressos no console ao invocar `Files.walkFileTree`. Para cada arquivo encontrado foi invocado o método `visitFile` da instância de `MeuFileVisitor`.
66+
Note that all files in the directory and subdirectories were visited and printed on the console by invoking `Files.walkFileTree`. For each file found the `visitFile` method of the instance of `MyFileVisitor` was invoked.
6967
+
70-
Veja que foi retornado `FileVisitResult.CONTINUE` do método `visitFile`. Isso instrui o FileVisitor a continuar visitando a árvore de arquivos. Também é possível retornar `TERMINATE`, `SKIP_SUBTREE` e `SKIP_SIBLINGS`, que serão apresentados a seguir.
68+
Note that `FileVisitResult.CONTINUE` has been returned from the `visitFile` method. This instructs FileVisitor to continue visiting the file tree. You can also return `TERMINATE`, `SKIP_SUBTREE` and `SKIP_SIBLINGS`, which will be shown below.
7169

72-
. É possível finalizar a visitação quando for necessário retornando `FileVisitResult.TERMINATE`.
70+
. You can end the visit when needed by returning `FileVisitResult.TERMINATE`.
7371
+
7472
[source,java,indent=0]
7573
.{java-package}/recursiveaccess/Recursive_VisitorTerminate.java
7674
----
7775
include::{section-java-package}/recursiveaccess/Recursive_VisitorTerminate.java[tag=code]
7876
----
7977
+
80-
.Saída no console
78+
.console output
8179
[source,console]
8280
----
83-
Path: /home/rinaldo/arquivos
84-
Arquivo visitado: /home/rinaldo/arquivos/arquivo1.txt. Tamanho: 2
85-
Arquivo visitado: /home/rinaldo/arquivos/arquivo3.txt. Tamanho: 10
86-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta12/arquivo122.txt. Tamanho: 10
87-
Arquivo encontrado. Finalizando.
81+
Path: /home/rinaldo/files
82+
Visited file: /home/rinaldo/files/file1.txt. Size: 2
83+
Visited file: /home/rinaldo/files/file3.txt. Size: 10
84+
Visited file: /home/rinaldo/files/subfolder1/subfolder12/file122.txt. Size: 10
85+
File found. Terminating.
8886
----
8987

90-
. Também é possível tomar decisões antes e depois de visitar diretórios.
88+
. It is also possible to make decisions before and after visiting directories.
9189
+
9290
[source,java,indent=0]
9391
.{java-package}/recursiveaccess/Recursive_VisitorDirectory.java
9492
----
9593
include::{section-java-package}/recursiveaccess/Recursive_VisitorDirectory.java[tag=code]
9694
----
9795
+
98-
.Saída no console
96+
.console output
9997
[source,console]
10098
----
101-
Path: /home/rinaldo/arquivos
102-
Arquivo visitado: /home/rinaldo/arquivos/arquivo1.txt. Tamanho: 2
103-
Arquivo visitado: /home/rinaldo/arquivos/arquivo3.txt. Tamanho: 10
104-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo11.txt. Tamanho: 10
105-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo12.txt. Tamanho: 2
106-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo13.txt. Tamanho: 2
107-
Arquivo visitado: /home/rinaldo/arquivos/arquivo2.txt. Tamanho: 2
99+
Path: /home/rinaldo/files
100+
Visited file: /home/rinaldo/files/file1.txt. Size: 2
101+
Visited file: /home/rinaldo/files/file3.txt. Size: 10
102+
Visited file: /home/rinaldo/files/subfolder1/file11.txt. Size: 10
103+
Visited file: /home/rinaldo/files/subfolder1/file12.txt. Size: 2
104+
Visited file: /home/rinaldo/files/subfolder1/file13.txt. Size: 2
105+
Visited file: /home/rinaldo/files/file2.txt. Size: 2
108106
----
109107

110-
. Também é possível ignorar todos os elementos que estão no mesmo nível de um `Path`.
108+
. You can also ignore all elements that are on the same level as a `Path`.
111109
+
112110
[source,java,indent=0]
113111
.{java-package}/recursiveaccess/Recursive_VisitorIgnoreSiblings.java
114112
----
115113
include::{section-java-package}/recursiveaccess/Recursive_VisitorIgnoreSiblings.java[tag=code]
116114
----
117115
+
118-
.Saída no console
116+
.console output
119117
[source,console]
120118
----
121-
Path: /home/rinaldo/arquivos
122-
Arquivo visitado: /home/rinaldo/arquivos/arquivo1.txt. Tamanho: 2
123-
Arquivo visitado: /home/rinaldo/arquivos/arquivo3.txt. Tamanho: 10
124-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta12/arquivo122.txt. Tamanho: 10
125-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta12/arquivo121.txt. Tamanho: 10
126-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo11.txt. Tamanho: 10
127-
Arquivo visitado: /home/rinaldo/arquivos/arquivo2.txt. Tamanho: 2
119+
Path: /home/rinaldo/files
120+
Visited file: /home/rinaldo/files/file1.txt. Size: 2
121+
Visited file: /home/rinaldo/files/file3.txt. Size: 10
122+
Visited file: /home/rinaldo/files/subfolder1/subfolder12/file122.txt. Size: 10
123+
Visited file: /home/rinaldo/files/subfolder1/subfolder12/file121.txt. Size: 10
124+
Visited file: /home/rinaldo/files/subfolder1/file11.txt. Size: 10
125+
Visited file: /home/rinaldo/files/file2.txt. Size: 2
128126
----
129127

130-
. É possível implementar diretamente a interface `FileVisitor`, ao invés de `SimpleFileVisitor`, e implementar todos os seus métodos.
128+
. You can directly implement the `FileVisitor` interface, instead of `SimpleFileVisitor`, and implement all of its methods.
131129
+
132130
[source,java,indent=0]
133131
.{java-package}/recursiveaccess/Recursive_FileVisitor.java
134132
----
135133
include::{section-java-package}/recursiveaccess/Recursive_FileVisitor.java[tag=code]
136134
----
137135
+
138-
.Saída no console
136+
.console output
139137
[source,console]
140138
----
141-
Path: /home/rinaldo/arquivos
142-
Antes de visitar o diretório: /home/rinaldo/arquivos
143-
Arquivo visitado: /home/rinaldo/arquivos/arquivo1.txt
144-
Arquivo visitado: /home/rinaldo/arquivos/arquivo3.txt
145-
Antes de visitar o diretório: /home/rinaldo/arquivos/subpasta1
146-
Antes de visitar o diretório: /home/rinaldo/arquivos/subpasta1/subpasta12
147-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta12/arquivo122.txt
148-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta12/arquivo121.txt
149-
Após de visitar o diretório: /home/rinaldo/arquivos/subpasta1/subpasta12
150-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo11.txt
151-
Antes de visitar o diretório: /home/rinaldo/arquivos/subpasta1/subpasta11
152-
Após de visitar o diretório: /home/rinaldo/arquivos/subpasta1/subpasta11
153-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo12.txt
154-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo13.txt
155-
Após de visitar o diretório: /home/rinaldo/arquivos/subpasta1
156-
Arquivo visitado: /home/rinaldo/arquivos/arquivo2.txt
157-
Após de visitar o diretório: /home/rinaldo/arquivos
158-
----
159-
160-
. É possível definir opções adicionais e limitar a profundidade utilizando outra versão do método `walkFileTree`.
139+
Path: /home/rinaldo/files
140+
Before visiting the directory: /home/rinaldo/files
141+
Visited file: /home/rinaldo/files/file1.txt
142+
Visited file: /home/rinaldo/files/file3.txt
143+
Before visiting the directory: /home/rinaldo/files/subfolder1
144+
Before visiting the directory: /home/rinaldo/files/subfolder1/subfolder12
145+
Visited file: /home/rinaldo/files/subfolder1/subfolder12/file122.txt
146+
Visited file: /home/rinaldo/files/subfolder1/subfolder12/file121.txt
147+
After visiting the directory: /home/rinaldo/files/subfolder1/subfolder12
148+
Visited file: /home/rinaldo/files/subfolder1/file11.txt
149+
Before visiting the directory: /home/rinaldo/files/subfolder1/subfolder11
150+
After visiting the directory: /home/rinaldo/files/subfolder1/subfolder11
151+
Visited file: /home/rinaldo/files/subfolder1/file12.txt
152+
Visited file: /home/rinaldo/files/subfolder1/file13.txt
153+
After visiting the directory: /home/rinaldo/files/subfolder1
154+
Visited file: /home/rinaldo/files/file2.txt
155+
After visiting the directory: /home/rinaldo/files
156+
----
157+
158+
. You can set additional options and limit depth using another version of the `walkFileTree` method.
161159
+
162160
[source,java,indent=0]
163161
.{java-package}/recursiveaccess/Recursive_VisitorOptionsAndDepth.java
164162
----
165163
include::{section-java-package}/recursiveaccess/Recursive_VisitorOptionsAndDepth.java[tag=code]
166164
----
167165
+
168-
.Saída no console
166+
.console output
169167
[source,console]
170168
----
171-
Path: /home/rinaldo/arquivos
172-
Arquivo visitado: /home/rinaldo/arquivos/arquivo1.txt
173-
Arquivo visitado: /home/rinaldo/arquivos/arquivo3.txt
174-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta12
175-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo11.txt
176-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/subpasta11
177-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo12.txt
178-
Arquivo visitado: /home/rinaldo/arquivos/subpasta1/arquivo13.txt
179-
Arquivo visitado: /home/rinaldo/arquivos/arquivo2.txt
169+
Path: /home/rinaldo/files
170+
Visited file: /home/rinaldo/files/file1.txt
171+
Visited file: /home/rinaldo/files/file3.txt
172+
Visited file: /home/rinaldo/files/subfolder1/subfolder12
173+
Visited file: /home/rinaldo/files/subfolder1/file11.txt
174+
Visited file: /home/rinaldo/files/subfolder1/subfolder11
175+
Visited file: /home/rinaldo/files/subfolder1/file12.txt
176+
Visited file: /home/rinaldo/files/subfolder1/file13.txt
177+
Visited file: /home/rinaldo/files/file2.txt
180178
----
181179

180+
.References
182181
****
183182
184183
* Working with Directories
185184
+
186-
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 617). Wiley. Edição do Kindle.
185+
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 617). Wiley. Kindle Edition.
187186
188187
* https://www.baeldung.com/java-list-directory-files[List Files in a Directory in Java.]
189188
@@ -195,4 +194,4 @@ Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8
195194
196195
* https://docs.oracle.com/javase/tutorial/essential/io/pathOps.html[Path Operations.] The Java™ Tutorials.
197196
198-
****
197+
****

src/org/j6toj8/fileio/recursiveaccess/Recursive_DirectoryStream.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ public class Recursive_DirectoryStream {
1111
public static void main(String[] args) {
1212
// tag::code[]
1313
String userHome = System.getProperty("user.home");
14-
Path path = Paths.get(userHome, "arquivos");
14+
Path path = Paths.get(userHome, "files");
1515
System.out.println("Path: " + path);
1616

1717
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path)) {
18-
// iteração com sintaxe for-each
18+
// iteration with for-each syntax
1919
for (Path subPath : directoryStream) {
2020
System.out.println(subPath);
2121
}
@@ -24,7 +24,7 @@ public static void main(String[] args) {
2424
}
2525

2626
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path)) {
27-
// iteração com operação forEach e expressão lambda
27+
// iteration with forEach operation and lambda expression
2828
directoryStream.forEach(p -> System.out.println(p));
2929
} catch (IOException e) {
3030
e.printStackTrace();

src/org/j6toj8/fileio/recursiveaccess/Recursive_FileVisitor.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,38 @@
1111
public class Recursive_FileVisitor {
1212

1313
// tag::code[]
14-
static class MeuFileVisitor implements FileVisitor<Path> {
14+
static class MyFileVisitor implements FileVisitor<Path> {
1515
@Override
1616
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
17-
System.out.println("Arquivo visitado: " + file);
17+
System.out.println("Visited file: " + file);
1818
return FileVisitResult.CONTINUE;
1919
}
2020

2121
@Override
2222
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
23-
System.out.println("Antes de visitar o diretório: " + dir);
23+
System.out.println("Before visiting the directory: " + dir);
2424
return FileVisitResult.CONTINUE;
2525
}
2626

2727
@Override
2828
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
29-
System.out.println("Após de visitar o diretório: " + dir);
29+
System.out.println("After visiting the directory: " + dir);
3030
return FileVisitResult.CONTINUE;
3131
}
3232

3333
@Override
3434
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
35-
System.out.println("Falhou ao visitar o arquivo: " + file);
35+
System.out.println("Failed to visit file: " + file);
3636
return FileVisitResult.CONTINUE;
3737
}
3838
}
3939

4040
public static void main(String[] args) {
4141
String userHome = System.getProperty("user.home");
42-
Path path = Paths.get(userHome, "arquivos");
42+
Path path = Paths.get(userHome, "files");
4343
System.out.println("Path: " + path);
4444
try {
45-
Files.walkFileTree(path, new MeuFileVisitor());
45+
Files.walkFileTree(path, new MyFileVisitor());
4646
} catch (IOException e) {
4747
e.printStackTrace();
4848
}

src/org/j6toj8/fileio/recursiveaccess/Recursive_SimpleFileVisitor.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,23 @@
1111
public class Recursive_SimpleFileVisitor {
1212

1313
// tag::code[]
14-
// Implementação simples de um SimpleFileVisitor
15-
static class MeuFileVisitor extends SimpleFileVisitor<Path> {
14+
// Simple Implementation of a SimpleFileVisitor
15+
static class MyFileVisitor extends SimpleFileVisitor<Path> {
1616
@Override
1717
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
18-
// Método que será invocado a cada arquivo encontrado
19-
System.out.println("Arquivo visitado: " + file + ". Tamanho: " + attrs.size());
20-
return FileVisitResult.CONTINUE; // instrui o FileVisitor a continuar seguindo a árvore de arquivos
18+
// Method that will be invoked for each file found
19+
System.out.println("Visited file: " + file + ". Size: " + attrs.size());
20+
return FileVisitResult.CONTINUE; // instructs FileVisitor to continue following the file tree
2121
}
2222
}
2323

2424
public static void main(String[] args) {
2525
String userHome = System.getProperty("user.home");
26-
Path path = Paths.get(userHome, "arquivos");
26+
Path path = Paths.get(userHome, "files");
2727
System.out.println("Path: " + path);
2828
try {
29-
// Utilização da classe MeuFileVisitor para acessar
30-
// todos os arquivos no diretório e seus subdiretórios
31-
Files.walkFileTree(path, new MeuFileVisitor());
29+
// Using the MyFileVisitor class to access all files in the directory and their subdirectories.
30+
Files.walkFileTree(path, new MyFileVisitor());
3231
} catch (IOException e) {
3332
e.printStackTrace();
3433
}

0 commit comments

Comments
 (0)