用于提高使用缓冲读取器访问文件的性能的类顺序

时间:2017-06-11 10:07:41

标签: java performance inputstream

我有一个http调用返回的输入流。我需要将其解析为json,我正在使用库“simplejson”。

因为json解析器接受Reader作为输入,所以我必须转换输入流。我有以下两个选项,我想知道是否有明显的理由偏爱另一个。

选项1 :使用InputStreamReader实例包装输入流,然后使用BufferedReader包装阅读器:

jsonObject = (JSONObject)new JSONParser().parse(
        new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), "UTF-8")));

选项2 :用BufferedInputStream包装输入流,然后用InputStreamReader包装它:

jsonObject = (JSONObject)new JSONParser().parse(
        new InputStreamReader(new BufferedInputStream(method.getResponseBodyAsStream()), "UTF-8"));

第一个选项似乎更好,但我想知道我是否可以最终缓冲响应两次:BufferedReader和InputStreamReader都有从缓冲区读取的方法。

我更好地检查了JSON Parser中的代码,看起来它正在使用Reader中的方法来获取一个字符数组:

  /**
   * Refills the input buffer.
   *
   * @return      <code>false</code>, iff there was new input.
   * 
   * @exception   java.io.IOException  if any I/O-Error occurs
   */
  private boolean zzRefill() throws java.io.IOException {

    /* first: make room (if you can) */
    if (zzStartRead > 0) {
      System.arraycopy(zzBuffer, zzStartRead,
                       zzBuffer, 0,
                       zzEndRead-zzStartRead);

      /* translate stored positions */
      zzEndRead-= zzStartRead;
      zzCurrentPos-= zzStartRead;
      zzMarkedPos-= zzStartRead;
      zzStartRead = 0;
    }

    /* is the buffer big enough? */
    if (zzCurrentPos >= zzBuffer.length) {
      /* if not: blow it up */
      char newBuffer[] = new char[zzCurrentPos*2];
      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
      zzBuffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = zzReader.read(zzBuffer, zzEndRead,
                                            zzBuffer.length-zzEndRead);

    if (numRead > 0) {
      zzEndRead+= numRead;
      return false;
    }
    // unlikely but not impossible: read 0 characters, but not at end of stream    
    if (numRead == 0) {
      int c = zzReader.read();
      if (c == -1) {
        return true;
      } else {
        zzBuffer[zzEndRead++] = (char) c;
        return false;
      }     
    }

    // numRead < 0
    return true;
  }

我认为答案是BufferedReader根本不是必需的,并且它确实有用,因为使用它我们会缓冲流两次。

1 个答案:

答案 0 :(得分:0)

BufferedReader有点重量级,因为它需要理解和处理行分隔符。您的案例似乎没有要求这样做,因此您可能希望在InputStreamReader之上使用BufferedInputStream