我有一个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根本不是必需的,并且它确实有用,因为使用它我们会缓冲流两次。
答案 0 :(得分:0)
BufferedReader
有点重量级,因为它需要理解和处理行分隔符。您的案例似乎没有要求这样做,因此您可能希望在InputStreamReader
之上使用BufferedInputStream
。