为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

天涯尽头无女友 2022-12-21 13:14:40
我正在尝试从发送 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。我的第一部分代码有什么问题?
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

在这个地方:


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)


查看完整回答
反对 回复 2022-12-21
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

我知道这不是您要找的东西,但数据操作有时会非常复杂,尤其是当您涉及网络时。因此,为了简单起见,我建议使用外部库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);

}


查看完整回答
反对 回复 2022-12-21
?
慕容3067478

TA贡献1773条经验 获得超3个赞

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");

}


查看完整回答
反对 回复 2022-12-21
  • 3 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信