java - 我该如何解决这个流读取问题?

标签 java scala

我正在尝试从发送 JSON 正文的 URL 读取响应。但是我的代码无法读取完整的响应。我的代码有问题,但我没有明白。

val url: URL = new URL("https://jsonplaceholder.typicode.com/todos/1")
val httpsConnection: HttpsURLConnection = url.openConnection().asInstanceOf[HttpsURLConnection]
httpsConnection.setRequestMethod("GET")
httpsConnection.setRequestProperty("Accept", "application/json")
httpsConnection.setRequestProperty("Accept-Language", "en_US")
val streamReader: InputStreamReader = new InputStreamReader(httpsConnection.getInputStream)
val bufferedReader = new BufferedReader(streamReader)
val stringBuffer: StringBuffer =new StringBuffer()
while(bufferedReader.readLine() != null){
  stringBuffer.append(bufferedReader.readLine())
}

println(stringBuffer.toString)

上面的代码并没有给我实际的结果。 但是,如果我避免常规的 Java 风格并使用 scala 源代码:

Source.fromInputStream(httpsConnection.getInputStream,"UTF8").getLines().foreach(println)

这给出了实际的 JSON。

我的第一段代码有什么问题?

最佳答案

在这个地方:

while(bufferedReader.readLine() != null){
  stringBuffer.append(bufferedReader.readLine())
}

您首先调用 readLine 两次以检查它是否不为空,然后附加到 stringBuffer。但实际上,第二个电话会接到另一条线路,所以你每隔两行就输一次。

在 Java 中读取缓冲流的常用方法是:

String line;

while ((line = r.readLine()) != null) {
   // do your stuff...
}

但是 Scala 中的赋值返回 Unit 所以它不会工作。

那么也许使用 Stream.continually 是可行的方法?

Stream
    .continually(bufferedReader.readLine())
    .takeWhile(_ != null)
    .foreach(stringBuffer.append)

关于java - 我该如何解决这个流读取问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56343356/

相关文章:

scala - 这是什么 Scala 'new' 语法

java - 将通用通配符从 Java 转换为 Scala

scala - 在 scala Spray 框架中,如何创建多个具有不同配置(例如,超时、重试)的 http 客户端

java - 是否有与 Resharper 的 Value Origin/Destination 相当的 IntelliJ?

java - 从第二个 Java 文件调用函数时崩溃

java - 如何创建包含 Java 类层次结构的字典(在 Python 中)?

scala - 无法运行从 Scala 文件创建的 jar 文件

java - 为什么在双击和命令提示符时 Java 应用程序的行为不同

java - 有没有办法在 Android Studio 中自动完成 Activity ?

scala - 接口(interface)中的所有/大多数方法都应该返回 Option 吗?