2016-08-23 71 views
3
URL url = new URL(urlSpec); 
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
InputStream in = connection.getInputStream(); 
int bytesRead = 0; 
byte[] buffer = new byte[1024]; 
while ((bytesRead = in.read(buffer)) > 0) { 
    out.write(buffer, 0, bytesRead); 
} 
out.close(); 

我特別好奇這部分最佳方式

while(bytesRead = in.read(buffer)) 

我們知道,asigements作爲在科特林報表處理,而在Java中,他們作爲表達式處理,所以這構造只能在java中使用。

將此java代碼轉換爲kotlin的最佳方法是什麼?

回答

10

而不是字面翻譯的代碼,使用Kotlin的stdlib,它提供了一些有用的擴展功能。這裏有一個版本

val text = URL(urlSpec).openConnection().inputStream.bufferedReader().use { it.readText() } 

要回答原來的問題:你說得對,作業不被視爲表達式。因此,您需要將作業和比較分開。看看在STDLIB執行情況的一個例子:

public fun Reader.copyTo(out: Writer, bufferSize: Int = DEFAULT_BUFFER_SIZE): Long { 
    var charsCopied: Long = 0 
    val buffer = CharArray(bufferSize) 
    var chars = read(buffer) 
    while (chars >= 0) { 
     out.write(buffer, 0, chars) 
     charsCopied += chars 
     chars = read(buffer) 
    } 
    return charsCopied 
} 

來源:https://github.com/JetBrains/kotlin/blob/a66fc9043437d2e75f04feadcfc63c61b04bd196/libraries/stdlib/src/kotlin/io/ReadWrite.kt#L114

+0

謝謝你的提示。仍然想知道翻譯此類代碼的最佳方法 –

+0

我擴展了我的答案以涵蓋您的原始問題。 –

+1

Kotlin stdlib版本可以使用['URL.readText']進一步簡化(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.net.-url/read-text.html ):'val text = URL(urlSpec).readText()' – mfulton26

1

你可以使用apply塊來執行任務:

val input= connection.getInputStream(); 
var bytesRead = 0; 
val buffer = ByteArray(1024) 
while (input.read(buffer).apply { bytesRead = this } > 0) { 
    out.write(buffer, 0, bytesRead); 
}