14

我通过我的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 卡,我看不到该文件!

现在,如果我转到SettingsApplicationsManage Applications"Force Stop" <application>,我什至可以在 Windows 中看到该文件。

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

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

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

4

3 回答 3

26

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

你有两种可能:

  1. 它更快,因为 Android 只更新通过的文件:

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

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

    context.sendBroadcast(
        new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                   Uri.parse("file://" + "path of the folder")));
    
于 2012-09-26T21:31:38.783 回答
0

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

使用终端应用程序,root:root在资源管理器上可以查看文件但其他所有者无法查看的情况有所不同。

于 2015-04-05T18:42:26.237 回答
0

因为 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() 与该应用程序关联的所有缓冲区。这就是为什么只有当你强行杀死它时才会发生这种情况。

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

于 2012-09-26T21:14:59.693 回答