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

我有一个每天运行的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正在尝试访问它,那么我是否会遇到问题? 如果是这样,我该如何实现同步?

如果服务当前正在将数据写入文件并且WebView正在尝试访问它,我是否会遇到问题?

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

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

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