2014-05-08 42 views
1

考虑我想打印文件列表中的行,仅使用Java 8流API。我会如何写?如何处理流的流?

这不是我真实的情况,只是它的一个非常简化的形式。

File[] files; 
Arrays.stream(files). // what now? 

我想过从File映射它Stream<String>但后来我卡住了。

回答

6
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); } 
    } 
} 
1

你可以做这样的事情。

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); 
      } 
     }); 
    } 
} 
1

您还可以使用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); 
} 
+0

'Files.lines'抛出'IOException'。你将如何处理它? –

+0

@Tichodromamuraria Surround'Files.line' ..用try/catch或添加一个throw声明。 –