2014-06-29 86 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