猿问

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

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


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


天涯尽头无女友
浏览 92回答 3
3回答

汪汪一只猫

在这个地方: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)

MMMHUHU

我知道这不是您要找的东西,但数据操作有时会非常复杂,尤其是当您涉及网络时。因此,为了简单起见,我建议使用外部库JSON从URL.以下代码使用JSON.simple和Apache Commons IOJSON提供的方法从您提供的链接中检索您的文件:public void getJson() throws IOException {    java.net.URL url = new java.net.URL("https://jsonplaceholder.typicode.com/todos/1");    String json = IOUtils.toString(url, Charset.forName("UTF-8"));    System.out.println(json);}

慕容3067478

readLine 被调用了两次,InputStreamReader 应该使用源的字符集。这里我采用了 ISO-8859-1,因为它不会像 UTF-8 那样给出错误。readLine 也删除了行结尾,而 StringBuilder 更快。val streamReader: InputStreamReader = new InputStreamReader(httpsConnection.getInputStream,    "ISO-8859-1")val bufferedReader = new BufferedReader(streamReader)val stringBuilder: StringBuilder = new StringBuilder()while (true) {  val line = bufferedReader.readLine();  if (line == null) {      break;  }  stringBuilder.append(line).append("\r\n");}
随时随地看视频慕课网APP

相关分类

Java
我要回答