除非我"强制关闭"应用程序,否则无法在sd-card上看到由Android应用程序编写的Windows文件

Atu*_*yal 13 android windows-explorer filewriter android-sdcard

我通过我的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();
Run Code Online (Sandbox Code Playgroud)

该程序完成其工作并完成.现在我点击Android上的后退按钮关闭应用程序.现在发生的事情是,如果我去Android文件浏览器(如Astro)我可以看到该文件,但如果我在Windows上安装SD卡,我看不到该文件!

现在,如果我去,__CODE__我甚至可以在Windows中看到该文件.

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

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

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

thi*_*lva 26

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

你有两种可能性:

  1. 它更快,因为android只更新传递的文件:

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

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

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

  • 不幸的是,从Kitkat Android 4.4开始,sendBroadcast方式不再起作用。:( (2认同)

L0j*_*j1k 0

因为 BufferedWriter 对象是一个buffer,所以需要对 buffer 进行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();
Run Code Online (Sandbox Code Playgroud)

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

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

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