我正在尝试从发送 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/