把这个java代码翻译成kotlin的最好方法

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在kotlin中被视为语句,而在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 } 

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

您可以使用应用程序块来执行分配:

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