2012-03-28 3 views
1

私はJavaプログラムをもっと "Groovy"にしようとしています。 JavaコードはそうのようなInputStreamを読み取りますGroovy InputStream読み込みクロージャが掛かる

def myFunction(InputStream is) throws IOException { 
    int b=is.read() 
    if (b==0) return b 
    def reader = new BufferedReader(new InputStreamReader(is)) 
    reader.eachLine { println(it) } 
    println("DONE") 
    if (b == 1) throw new IOException("blah") 
    return b 
} 

それは、ストリームの内容を出力し、多くを読むためにしようとしているかのようにちょうどハング:

static int myFunction(InputStream is) throws IOException { 
    int b=is.read(); 
    if (b==0) return b; 
    StringBuffer sb=new StringBuffer(); 
    int c; 
    boolean done = false; 
    while(!done) { 
     c=is.read(); 
     sb.append((char)c); 
     if(c == '\n') { 
      done=true; 
     } 
    } 
    System.out.println(sb.toString()); 
    if (b == 1) throw new IOException("blah"); 
    return b; 
} 

私のGroovyのバージョンは、次のようになります。それは決して "DONE"(デバッグのために追加された)を出力しません。次に、is.eachByteを使用して明示的に "if(c == '\ n')return"というクロージャーを渡してみましたが、クロージャー内でのリターンがより継続的に機能し、実際には閉鎖。私が間違っていることは何か考えていますか?

答えて

1

代わりの

reader.eachLine { println(it) } 

あなたは

println reader.readLine() 
+0

感謝を試すことができます。それはうまくいった。クロージャが私のコードに戻らない理由は何ですか? – JeffMc

+0

'eachLine'は、各行を順番に読むループを永遠に繰り返すので、閉鎖を解除する方法はありません。 –

+0

これ以上の行はありませんか?それのポイントは何ですか?無限ループを望む場合にのみ使用しますか? – JeffMc

関連する問題