2014-06-29 88 views
1

我的手机运行Android 4.0.4并处于媒体传输协议(MTP)模式。我的应用程序正尝试改写手机的SD卡上的同一个文本文件与进步较大的文件,使用下面的代码的连续调用:Android:不完全覆盖文本文件

File mDir = new File(Environment.getExternalStorageDirectory(), "Location"); 
File mFile = new File(mDir, "Location.txt"); 
PrintWriter mPW = new PrintWriter(mFile); 
mPW.println(sData); // sData is a string of a few hundred characters 
mPW.flush(); 
mPW.close(); 

期间USB调试模式测试,我有以下问题。在Windows 7中,我可以打开使用最新数据编写的文件,但修改日期的时间和大小对应于较早的文件写入,我只能看到与该大小相对应的字符数。旧文件中有效的新数据。

我在网上搜索,但似乎没有人报告过这类问题。我尝试了很多更好的方式来编写文件,包括使用缓冲类,甚至在重新写入文件之前删除和重新创建文件,都无济于事。

重新启动手机后,问题似乎消失了,但我不知道这是否与任何人都响了。

回答

0

通过MTP接口发布的是MediaStore知道的文件。如果您使用类似MediaScannerConnection之类的东西来主动告诉它文件已更改,MediaStore最终会更快地检测到您的更改。

但是,什么MTP 客户端选择是由他们决定。总的来说,他们似乎缓存了结果,而且我不知道MTP是否有任何类型的“推送”语义来告诉MTP客户端“嘿,你之前要求的东西已经改变了”。有些可能会根据MTP客户端UI中的“重新加载”或“刷新”选项重新加载内容。其他人可能会认为内容是不变的,直到设备被拔出并重新插入。

一般来说,我不会主张您的方法(不断追加到同一个文件,用户期望能够以实时查看这些变化),只是由于MTP的明显限制。

+0

这使得很多道理@CommonsWare。幸运的是,在开发过程中,我只是依靠MTP来简化操作,因为用户将通过Airdroid或类似软件远程访问文件。 有关USB调试是否与MTP或MSC同样满意的看法似乎有所不同。 – user3787658

+0

@ user3787658:如果是MSC,则表示USB Mass Storage,用于Android 1.x/2.x。然后,当它作为驱动器安装在主机上时,您将无法写入文件。 MTP至少允许同时​​访问,尽管有限制。 – CommonsWare

+0

是的,我的意思是USB ** m ** ass ** s ** torage device ** c ** lass。感谢您指出USB Mass Storage不会真的加快开发速度。 现在我知道问题只是一种可见性,我可以不再担心它。 顺便说一句,我已经使用SD重新扫描程序来尝试改善同步,但我通常最终也不得不拔掉并重新插入USB电缆! – user3787658