最佳方式
问题描述:
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的最佳方法是什么?
答
而不是字面翻译的代码,使用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
}
答
你可以使用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);
}
谢谢你的提示。仍然想知道翻译此类代码的最佳方法 –
我扩展了我的答案以涵盖您的原始问题。 –
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