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)
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);
}
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");
}
添加回答
举报