2017-01-22 35 views
1

私はかなり長い間、これについて壁に頭を打っていて、本当に助けに感謝しています。
私は2つのストリームを持っています、そして、それらが他のストリームにある場合、1つのストリームから要素を除外することです。
すべてのオーディオファイルを検索してファイルに書き込むプログラムを作成しようとしています。あなたはそれを確認するフォルダを与え、それはそのフォルダ内のすべてのオーディオファイルを見つけてそれらをすべてファイルに書き込む。その部分は素晴らしい作品です。この問題は、同じフォルダにもう一度入力した場合に発生します。既に存在するオーディオファイルを除外したいと考えています。ここで問題のコードです:

ストリームと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のことは何ですか、それはどこに宣言されていますか?明らかに、それがマッチしていないことがあなたの問題の一部です。多分何かを妨害しているのだろうか?たぶん奇妙なやり方で失敗しているのだろうか?チェック例外の代わりに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メソッドのコードがあります。

関連する問題