Skip to content

Commit fdf5924

Browse files
committed
feat(file-improvements): Seção de Files com Java 8.
Criação da Seção sobre a utilização dos novos métodos da classe Files, acrescentados no Java 8, que retornam Streams. Ref. Issue #36
1 parent bfd84db commit fdf5924

7 files changed

Lines changed: 333 additions & 1 deletion

File tree

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
:java-package: src/org/j6toj8/fileio
2+
:section-java-package: ../../../{java-package}
3+
4+
=== Files com Streams
5+
6+
.Objetivo
7+
--------------------------------------------------
8+
Find a file by using the PathMatcher interface, and use Java SE 8 I/O improvements, including Files.find(), Files.walk(), and lines() methods
9+
-
10+
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()
11+
--------------------------------------------------
12+
13+
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.
14+
15+
. É possível criar um _Stream_ para acessar todos os arquivos, diretórios e subdiretórios de um `Path`.
16+
+
17+
[source,java,indent=0]
18+
.{java-package}/fileimprovements/Improvements_Walk.java
19+
----
20+
include::{section-java-package}/fileimprovements/Improvements_Walk.java[tag=code]
21+
----
22+
+
23+
.Saída no console
24+
[source,console]
25+
----
26+
Path: /home/rinaldo/arquivos
27+
28+
Todos os arquivos e diretórios:
29+
/home/rinaldo/arquivos
30+
/home/rinaldo/arquivos/arquivo1.txt
31+
/home/rinaldo/arquivos/arquivo3.txt
32+
/home/rinaldo/arquivos/subpasta1
33+
/home/rinaldo/arquivos/subpasta1/subpasta12
34+
/home/rinaldo/arquivos/subpasta1/subpasta12/arquivo122.txt
35+
/home/rinaldo/arquivos/subpasta1/subpasta12/arquivo121.txt
36+
/home/rinaldo/arquivos/subpasta1/arquivo11.txt
37+
/home/rinaldo/arquivos/subpasta1/subpasta11
38+
/home/rinaldo/arquivos/subpasta1/arquivo12.txt
39+
/home/rinaldo/arquivos/subpasta1/arquivo13.txt
40+
/home/rinaldo/arquivos/arquivo2.txt
41+
42+
Os primeiro 5 arquivos e diretórios:
43+
/home/rinaldo/arquivos
44+
/home/rinaldo/arquivos/arquivo1.txt
45+
/home/rinaldo/arquivos/arquivo3.txt
46+
/home/rinaldo/arquivos/subpasta1
47+
/home/rinaldo/arquivos/subpasta1/subpasta12
48+
----
49+
+
50+
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`.
51+
52+
. Existe uma versão do método `walk` para definir opções adicionais e limitar a profundidade do acesso aos subdiretórios.
53+
+
54+
[source,java,indent=0]
55+
.{java-package}/fileimprovements/Improvements_WalkDepth.java
56+
----
57+
include::{section-java-package}/fileimprovements/Improvements_WalkDepth.java[tag=code]
58+
----
59+
+
60+
.Saída no console
61+
[source,console]
62+
----
63+
Path: /home/rinaldo/arquivos
64+
65+
Arquivos e Links simbólicos até o segundo nível:
66+
/home/rinaldo/arquivos
67+
/home/rinaldo/arquivos/arquivo1.txt
68+
/home/rinaldo/arquivos/arquivo3.txt
69+
/home/rinaldo/arquivos/subpasta1
70+
/home/rinaldo/arquivos/subpasta1/subpasta12
71+
/home/rinaldo/arquivos/subpasta1/arquivo11.txt
72+
/home/rinaldo/arquivos/subpasta1/subpasta11
73+
/home/rinaldo/arquivos/subpasta1/arquivo12.txt
74+
/home/rinaldo/arquivos/subpasta1/arquivo13.txt
75+
/home/rinaldo/arquivos/arquivo2.txt
76+
----
77+
78+
. É possível pesquisar por um arquivo utilizando o método `find` e filtrar por atributos.
79+
+
80+
[source,java,indent=0]
81+
.{java-package}/fileimprovements/Improvements_Find.java
82+
----
83+
include::{section-java-package}/fileimprovements/Improvements_Find.java[tag=code]
84+
----
85+
+
86+
.Saída no console
87+
[source,console]
88+
----
89+
Path: /home/rinaldo/arquivos
90+
91+
Todos os arquivos, ignorando diretórios, até o segundo nível:
92+
/home/rinaldo/arquivos/arquivo1.txt
93+
/home/rinaldo/arquivos/arquivo3.txt
94+
/home/rinaldo/arquivos/subpasta1/arquivo11.txt
95+
/home/rinaldo/arquivos/subpasta1/arquivo12.txt
96+
/home/rinaldo/arquivos/subpasta1/arquivo13.txt
97+
/home/rinaldo/arquivos/arquivo2.txt
98+
----
99+
+
100+
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.
101+
102+
. É possível listar o conteúdo de um `Path` utilizando o método `list`.
103+
+
104+
[source,java,indent=0]
105+
.{java-package}/fileimprovements/Improvements_List.java
106+
----
107+
include::{section-java-package}/fileimprovements/Improvements_List.java[tag=code]
108+
----
109+
+
110+
.Saída no console
111+
[source,console]
112+
----
113+
Path: /home/rinaldo/arquivos
114+
115+
Listagem do diretório:
116+
/home/rinaldo/arquivos/arquivo1.txt
117+
/home/rinaldo/arquivos/arquivo3.txt
118+
/home/rinaldo/arquivos/subpasta1
119+
/home/rinaldo/arquivos/arquivo2.txt
120+
121+
Listagem do diretório com filtro:
122+
/home/rinaldo/arquivos/arquivo1.txt
123+
/home/rinaldo/arquivos/arquivo3.txt
124+
/home/rinaldo/arquivos/arquivo2.txt
125+
----
126+
+
127+
Perceba que o `list` não apresenta elementos dos subdiretórios.
128+
129+
. É possível recuperar todas as linhas de um arquivo como um _Stream_ utilizando o método `lines`.
130+
+
131+
[source,java,indent=0]
132+
.{java-package}/fileimprovements/Improvements_Lines.java
133+
----
134+
include::{section-java-package}/fileimprovements/Improvements_Lines.java[tag=code]
135+
----
136+
+
137+
.Saída no console
138+
[source,console]
139+
----
140+
Path: /home/rinaldo/arquivos/subpasta1/arquivo11.txt
141+
142+
Conteúdo do arquivo:
143+
1
144+
2
145+
3
146+
4
147+
5
148+
149+
Conteúdo do arquivo:
150+
3
151+
4
152+
5
153+
----
154+
155+
156+
****
157+
158+
* Presenting the New Stream Methods
159+
+
160+
Boyarsky, Jeanne; Selikoff, Scott. OCP: Oracle Certified Professional Java SE 8 Programmer II Study Guide (p. 486). Wiley. Edição do Kindle.
161+
162+
* https://www.baeldung.com/java-list-directory-files[List Files in a Directory in Java.]
163+
164+
* https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html[Class Files.] Java Plataform SE 7.
165+
166+
****

ch07-java-file-io.asc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33

44
include::book/07-java-file-io/sections/01-paths.asc[]
55
include::book/07-java-file-io/sections/02-files.asc[]
6-
include::book/07-java-file-io/sections/03-recursive-access.asc[]
6+
include::book/07-java-file-io/sections/03-recursive-access.asc[]
7+
include::book/07-java-file-io/sections/04-file-improvements.asc[]
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.j6toj8.fileio.fileimprovements;
2+
3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.Path;
6+
import java.nio.file.Paths;
7+
8+
public class Improvements_Find {
9+
10+
public static void main(String[] args) {
11+
// tag::code[]
12+
String userHome = System.getProperty("user.home");
13+
Path path = Paths.get(userHome, "arquivos");
14+
System.out.println("Path: " + path);
15+
16+
try {
17+
System.out.println("\nTodos os arquivos, ignorando diretórios, até o segundo nível: ");
18+
// ao chamar o find:
19+
// primeiro argumento: o path inicial
20+
// segundo argumento: o limite de profundidade
21+
// terceiro argumento: expressão lambda para filtrar
22+
Files.find(path, 2, (p, a) -> a.isRegularFile())
23+
.forEach(System.out::println);
24+
} catch (IOException e) {
25+
e.printStackTrace();
26+
}
27+
// end::code[]
28+
}
29+
30+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.j6toj8.fileio.fileimprovements;
2+
3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.Path;
6+
import java.nio.file.Paths;
7+
8+
public class Improvements_Lines {
9+
10+
public static void main(String[] args) {
11+
// tag::code[]
12+
String userHome = System.getProperty("user.home");
13+
Path path = Paths.get(userHome, "arquivos", "subpasta1", "arquivo11.txt");
14+
System.out.println("Path: " + path);
15+
16+
try {
17+
System.out.println("\nConteúdo do arquivo: ");
18+
Files.lines(path) // recupera todas as linhas do arquivo como Stream
19+
.forEach(System.out::println);
20+
} catch (IOException e) {
21+
e.printStackTrace();
22+
}
23+
24+
try {
25+
System.out.println("\nConteúdo do arquivo maior que 2: ");
26+
Files.lines(path)
27+
.filter(s -> Integer.parseInt(s) > 2) // filtra maior que 2
28+
.forEach(System.out::println);
29+
} catch (IOException e) {
30+
e.printStackTrace();
31+
}
32+
// end::code[]
33+
}
34+
35+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.j6toj8.fileio.fileimprovements;
2+
3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.Path;
6+
import java.nio.file.Paths;
7+
8+
public class Improvements_List {
9+
10+
public static void main(String[] args) {
11+
// tag::code[]
12+
String userHome = System.getProperty("user.home");
13+
Path path = Paths.get(userHome, "arquivos");
14+
System.out.println("Path: " + path);
15+
16+
try {
17+
System.out.println("\nListagem do diretório: ");
18+
Files.list(path)
19+
.forEach(System.out::println);
20+
} catch (IOException e) {
21+
e.printStackTrace();
22+
}
23+
24+
try {
25+
System.out.println("\nListagem do diretório, apenas arquivos: ");
26+
Files.list(path)
27+
.filter(p -> Files.isRegularFile(p))
28+
.forEach(System.out::println);
29+
} catch (IOException e) {
30+
e.printStackTrace();
31+
}
32+
33+
// end::code[]
34+
}
35+
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.j6toj8.fileio.fileimprovements;
2+
3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.Path;
6+
import java.nio.file.Paths;
7+
8+
public class Improvements_Walk {
9+
10+
public static void main(String[] args) {
11+
// tag::code[]
12+
String userHome = System.getProperty("user.home");
13+
Path path = Paths.get(userHome, "arquivos");
14+
System.out.println("Path: " + path);
15+
16+
try {
17+
System.out.println("\nTodos os arquivos e diretórios: ");
18+
Files.walk(path) // cria o stream
19+
.forEach(System.out::println); // imprime no console
20+
} catch (IOException e) {
21+
e.printStackTrace();
22+
}
23+
24+
try {
25+
System.out.println("\nOs primeiro 5 arquivos e diretórios: ");
26+
Files.walk(path)
27+
.limit(5)
28+
.forEach(System.out::println);
29+
} catch (IOException e) {
30+
e.printStackTrace();
31+
}
32+
33+
// end::code[]
34+
}
35+
36+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.j6toj8.fileio.fileimprovements;
2+
3+
import java.io.IOException;
4+
import java.nio.file.FileVisitOption;
5+
import java.nio.file.Files;
6+
import java.nio.file.Path;
7+
import java.nio.file.Paths;
8+
9+
public class Improvements_WalkDepth {
10+
11+
public static void main(String[] args) {
12+
// tag::code[]
13+
String userHome = System.getProperty("user.home");
14+
Path path = Paths.get(userHome, "arquivos");
15+
System.out.println("Path: " + path);
16+
17+
try {
18+
System.out.println("\nArquivos e Links simbólicos até o segundo nível: ");
19+
Files.walk(path, 2, FileVisitOption.FOLLOW_LINKS)
20+
.forEach(System.out::println);
21+
} catch (IOException e) {
22+
e.printStackTrace();
23+
}
24+
25+
// end::code[]
26+
}
27+
28+
}

0 commit comments

Comments
 (0)