File io Java8流-在单个流中读取、逻辑和打印文件

File io Java8流-在单个流中读取、逻辑和打印文件,file-io,java-8,java-stream,File Io,Java 8,Java Stream,我想读取一个包含一些字符串和数字的文件,然后从字符串中筛选数字,在每行中追加所有数字,并将其打印到一个新文件中。 我知道这可能有点挑战性,但是否有可能只在一个流中做这样的事情 e、 g输入 some numbers 1 2 3 number 4 5 6 and few more number 7 8 9 e、 q输出 1+2+3 = 6 4+5+6 = 15 7+8+9 = 24 我的主要课程是考试 public class MainFiles {

我想读取一个包含一些字符串和数字的文件,然后从字符串中筛选数字,在每行中追加所有数字,并将其打印到一个新文件中。 我知道这可能有点挑战性,但是否有可能只在一个流中做这样的事情

e、 g输入

some numbers   1   2   3
number   4   5   6
and few more number  7   8   9
e、 q输出

1+2+3 = 6
4+5+6 = 15
7+8+9 = 24 
我的主要课程是考试

public class MainFiles {
    public static void main(String[] args) {

        String filePath = "src/test/recources/1000.txt";
        new FileProcesorStream().fileReader(filePath);

    }
}
到目前为止,我是这样做的

import java.util.stream.Stream;

public class FileProcesorStream {
    public void fileReader(String fileName) {

        try (Stream<String> streamReader = Files.lines(Paths.get(fileName));
             PrintWriter printWriter = new PrintWriter("resultStream.txt")) {

            streamReader
                    .filter(line -> line.matches("[\\d\\s]+"))
                    .forEachOrdered(printWriter::println);

        } catch (IOException e) {
            System.out.println("File not found");
            e.printStackTrace();
        }
    }
}
import java.util.stream.stream;
公共类FileProcesorStream{
公共void文件读取器(字符串文件名){
try(streamReader=Files.lines(path.get(fileName));
PrintWriter PrintWriter=新的PrintWriter(“resultStream.txt”)){
流阅读器
.filter(行->行.matches(“[\\d\\s]+”)
.forEachOrdered(printWriter::println);
}捕获(IOE异常){
System.out.println(“未找到文件”);
e、 printStackTrace();
}
}
}
这至少是解决这个问题的一个良好开端吗?如果不是,我应该从什么开始,或者我应该改变什么? 当然,如果只允许使用单个流。

您可以与regex
[^\\d\\s]+
一起使用,在特定的
映射
操作之后,它应该为我们提供一个只包含空格和数字的字符串,然后我们执行一个删除前导和尾随空格的操作

接下来,我们计算每一行的数字之和

streamReader
.map(line -> line.replaceAll("[^\\d\\s]+", ""))
.map(String::trim)
.mapToInt(line -> Arrays.stream(line.split(" "))
                        .map(String::trim)
                        .filter(e -> !e.isEmpty())
                        .mapToInt(Integer::parseInt)
                        .sum()
)
.forEachOrdered(printWriter::println);

在java-9中,如果您要升级,有一种更简单的方法来获取这些总和(通过
Scanner\findAll
):


有趣的是,你说的是
append
(假设
123
456
,等等);举一个例子,你做一个加法,然后接受一个只做和的答案。那么它是哪一个呢?这可以(并且应该简化),至少是您首先匹配
\\s
只在之后进行修剪的事实-首先不要匹配它。。。可能有一些方法可以通过
Stream#iterate
或诸如此类的方式使我的答案与java-8兼容,但不要想太多:|
   streamReader.map(Scanner::new)
               .mapToInt(s -> s.findAll("\\d+")
                    .map(MatchResult::group)
                    .mapToInt(Integer::parseInt)
                    .sum())
               .forEachOrdered(System.out::println);