2015-10-21 25 views
3

我有以下格式一個巨大的文件: -分割線,通過閱讀使用Java 8文件處理它們流

一線
二線
三線
四線
第五行
數據1;數據2;數據3
數據1;數據2;數據3
數據1;數據2;數據3
....
....

我想我的代碼跳過前5行,然後將行的其餘部分將通過分割線「;」並與第三項進行一些字符串比較。我希望爲此目的使用Java 8 Streams,但無法弄清楚如何正確地解決它。我已經做了我想使用的BufferedReader和代碼做如下: -

try (BufferedReader reader = Files.newBufferedReader(dictionaryPath)) { 
      String line; 
      reader.readLine(); 
      reader.readLine(); 
      reader.readLine(); 
      reader.readLine(); 
      reader.readLine(); 
      while ((line = reader.readLine()) != null) { 
       String[] dictData = line.split(";"); 
       if (data.equals(dictData[2])) { 
        System.out.println("Your Data Item is: " + dictData[0]); 
        break; 
       } 
      } 
     } 

但我不知道我怎樣才能達到同樣如上使用Java 8流。我正在嘗試類似以下內容:

try (Stream<String> lines = Files.lines(dictionaryPath)) { 
     lines.skip(5).map(line -> line.split(";")).flatMap(Arrays::stream) 

但是無法理解更多內容。我希望得到一些幫助。

回答

8

你可以嘗試這樣的事情:

Files.lines(dictionaryPath) 
     .skip(5) // skip first five lines 
     .map(line -> line.split(";")) // split by ';' 
     .filter(dictData -> data.equals(dictData[2])) // filter by second element 
     .findFirst() // get first that matches and, if present, print it 
     .ifPresent(dictData -> System.out.println("Your Data Item is: " + dictData[0])); 
+0

附錄:不是100%肯定,但我認爲流將自動關閉運行後,所以試穿與資源恐怕沒有必要。 –

+3

[可惜不是](http://stackoverflow.com/a/27382060/2711488) – Holger

1

你不想撥打flatMap,因爲這會給你一個單一的條目流,你將無法正確處理它們。相反,您要

  1. 過濾謂詞data.equals所產生的陣列(dictData [2])
  2. 映射濾波陣列,讓你得到的第一個元素
  3. 每個元素,合適的打印信息。