Мои бессонные ночи
Доброй ночи, булка!
Ситуация следующая:
Пришел ко мне как-то приятель и попросил написать лог для приложения на андроид. В принципе, казалось бы, ничего сложно (хоть я и знаком с жабой еле-еле) - создал файл да записал все собранные данные в него... А вот фиг.
При добавлении нового элемента в ArrayList() новый элемент записывается поверх предыдущего.
С обычными (с фиксированным количеством элементов) так же.
Пробовал создавать отдельный проект и написать пример с массивом с нуля - всё работает.
Вот код MainActivity, где, в принципе, всё происходит:
http://pastebin.mozilla-russia.org/111911
Или под катом:
package com.NFCProject;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
/* Класс Internet, наследник класса AsyncTask.
* AsyncTask - системный класс для выполнения
* тяжелых задач и передача в UI-поток результатов работы.
* В классе Internet выполняется запрос на сервер
* Класс HexUtils содержит всего один метод для
* перевода байтов в строку
* InternetListener - интерфейс, используемый в
* качестве слушателя окончания задачи в классе Internet
*/
public class MainActivity extends Activity implements InternetListener
{
// private final static String FILENAME = "secOn_log.txt"; // имя файла
// private static final String LOG_TAG = "SecOn_log";
Context context = this;
NfcAdapter adapter;
Internet internet_conn;
String id;
//Массивы с данными от меток
ArrayList<String> tag = new ArrayList<String>();
ArrayList<String> tagid = new ArrayList<String>();
ArrayList<String> tagtime = new ArrayList<String>();
//Данные для запимси файла
final String DIR_SD = "Secоn";
final String FILENAME_SD = "fileSD";
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //
adapter = NfcAdapter.getDefaultAdapter(this);
onNewIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent){
if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())){
byte[] msgs = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
id = HexUtils.bytesToHexString(msgs);
internet_conn = new Internet(this);
internet_conn.execute(id);
addTagToList(id);
}
}
@Override
public void onRequestFinished(){
writeFileSD();
}
//Этот метод возвращает текущую дату и время
private String getDateTime() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd / HH:mm:ss");
Date date = new Date();
return dateFormat.format(date);
}
//Метод записи файла (лога) на телефон
void writeFileSD() {
// проверяем доступность SD
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return;
}
// получаем путь к SD
File sdPath = Environment.getExternalStorageDirectory();
// добавляем свой каталог к пути
sdPath = new File(sdPath.getAbsolutePath() + "/" + DIR_SD);
// создаем каталог
sdPath.mkdirs();
// формируем объект File, который содержит путь к файлу
File sdFile = new File(sdPath, FILENAME_SD);
try {
String res_str;
BufferedWriter bw = new BufferedWriter(new FileWriter(sdFile)); // открываем поток для записи
bw.write("Лог программы. Не удаляйте его! Пожалуйста!");
bw.newLine();
bw.write("Список пройденных меток за последнее время:");
bw.newLine();
for (int i = 0; i < tag.size(); i++) { //Проходимся по массиву с данными
res_str = tag.get(i)+" "+tagid.get(i)+" "+tagtime.get(i)+ "/n"; //Соединяем из в строку
bw.write(res_str); //И записываем
bw.newLine();
//System.out.println(res_str);
}
bw.close();
Toast.makeText(context, "Запись завершена.", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
//Метод добавления метки в массив программы
void addTagToList(String tag_id){
tag.add("---");
tagid.add(tag_id);
tagtime.add(getDateTime());
}
}
В чем может быть проблема?
И ещё вопрос:
Как дописать информацию в файл, а не переписывать файл с нуля? Насколько мне известно FileWriter не открывает файл, а тупо создает его заново, вместо предыдущего. А FileReader позволяет файл соответственно только читать. Попробовать скопировать данные в буфер при чтении, а потом уже вставить их при записи нового файла?