2014-05-08 40 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聲明。 –