gpt4 book ai didi

java - Context.openFileInput 和 Context.openFileOutput 之间的同步

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

我有一个 Android Service 每天运行,它会进行一些数据同步。它每天下载一次文件并通过 context.openFileOutput 将其缓存到磁盘:

String fileName = Uri.parse(url).getLastPathSegment();
try (FileOutputStream outputStream =
context.openFileOutput(fileName, Context.MODE_PRIVATE)) {
outputStream.write(bytes);
// ...
} catch (IOException e) {
// logging ...
}

这发生在后台 线程上。我还有一个包含 WebView 的 UI。如果通过 context.openFileInput 可用,WebView 将使用这些缓存资源:

@Override
public WebResourceResponse shouldInterceptRequest(
WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
if (shouldUseCache(url)) {
try {
return new WebResourceResponse(
"video/webm",
Charsets.UTF_8.name(),
context.openFileInput(obtainFileName(url)));
} catch (IOException e) {
// If a cached resource fails to load, just let the WebView load it the normal way.
// logging ...
}
}
return super.shouldInterceptRequest(view, request);
}

这发生在独立于服务的另一个后台线程上。

我可以依靠 Context 实现并确保文件读写是安全的,还是我必须自己处理同步?例如。如果 Service 当前正在将数据写入文件,而 WebView 正在尝试访问它,我会遇到问题吗?如果是这样,我应该如何实现同步?

最佳答案

If the Service is currently writing data to a file and the WebView is trying to access it, will I run into a problem?

在这种情况下,您可以通过在文件名后附加一些内容并在下载完成后改回文件名来将数据写入文件。例如

context.openFileOutput(fileName + ".downloading", Context.MODE_PRIVATE))

稍后,一旦下载完成,将文件重命名为原始 fileName。我确定您会在 shouldUseCache(url) 中检查文件是否存在,以便它继续正常工作。这将避免在您尝试阅读文件时文件仍在下载的情况。

关于java - Context.openFileInput 和 Context.openFileOutput 之间的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50913738/

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