どのように私はこのストリームの読み取り問題を解決することができますか?

MHJ:

私は、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を与えます。

コードの私の最初のセクションの問題は何ですか?

クシシュトフ・Atłasik:

この場所で:

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

あなたは呼んでいるreadLine、その後に追加し、それがnullでないかどうかを確認するために二回最初stringBufferあなたは2行ごとを失っているように、しかし実際には、2番目の呼び出しは、別の行を取得します。

Javaでバッファされたストリームを読み込むための通常の方法は次のとおりです。

String line;

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

しかし、Scalaのリターンの割り当ては、Unitそれが動作しませんので。

そのため、おそらく使用してStream.continually行く方法でしょうか?

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=335127&siteId=1
おすすめ