我如何查看从 GSON JsonReader 收到了多少字节
Posted
技术标签:
【中文标题】我如何查看从 GSON JsonReader 收到了多少字节【英文标题】:How can i see how many bytes was received from GSON JsonReader 【发布时间】:2013-02-14 02:09:59 【问题描述】:在阅读here 并使用 JsonWriter 和 JsonReader 创建一个要发送和接收的大型对象时。我想跟踪发送的总字节数。
【问题讨论】:
【参考方案1】:JsonWriter
或 JsonReader
中没有任何内容可以为您提供这些。
真正做到这一点的唯一方法是包装/扩展您当前传递给JsonReader
/JsonWriter
的Reader
或Writer
并跟踪正在读取/写入/输出的字节.
编辑添加:例如,您可以执行以下操作:
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
(比如BufferedWriter
),你可以扩展它,覆盖所有方法并重新调用this
上的方法而不是私有@987654332 @instance 通过构造函数传入。
【讨论】:
这是我的想法。如果有一个具有此功能的 gson 克隆,那就太好了,如果我能做到这一点,我会升级一个 这仅适用于Writer,不适用于Reader。【参考方案2】:没有从 JsonReader 获取接收字节数的默认方法。我写了一个小技巧,下面提到:
从输入流中读取字节并将它们写入内部存储文件
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 = 新的 JsonReader(inputStreamReader); parseMyJSON(jsonReader);
文件 file = new File(mContext.getFilesDir(), FILE_NAME); 文件.delete();
【讨论】:
【参考方案3】:没办法。即使您将输入流包装在某种包装器中以计算字节数(例如 apache 的 CountingInputStream),由于 JsonReader 的内部缓冲,结果也会不正确。我已经尝试了大约 300 字节长的 JSON。 CountingInputStream 报告每次读取约 4kb。
【讨论】:
以上是关于我如何查看从 GSON JsonReader 收到了多少字节的主要内容,如果未能解决你的问题,请参考以下文章
Gson使用google的JsonReader读取Json文件并转化成对象
Gson全解析之一:JsonReader的beginObject()
com.google.gson.stream.MalformedJsonException:使用 JsonReader.setLenient(true) 在将 Selenium Grid 节点注册到
Retrofit com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept