除非我“强制关闭”应用程序,否则在 Windows 中看不到由 Android 应用程序在 SD 卡上写入的文件

Posted

技术标签:

【中文标题】除非我“强制关闭”应用程序,否则在 Windows 中看不到由 Android 应用程序在 SD 卡上写入的文件【英文标题】:Can't see a file in Windows written by an Android app on SD card unless I "Force Close" the app 【发布时间】:2011-11-17 17:59:12 【问题描述】:

我通过我的 android 程序编写了一个文件,如下所示:

String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Files/hello.txt";
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(str + "\n");     \\ Yeah, 'str' has a value there
writer.close();

程序完成它的工作并完成。现在我点击 Android 上的后退按钮关闭应用程序。如果我然后转到 Android 文件浏览器(如 Astro),我可以看到该文件,但如果我在 Windows 上安装 SD 卡,我看不到该文件!

现在,如果我转到 设置应用程序管理应用程序“强制停止”,我什至可以在 Windows 中看到该文件。

如果文件是由我的 Android 应用程序在 SD 卡上写入的文件,我应该怎么做才能在 Windows 中看到该文件,并且我不想每次都去设置并强制关闭。

实际上文件正在正确写入(我认为),但是由于 Android '后退'按钮的默认行为不会杀死应用程序,而且看起来除非应用程序被杀死,否则我无法在外面打开文件Android(在 Android 中,我仍然可以看到它,甚至可以打开它)。

那么,对于这种情况,最好的解决方案是什么?我应该在关闭时自动终止应用程序吗?人们说 System.exit() 是绝对不推荐的。

【问题讨论】:

我也有同样的问题。自从您提出问题后,您是否能够解决它? 【参考方案1】:

您必须使用以下代码,以便您的存档显示在 Windows 的文件系统或手机的图库中。

你有两种可能:

    它更快,因为 Android 只更新传递的文件:

    MediaScannerConnection.scanFile(this, new String[]"your path here</", null, null);

    它更昂贵,因为 Android 将搜索传递路径中的所有文件。您可以只传递文件夹的路径以减少对文件的搜索:

    context.sendBroadcast(
        new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                   Uri.parse("file://" + "path of the folder")));
    

【讨论】:

这确实应该得到更多的投票 - 一个可能是常见问题的好解决方案。 谢谢。我希望这个解决方案可以帮助到很多开发者。 不幸的是 sendBroadcast 方式不再适用于 Kitkat Android 4.4。 :( 我有同样的问题,我用我的应用程序将文本文件保存到我的 sd 卡中,当我更改管理文件中的文件名时,Window explorer 看不到它们平板电脑,文件出现在 Windows 资源管理器中...我不知道为什么会这样 @ThomasTrabelsi 我会检查这个问题,我会回复你一个可能的修复。【参考方案2】:

因为BufferedWriter对象是一个缓冲区,所以需要flush()缓冲区来强制将内容写入输出流。

String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Files/hello.txt";
BufferedWriter writer = new BufferedWriter(new FileWriter(file));   
writer.write(str+"\n");
writer.flush(); // force the buffer to actually dump its data to the stream
writer.close();

当您使用缓冲区 .write() 时,请始终记住,数据将保存在缓冲区中,直到缓冲区被填充(然后自动刷新()ed),或者您强制缓冲区使用缓冲区的 .flush() 方法。

此外,在您强制关闭应用程序之前无法正确写入文件的原因是,当您终止应用程序时,所采取的步骤之一是 flush() 与该应用程序关联的所有缓冲区。这就是为什么只有在你强行杀死它时才会发生这种情况。

注意:请记住,这是许多不同语言中大多数缓冲流的默认行为。

【讨论】:

.close() 自动调用.flush()【参考方案3】:

通过 USB 连接时,Windows 7 在查看文件时确实存在问题。我的解决方法是使用 GNU/Linux 发行版。

使用终端应用程序,root:root 文件在资源管理器中可见,但其他所有者不可见。

【讨论】:

你能解释一下你的解决方案的比赛吗?

以上是关于除非我“强制关闭”应用程序,否则在 Windows 中看不到由 Android 应用程序在 SD 卡上写入的文件的主要内容,如果未能解决你的问题,请参考以下文章

除非用户登录,否则 VB6 应用程序不会按计划任务执行

除非Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。

windows 怎么强制结束任务?

在系统关闭时强制关闭应用程序

Nodejs - 除非使用完整路径,否则无法导入模块

除非收到另一条消息,否则 Websocket 客户端在握手后无法发送