Android: неполная перезапись текстового файла

#android #file #text #overwrite

#Android #файл #текст #перезапись

Вопрос:

Мой телефон работает под управлением Android 4.0.4 и находится в режиме протокола передачи мультимедиа (MTP). Мое приложение пытается перезаписать тот же текстовый файл на SD-карте телефона с помощью файлов большего размера, используя последовательные вызовы следующего кода:

 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 я мог открыть файл, записанный с последними данными, но время и размер измененной даты соответствовали более ранней записи файла, и я мог видеть только столько символов, сколько соответствовало этому размеру. Фактически новые данные в старом файле.

Я просмотрел Интернет, но, похоже, никто не сообщал о такой проблеме. Я перепробовал множество более причудливых способов записи файла, включая использование буферизованных классов и даже удаление и воссоздание файла перед его перезаписью, но все безрезультатно.

После перезагрузки телефона проблема, похоже, исчезла, но мне интересно, звонит ли это кому-нибудь.

Ответ №1:

То, что публикуется через интерфейс MTP, — это то, что MediaStore известно о файле. В MediaStore конечном итоге он получит ваши изменения быстрее, если вы используете что-то вроде MediaScannerConnection упреждающего сообщения о том, что файл изменился.

Однако то, что выбирают клиенты MTP, зависит от них. В общем, они, похоже, кэшируют результаты, и я не знаю, имеет ли MTP какую-либо «нажимную» семантику, чтобы сообщить клиенту MTP: «Эй, что-то, о чем вы просили немного назад, изменилось». Некоторые могут перезагружать содержимое на основе опции «перезагрузить» или «обновить» в пользовательском интерфейсе клиента MTP. Другие могут предположить, что содержимое остается неизменным до тех пор, пока устройство не будет отключено и повторно подключено.

В общем, я бы не стал отстаивать ваш подход (постоянное добавление к одному и тому же файлу, когда пользователь ожидает, что сможет увидеть эти изменения в режиме реального времени), просто из-за очевидных ограничений MTP.

Комментарии:

1. Это имеет большой смысл, @CommonsWare. К счастью, я полагался только на MTP для простоты во время разработки, поскольку пользователь будет получать доступ к файлу удаленно через Airdroid или аналогичный. Похоже, мнения о том, одинаково ли удобна отладка по USB с помощью MTP или MSC.

2. @user3787658: Если под MSC вы подразумеваете USB-накопитель, который использовался для Android 1.x / 2.x. Тогда у вас вообще не было бы возможности записывать в файл, пока он был смонтирован как диск на главном компьютере. MTP, по крайней мере, позволяет одновременный доступ, хотя и с ограничениями.

3. Да, я имел в виду USB порт для подключения к устройству c lass. Спасибо, что указали, что USB-накопитель на самом деле не ускорит разработку. Теперь я знаю, что проблема заключается просто в видимости, я могу перестать беспокоиться об этом. Кстати, я уже использовал приложение для повторного сканирования SD, чтобы попытаться улучшить синхронизацию, но обычно мне также приходится отключать и подключать USB-кабель!

4. @user3787658: Другой вариант, который вы могли бы рассмотреть, — это встроить в ваше приложение крошечный веб-сервер, который обслуживает файл. Я нервничаю из-за этого в производственном коде, но для разработки это более разумно. У вас может даже быть какая-то статическая страница «оболочки», которая выполняет временные перезагрузки сгенерированного контента, чтобы избавить вас от необходимости перезагружать веб-браузер.

5. Да, я стараюсь избегать «дорогих» сервисов, таких как www.noip.com , но веб-сервер для разработки имеет большой смысл.