2017-01-22 37 views
1

我一直在我的頭撞牆對此已有相當一段時間,真的很感激一些幫助。
我有2個流,我想要的是從一個流中排除元素,如果他們在另一個流中。
我正在嘗試編寫一個程序來查找所有音頻文件,然後將它們寫入文件。你給它一個文件夾來檢查,並找到該文件夾​​中的所有音頻文件,並將它們全部寫入文件。這部分工作很好。如果你再次給它同一個文件夾,問題就會起作用,我希望能夠排除已經存在的音頻文件。這是有問題的代碼:

有一些真正的麻煩與流和noneMatch

Stream<Path> s = Files.walk(folder.toPath()).filter(p -> isAudio(p)); 

,然後isAudio(路徑P)方法:

try 
{ 
    if (Files.probeContentType(p).startsWith("audio")) 
    { 
     if (PS != null) 
     { 
      System.out.println("boo"); 
      System.out.println(PS.noneMatch(t -> t.equals(p.toString()))); 
      System.out.println("boo2"); 
     } 
     return true; 
    } 
} 
catch (Exception e) {System.err.println(e); } 
return false; 

PS是我第二次流,並將它從文件讀入。我已經測試過它,它是正確的。我的問題是noneMatch的結果沒有打印,「boo2」從不顯示。它每次都會跳過。它跳轉到「返回false」;每一次,我都完全失去了答案。請,我可以得到任何幫助將不勝感激!

+0

什麼是PS的東西,它在哪裏宣佈?很明顯,無關緊要的事情是你的問題的一部分。也許它阻止了某些東西?也許這是以一種奇怪的方式失敗? Catch Throwable而不僅僅是檢查的異常。如果有什麼奇怪的事情發生,你會想知道。下一步是連接一個調試器,並在noneMatch方法內部找出它正在做什麼。 –

回答

0

不知道你的系統是如何配置的,但也許你的stderr輸出是不可見的。你能嘗試用下面的代替你的catch子句嗎?

catch (Exception e) { 
    System.out.println("Exception encountered: " + e); 
    System.err.println(e); 
} 

然後嘗試重新運行代碼,也許你就可以看到「遇到異常」消息,與同時被拋出的異常一起。

+0

遇到異常:java.lang.IllegalStateException:流已經被操作或關閉 – bobthebob55

+0

我該如何解決這個問題? – bobthebob55

+0

好像你已經在你正在使用的PS流上執行了一個終端操作。 「Stream.forEach或IntStream.sum等終端操作可能會遍歷流以產生結果或副作用,執行終端操作後,流管道將被視爲已耗盡,並且不能再使用;如果您需要再次遍歷相同的數據源,則必須返回到數據源以獲取新的流。「 - https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html –

0

也許你應該嘗試的調用分成兩個:

的文件
  1. 篩選與audio在他們的名字
  2. 不同他們通過有key(名稱)

像這樣的東西(僞代碼):

yourFiles.filter(t -> "*audio*".matches(t)).filter(distinctByKey(e -> e.getAbsolutePath())

Here I found the answer to problem 2 (stackoverflow link)。有distinctByKey方法的代碼。