在此处阅读并使用 JsonWriter 和 JsonReader 创建一个要发送和接收的大型对象时。我想跟踪发送的总字节数。
3 回答
没有任何东西JsonWriter
可以JsonReader
为你提供这些。
真正做到这一点的唯一方法是包装/扩展Reader
或Writer
您当前传递给JsonReader
/JsonWriter
并跟踪正在读取/写入/输出的字节。
编辑添加:例如,您可以执行以下操作:
class MyWriterWrapper extends Writer {
private Writer realWriter;
private int bytesWritten;
public MyWriterWrapper(Writer realWriter) {
super();
this.realWriter = realWriter;
}
public int getBytesWritten() {
return bytesWritten;
}
@Override
public Writer append(CharSequence csq) throws IOException {
realWriter.append(csq);
bytesWritten += csq.length();
return this;
}
// Implement/Override all other Writer methods the same way
}
如果是一个界面,它会更干净,Writer
但是......嗯,你能做什么。如果您知道您只会使用一种类型Writer
(例如 a BufferedWriter
),您可以扩展它,覆盖所有方法并重新调用方法,而不是通过构造函数传入 this
的私有实例。realWriter
没有从 JsonReader 获取接收字节数的默认方法。我写了一个有点棘手的 Hack,如下所述:
从输入流中读取字节并将它们写入内部存储文件
while ((count = inputStream.read(data)) != -1) { total += count; final long downloadedLength = total; final long totalLength = lengthOfData; **// Here you get the size of bytes received** outStream.write(data, 0, count); }
关闭所有打开的流(上面创建的输入和输出流)
打开新建文件的输入流
InputStream 流 = mContext.openFileInput(FILE_NAME);
InputStreamReader inputStreamReader = new InputStreamReader(stream);现在你有一个 JsonReader 的输入流(流)
让 JsonReader 使用这个输入流来解析数据
解析完成后,删除你创建的临时使用的文件
InputStream 流 = mContext.openFileInput(FILE_NAME);
InputStreamReader inputStreamReader = new InputStreamReader(stream);
jsonReader = new JsonReader(inputStreamReader);
parseMyJSON(jsonReader);文件 file = new File(mContext.getFilesDir(), FILE_NAME);
文件.删除();
没门。即使您将输入流包装在某种包装器中以计算字节数(例如 apache 的 CountingInputStream),由于 JsonReader 的内部缓冲,结果也会不正确。我已经尝试了大约 300 字节长的 JSON。CountingInputStream 报告每次读取约 4kb。