我正在从HttpUrlConnection将文件https://www.reddit.com/r/tech/top.json?limit=100读入BufferedReader中。我已经读取了一些文件,但只读取了应有文件的1/10。如果我更改输入缓冲区的大小,它什么也不会改变-它只是在较小的块中打印相同的东西:

try{
    URL url = new URL(urlString);

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

    StringBuilder sb = new StringBuilder();

    int charsRead;
    char[] inputBuffer = new char[500];
    while(true) {
        charsRead = reader.read(inputBuffer);
        if(charsRead < 0) {
            break;
        }
        if(charsRead > 0) {
            sb.append(String.copyValueOf(inputBuffer, 0, charsRead));
            Log.d(TAG, "Value read " + String.copyValueOf(inputBuffer, 0, charsRead));
        }
    }

    reader.close();

    return sb.toString();
} catch(Exception e){
   e.printStackTrace();
}


我认为问题在于文本全部在一行上,因为它在json中的格式不正确,而BufferedReader只能花这么长时间。有没有办法解决?

最佳答案

只要read()charsRead > 0应该继续读取。每次调用读取时,读取器都会标记上次读取的位置,下一次调用将从该位置开始,并一直持续到没有其他读取对象为止。它可以读取的大小没有限制。唯一的限制是数组的大小,但是文件的整体大小没有限制。

您可以尝试以下方法:

try(InputStream is = connection.getInputStream();
   ByteArrayOutputStream baos = new ByteArrayOutputStream()) {

  int read = 0;
  byte[] buffer = new byte[4096];

  while((read = is.read(buffer)) > 0) {
    baos.write(buffer, 0, read);
  }

  return new String(baos.toByteArray(), StandardCharsets.UTF_8);
} catch (Exception ex){}


上面的方法是纯粹使用流中的字节并将其读入输出流,然后从中创建字符串。

08-05 03:27
查看更多