ここを読み、JsonWriterとJsonReaderを使用して送受信する大きなオブジェクトを作成している間。送信された合計バイト数を追跡したかったのです。
3 に答える
あなたにそれを提供するものは何もありませJsonWriter
んJsonReader
。
実際にそれを行う唯一の方法は、現在/に渡しているReader
orをラップ/拡張し、読み取り/書き込み中のバイトを追跡することです。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
もっとすっきりしますが...まあ、何ができますか。1 つのタイプWriter
(たとえば、 a ) のみを使用することがわかっている場合は、それを拡張し、すべてのメソッドをオーバーライドして、コンストラクターを介して渡されたプライベートインスタンス の代わりにBufferedWriter
メソッドを再呼び出しできます。this
realWriter
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(ストリーム);これで、JsonReader の入力ストリーム (ストリーム) ができました
JsonReader がこの入力ストリームを使用してデータを解析できるようにします
解析が完了したら、一時的に使用するために作成したファイルを削除します
InputStream ストリーム = mContext.openFileInput(FILE_NAME);
InputStreamReader inputStreamReader = new InputStreamReader(ストリーム);
jsonReader = 新しい JsonReader(inputStreamReader);
parseMyJSON(jsonReader);ファイル file = new File(mContext.getFilesDir(), FILE_NAME);
file.delete();
とんでもない。入力ストリームをある種のラッパーでラップしてバイトをカウントしても (例: apache の CountingInputStream)、JsonReader の内部バッファリングが原因で、結果は正しくありません。~300 バイトの長さの JSON を試しました。CountingInputStream は、毎回最大 4kb が読み取られたと報告しました。