亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我該如何解決這個流讀取問題?

我該如何解決這個流讀取問題?

天涯盡頭無女友 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 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號