gpt4 book ai didi

java - 如何发布使用 GSON 解析大型 json 文件的进度

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:35 25 4
gpt4 key购买 nike

亲爱的 Stackoverflowers,

我目前正在从我的原始资源中解析一个大的 json 文件。我不得不逐行更改读取以结合使用 Reader 对象和 gson,以逃避内存不足异常。到目前为止,还不错。

现在这一切都发生在一个异步任务中,我希望通过使用 publishProgress() 通知用户某种加载屏幕的进度。

InputStream raw = getResources().openRawResource(R.raw.json);
Reader rd = new BufferedReader(new InputStreamReader(raw));
Gson gson = new Gson();
mReadObjects = gson.fromJson(rd, ReadObjectList.class);

这是我现在读取文件的方式,但我不知道是否(以及如何)我可以从 GSON 或 Reader 对象获得任何类型的进度更新。

非常感谢任何帮助!

最佳答案

您必须围绕 InputStream(或 Reader)编写一个 Wrapper。

像这样的东西应该可以工作:

public class ProgressInputStream extends FilterInputStream {
private final int size;
private long bytesRead;
private int percent;
private List<Listener> listeners = new ArrayList<>();

public ProgressInputStream(InputStream in) {
super(in);
try {
size = available();
if (size == 0) throw new IOException();
} catch (IOException e) {
throw new RuntimeException("This reader can only be used on InputStreams with a known size", e);
}
bytesRead = 0;
percent = 0;
}

public void addListener(Listener listener) {
listeners.add(listener);
}

public void removeListener(Listener listener) {
listeners.remove(listener);
}

@Override
public int read() throws IOException {
int b = super.read();
updateProgress(1);
return b;
}

@Override
public int read(@NonNull byte[] b) throws IOException {
return updateProgress(super.read(b));
}

@Override
public int read(@NonNull byte[] b, int off, int len) throws IOException {
return updateProgress(super.read(b, off, len));
}

@Override
public long skip(long n) throws IOException {
return updateProgress(super.skip(n));
}

@Override
public void mark(int readLimit) {
throw new UnsupportedOperationException();
}

@Override
public void reset() throws IOException {
throw new UnsupportedOperationException();
}

@Override
public boolean markSupported() {
return false;
}

private <T extends Number> T updateProgress(T numBytesRead) {
if (numBytesRead.longValue() > 0) {
bytesRead += numBytesRead.longValue();
if (bytesRead * 100 / size > percent) {
percent = (int) (bytesRead * 100 / size);
for (Listener listener : listeners) {
listener.onProgressChanged(percent);
}
}
}
return numBytesRead;
}

public interface Listener {
void onProgressChanged(int percentage);
}
}

使用方法:

ProgressInputStream raw = new ProgressInputStream(getResources().openRawResource(R.raw.json));
raw.addListener(new ProgressInputStream.Listener() {
@Override
public void onProgressChanged(int percentage) {
publishProgress(percentage);
}
});
Reader rd = new BufferedReader(new InputStreamReader(raw));

关于java - 如何发布使用 GSON 解析大型 json 文件的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27890287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com