【发布时间】:2014-05-08 09:55:32
【问题描述】:
考虑我想打印文件列表的行,仅使用 Java 8 流 API。我该怎么写呢?
这不是我的真实案例,只是一个非常简化的形式。
File[] files;
Arrays.stream(files). // what now?
我曾想过将其从 File 映射到 Stream<String>,但后来卡住了。
【问题讨论】:
标签: java java-8 java-stream
考虑我想打印文件列表的行,仅使用 Java 8 流 API。我该怎么写呢?
这不是我的真实案例,只是一个非常简化的形式。
File[] files;
Arrays.stream(files). // what now?
我曾想过将其从 File 映射到 Stream<String>,但后来卡住了。
【问题讨论】:
标签: java java-8 java-stream
public class AllFilesLines {
public static void main(String[] args) {
File[] files = …
Arrays.stream(files).flatMap(AllFilesLines::lines)
.forEach(System.out::println);
}
static Stream<String> lines(File f) {
try { return Files.lines(f.toPath()); }
catch (IOException e) { throw new UncheckedIOException(e); }
}
}
【讨论】:
你可以这样做。
package de.lhorn.so;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Arrays;
public class SOPlayground {
public static void main(String[] args) throws Exception {
File[] files = {new File("/tmp/1.txt"), new File("/tmp/2.txt")};
Arrays.stream(files).forEach(f -> { // Stream of File
try (InputStream fis = new FileInputStream(f);
Reader isr = new InputStreamReader(fis);
BufferedReader reader = new BufferedReader(isr)) {
reader.lines().forEach(line -> { // Stream of String
System.out.println(line);
});
} catch (IOException ex) {
System.err.println(ex);
}
});
}
}
编辑:使用Files:
package de.lhorn.so;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;
public class SOPlayground {
public static void main(String[] args) throws Exception {
File[] files = {new File("/tmp/1.txt"), new File("/tmp/2.txt")};
Arrays.stream(files).forEach(f -> {
try {
Files.lines(f.toPath()).forEach(System.out::println);
} catch (IOException ex) {
System.err.println(ex);
}
});
}
}
【讨论】:
您也可以使用Files.lines。
默认情况下,它认为文件中的字符采用 UTF-8 编码,但您可以根据需要指定 Charset。
File[] files = {new File("file1.txt"), new File("file2.txt")};
for(File f : files){
Files.lines(f.toPath()).forEach(System.out::println);
}
【讨论】:
Files.lines 抛出一个IOException。你会怎么处理?
Files.line.. 使用 try/catch 或添加 throw 声明。