1

Groovyに違いがある場合は

IOUtils.copyLarge(content, output)

output << content

出力は OutputStream オブジェクトであり、コンテンツは HttpInputStream です。

また、接続から情報を取得するために正しくやっているといいのですが

def connection = (HttpURLConnection)(new URL(myURL).openConnection())
def content = connection.getContent()

ヒントを事前にありがとう!

4

1 に答える 1

2

Apache の commons-io ライブラリから参照していると仮定すると、それぞれのソースを調べると、Apacheと Groovy (別名)IOUtilsの主な違いが明らかになります。つまり、Groovy の呼び出しは次のとおりです。IOUtils.copyLargeOutputStream.leftShift<<Thread.yield();

https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/IOGroovyMethods.java#L207

この場合、 から何も読み取られてInputStreamいないが、まだ最後に達していない場合、スレッドは一時停止し、他のスレッドを続行できるようにしますが、 IOUtils は、 の処理が完了するまでそのスレッドを単にブロックしますInputStream。これは、Groovy の<<オペレーターがIOUtils.copyLarge、その時点で操作している他のスレッドとそれらの相対的な優先度に応じて、異なる動作をする可能性があることを意味します。

HttpURLConnection.getContent()の型を実際に返しますObject。これは であるHttpInputStream可能性がありますが、そうではない可能性があるため、次の方法でそのオブジェクトのタイプを確認する必要があります。

if (content instanceof HttpInputStream) {
    output << content
} else {
    // Handle error condition
}
于 2013-03-14T18:06:45.187 に答える