使用java8流读入1个文件,并根据一些critera写出3个文件

Ben*_*Ben 2 java stream java-8

要清楚 - 这里的目标是使用输入和输出流,这样我以后就不会为输出构建大量列表.我只是想让java打开输入文件,并运行它,在半实时写入输出文件.

我对溪流来说是全新的.我理解了stream和lamba等的基本思想,但是不知道实现和语法的细节等等(例如,我在一些例子中看到的::语法让我感到困惑)...

在任何情况下 - 下面是一个基本完成我要做的事情的例子......

我想知道如何使用流接口,以便主文件(可能非常大)不需要同时在内存中.

谢谢!

        Set<String> set1 = fileToSet(file1);
        Set<String> set2 = fileToSet(file2);

        List<String> output1 = new ArrayList<>();
        List<String> output2 = new ArrayList<>();
        List<String> output3 = new ArrayList<>();

        for (String line : Files.readAllLines(inputPath)) {
                String subString = line.substring(0,10);

                if (set1.contains(subString)) {
                    output1.add(line);
                }
                else if (set2.contains(subString)) {
                    output2.add(line);
                }
                else {
                    output3.add(line);
                }
        }
//write out all 3 files from the collected lists
Run Code Online (Sandbox Code Playgroud)

dav*_*xxx 6

您可以使用a forEach来处理每一行并应用您的实际逻辑,您也可以使用a BufferedWriter来编写与您的逻辑匹配的行的内容:

try (Stream<String> lines = Files.lines(path);
     BufferedWriter writer1 = new BufferedWriter(new FileWriter("file1"));
     BufferedWriter writer2 = new BufferedWriter(new FileWriter("file2"));
     BufferedWriter writer3 = new BufferedWriter(new FileWriter("file3"))) {

        lines.forEach((line) -> {

            String subString = line.substring(0, 10);

            try {
                BufferedWriter writerToUse;
                if (set1.contains(subString)) {
                    writerToUse = writer1;
                } else if (set2.contains(subString)) {
                    writerToUse = writer2;
                } else {
                    writerToUse = writer3;
                }
                writerToUse.append(line);
                writerToUse.newLine();

              // lambda cannot throw checked exception not declared in the 
              // functional interface. So you have to catch IO exception in
            } catch (IOException e) {
                // TODO error processing
            }

        });
}
Run Code Online (Sandbox Code Playgroud)

  • 不应将输出添加到列表中,否则内存使用量将保持高位. (2认同)