Урок 75. Хранение данных. Работа с файлами.

Обсуждение уроков
_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение _ILYA_ » 26 окт 2013, 00:09

почему при записи на SD выбрасывает исключение ? :o
Тестировал на реальном устройстве android2.3.6


скажите как записывать на SD/считывать c SD, массивы чисел?
и как можно посмотреть список файлов в определенной директории?

Да и еще, в с++ я могу сохранять, данные (точнее работать с потоками) из классов, перегружая операторы << и >>. В java есть что то подобное?

huligan
Сообщения: 19
Зарегистрирован: 11 окт 2013, 12:28

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение huligan » 08 ноя 2013, 14:11

Всем привет. У меня вопрос есть по хранению данных:
Я создаю плейлист. Создание плейлиста выглядит вот так (обрывок из кода):

Код: Выделить всё

            
File file = new File(Environment.getExternalStorageDirectory() + "/Music","Test.m3u");
PrintWriter writer = new PrintWriter(file, "Unicode");
.....
    writer.println(PathToSong.toString()+"\r");
....
writer.flush();
writer.close();
Файл записывается в нужную папку, я вижу его через файловый менеджер. Но беда в том, что медиапроигрыватели не видят этот список воспроизведения.
Если открыть файл через файловый менеджер (File Commander: аля Total Commander для Android), то песни проигрываются через эту программу, а если попытаться "открыть с помощью" проигрывателя, то не открывается(если через файловый менеджер, сами проигрывателя просто не видят список).
Бывало так, что, при записи файла через дебаггер (Android Studio), проигрыватели видели файл и все проигрывалось. В общем, если проигрыватель видит файл, то он его проигрывает (например Play Music).
Что может быть не так? Могу дать больше информации, но не знаю какой :)
Так сложилось, что я сначала написал код, а потом прочитал этот урок, поэтому не знаю разницы в записи файлов через PrintWriter и BufferedWriter.

Программу тестил на Nexus 4 Android 4.3.

Заранее спасибо за совет, помощь.

SPAWN
Сообщения: 20
Зарегистрирован: 11 мар 2013, 21:59

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение SPAWN » 17 ноя 2013, 02:04

Народ, кто знает как узнать дату создания файла. Не последней модификации (file.lastModified()).

SPAWN
Сообщения: 20
Зарегистрирован: 11 мар 2013, 21:59

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение SPAWN » 17 ноя 2013, 02:07

_ILYA_ писал(а):почему при записи на SD выбрасывает исключение ? :o
Тестировал на реальном устройстве android2.3.6


скажите как записывать на SD/считывать c SD, массивы чисел?
и как можно посмотреть список файлов в определенной директории?

Да и еще, в с++ я могу сохранять, данные (точнее работать с потоками) из классов, перегружая операторы << и >>. В java есть что то подобное?
По поводу исключения. В манифесте стоит разрешение на запись?

Что бы посмотреть список файлов, нужно выполнить метод file.listFiles(), который вернет массив файлов.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение trew » 17 ноя 2013, 11:56

SPAWN писал(а):Народ, кто знает как узнать дату создания файла. Не последней модификации (file.lastModified()).
ссылка
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Gary1210
Сообщения: 6
Зарегистрирован: 22 янв 2014, 15:37

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Gary1210 » 22 янв 2014, 15:46

А если у меня нет раздела /data/data/... ? Хотя функция getFilesDir() возвращает именно его... В результате файлы где-то создаются, но записывать содержимое не хотят. Или тут что-то еще?
Аппарат Samsung Tab 3 имеет похожий раздел /Android/data/..., но файлов там нет.
Спасибо.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Foenix » 22 янв 2014, 18:24

откуда вы знаете, что нет? на телефоне вы увидите эту папку, если он рутован, если хотите увидеть - запустите прогу н а эмуляторе
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Gary1210
Сообщения: 6
Зарегистрирован: 22 янв 2014, 15:37

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Gary1210 » 23 янв 2014, 03:50

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

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Foenix » 23 янв 2014, 10:27

ну дык это нужно отдельно разбираться. если отлаживаешь на телефоне - попробуй записать для начала файл в общедоступную папку (чтоб виден был 100%) и отлаживай код (либо тут выкладывай с логами), поставь вывод в лог того, что в файл записываешь - и проверишь.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Gary1210
Сообщения: 6
Зарегистрирован: 22 янв 2014, 15:37

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Gary1210 » 23 янв 2014, 11:05

Foenix писал(а):ну дык это нужно отдельно разбираться. если отлаживаешь на телефоне - попробуй записать для начала файл в общедоступную папку (чтоб виден был 100%) и отлаживай код (либо тут выкладывай с логами), поставь вывод в лог того, что в файл записываешь - и проверишь.
Извините, я уже перестаю понимать то, что, казалось, понимал.

Моя программа ДОЛЖНА записать бинарный файл. Система всегда предлагает его писать в предопределенное место. При попытке записи файл создается, а при попытке чтения сообщает, что размер файла нулевой.

В какую общедоступную папку я могу записать файл своей программой? И что логить, если в файл ничего не попало?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Foenix » 23 янв 2014, 11:13

Система предлагает? а ты предложи свой путь.
что значит ДОЛЖНа записать? ты же что-то туда передаешь? выводи это перед записью в лог.
В какую папку? в папку на флешке, например.
Откуда я знаю что у тебя туда должно попасть и "не попало"? может быть ты и передаешь там null какой-нибудь?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение klblk » 23 янв 2014, 11:25

для получения доступа к sd карте:
1) в манифесте: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2) в коде для получения пути: Environment.getExternalStorageDirectory().getPath() (вернет что-то типа /mnt/sdcard/, к этой папке уже есть доступ из filemanager'ов)
3) проверяете действительно ли программа что-то создаёт в данной папке

а "логить" хотя бы: myFile.exists()

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Foenix » 23 янв 2014, 11:27

да экзистс у него файл.. логить надо то, что туда передается
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Gary1210
Сообщения: 6
Зарегистрирован: 22 янв 2014, 15:37

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Gary1210 » 23 янв 2014, 12:10

Foenix писал(а):Система предлагает? а ты предложи свой путь.
что значит ДОЛЖНа записать? ты же что-то туда передаешь? выводи это перед записью в лог.
В какую папку? в папку на флешке, например.
Откуда я знаю что у тебя туда должно попасть и "не попало"? может быть ты и передаешь там null какой-нибудь?
Да как предложить-то, если fileOutputStream требует простого имени, без пути.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение KamiSempai » 23 янв 2014, 12:25

Проверьте запись файла по шагам, через отладку.
Возможно, при попытке записи возникает исключение, и по всей вероятности вы заключили весь код в try catch c полным игнорированием всех исключений. В результате программа не вылетает, а код записи в файл не отрабатывает.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Foenix » 23 янв 2014, 12:37

Gary1210 писал(а):
Foenix писал(а):Система предлагает? а ты предложи свой путь.
что значит ДОЛЖНа записать? ты же что-то туда передаешь? выводи это перед записью в лог.
В какую папку? в папку на флешке, например.
Откуда я знаю что у тебя туда должно попасть и "не попало"? может быть ты и передаешь там null какой-нибудь?
Да как предложить-то, если fileOutputStream требует простого имени, без пути.
вы данный урок читали?

Код: Выделить всё

 // отрываем поток для записи
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
          openFileOutput(FILENAME, MODE_PRIVATE)));
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Gary1210
Сообщения: 6
Зарегистрирован: 22 янв 2014, 15:37

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Gary1210 » 23 янв 2014, 13:13

Спасибо всем, кто принял участие.

File f = new File(fileName);
if(!f.exists() || f.length() == 0)
throw new FileNotFoundException(fileName);

Вот этот блок все портил. И false, и 0 одновременно.
А почему портил - не понимаю. Но это будет уже другая история.

Еще раз всем спасибо.

Gary1210
Сообщения: 6
Зарегистрирован: 22 янв 2014, 15:37

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение Gary1210 » 04 фев 2014, 13:03

Помогите, кто может.

Что тут не так? Директория не создается

Это из манифеста:

<uses-permission
android:name="WRITE_EXTERNAL_STORAGE"
/>

А это из текста:

if(!Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED))
return;

File file = new File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "myFiles");
if(!file.exists())
{
if(!file.mkdir())
Log.d("MY_LOG", "false");
}

_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение _ILYA_ » 16 фев 2014, 00:42

Ни как не пойму, почему при чтении с SD возвращает пустую строку

вот код метода, для чтения с SD

Код: Выделить всё

 
// Считываниe с SD
		public static String readFileSD(String file_name)
		{
			String result = null;
		
			// Проверка доступности SD
			if(!Environment.getExternalStorageState().equals(
					Environment.MEDIA_MOUNTED))
			{
				Toast.makeText(context, "SD карта не доступна", Toast.LENGTH_LONG).show();
				return "SD карта не доступна";
			}
			
			// Получаем путь к SD
			File sd_path = Environment.getExternalStorageDirectory();
			// добавляем свой каталог к пути
			sd_path = new File(sd_path.getAbsolutePath() + "/" + DIR_SD);
			// формируем объект File содержащий путь к файлу
			File sd_file = new File(sd_path, file_name);
			
			try
			{
				// Открываем поток для чтения
				BufferedReader br = new BufferedReader(new FileReader(sd_file));
				// читаем содержимоe
				while((result = br.readLine()) != null){}
				//Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
				br.close();
				return result;
			}
			catch(FileNotFoundException e)
			{
				result = file_name + " Not found";
				e.printStackTrace();
			}
			catch(IOException e)
			{
				Toast.makeText(context, "IOException", Toast.LENGTH_SHORT).show();
				e.printStackTrace();
			}
			
			return result;
		}

_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

Re: Урок 75. Хранение данных. Работа с файлами.

Сообщение _ILYA_ » 16 фев 2014, 11:18

Понял в чем была причина возврата пустой строки. Пришлось не много изменить код

Код: Выделить всё

// Открываем поток для чтения
				BufferedReader br = new BufferedReader(new FileReader(sd_file));
				// читаем содержимоe
				String str;
				while((str = br.readLine()) != null)
				{
					result = "" + str;
				}
				
				br.close();
				return result; 
Еще ВОПРОС:
Есть приложение, которое на SD создает директорию и в процессе работы сохраняет туда файлы.
Пользователь пользовался этим приложением достаточно долго и оно создало много файлов. И в один прекрасный день, пользователь решил удалить приложение.
Удалил, но директория с файлами осталась :cry: . Так вот собственно вопрос -как сделать что бы при удалении приложения удалялось все что оно создало в процессе своей работы

Ответить