Не могу увидеть файл в Windows, написанный приложением для Android на SD-карте, пока я не "принудительно закрою" приложение
Я написал файл через мою программу 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), я вижу файл, но если я монтирую SD-карту в Windows, я не вижу файл!
Теперь, если я пойду Settings > Applications > Manage Applications > "Force Stop" <application>
Я могу видеть файл даже в Windows.
Что я должен сделать, чтобы я мог видеть файл в Windows, если файл записан моим приложением для Android на SD-карте, и я не хочу заходить в настройки и нажимать кнопку принудительного закрытия каждый раз.
На самом деле файл пишется правильно (я думаю), но так как поведение кнопки "назад" в Android по умолчанию не убивает приложение, и похоже, что если приложение не убито, я не могу открыть файл за пределами Android (в Android Я все еще могу это увидеть и даже открыть).
Итак, что будет лучшим решением для этого случая. Должен ли я автоматически убивать приложение, когда оно закрывается? Люди говорят, что System.exit() строго не рекомендуется.
3 ответа
Необходимо использовать следующий код, чтобы ваш архив отображался в файловой системе 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")));
Поскольку объект BufferedWriter является буфером, вам необходимо очистить буфер () для принудительной записи содержимого в выходной поток.
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() метод буфера.
Кроме того, причина того, что файл не был правильно записан до тех пор, пока вы не принудительно закроете приложение, заключается в том, что когда вы убиваете приложение, одним из шагов является очистка () всех буферов, связанных с приложением. Вот почему это происходило только тогда, когда вы убивали его силой.
Примечание: имейте в виду, что это поведение по умолчанию для большинства типов буферизованных потоков на многих разных языках.
Windows 7 действительно имела проблемы с просмотром файлов при подключении через USB. Обходным путем для меня было использование дистрибутива GNU/Linux.
При использовании термина "приложение" есть разница, когда root: корневые файлы доступны для просмотра в Проводнике, но других владельцев нет.