сохранить список строк в файл, так как вы его сравниваете

Я сохраняю в файл двойной список (mydata), который представляет собой некоторые данные, которые вводит пользователь, и список строк (dates_Strings), который является текущей датой.

Пользователь вводит некоторые данные и нажимает кнопку «Сохранить», я сохраняю данные и текущую дату.

Итак, пользователь может ввести «1» и нажать «Сохранить» (1, 05.08.13)

введите "2" и нажмите сохранить (2, 05.08.13).

Поскольку пользователь может вводить данные в течение дня (одна и та же дата), я не хочу сохранять много экземпляров даты. Я хочу сохранить все данные пользователя в эту дату.

Я пробовал что-то вроде:

 for (int i=1;i<mydata.size();i++){

                  bw.write(mydata.get(i)+",");
            while (!(dates_Strings.get(i).equals(dates_Strings.get(i-1))))            
                       bw.write(dates_Strings.get(i)+"\n");
              }

но он сохраняет только последние введенные данные.

Я сохраняю как:

File sdCard = Environment.getExternalStorageDirectory();
        File directory = new File (sdCard, "MyFiles");
        directory.mkdirs();            
        File file = new File(directory, filename);

        FileOutputStream fos;

        //saving them
        try {
           fos = new FileOutputStream(file,true); //true in order to append

              BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

              for (int i=1;i<mydata.size();i++){

                    //if (!(dates_Strings.get(i).equals(dates_Strings.get(i-1))))             
                         bw.write(mydata.get(i)+","+dates_Strings.get(i)+"\n");
              }
              value.setText("");
              bw.flush();
              bw.close();

            } catch (IOException e2) {
               e2.printStackTrace();
                }//catch
    }

Я загружаю как:

 File sdCard = Environment.getExternalStorageDirectory();
    File directory = new File (sdCard, "MyFiles");
    File file = new File(directory, filename);

    String s;

    FileInputStream fis;

   try {
      fis = new FileInputStream(file);

         BufferedReader br = new BufferedReader(new InputStreamReader(fis));

         do {
             s = br.readLine();     
             if (s != null ){
                 String[] splitLine = s.split(",");
                 mydata.add(Double.parseDouble(splitLine[0]));
                 //dates_Strings.add(thedate.parse(splitLine[1]));
                 dates_Strings.add(splitLine[1]);
       }                        
             } while (s != null );
          br.close();                      
       } catch (IOException e) {
          e.printStackTrace();
           }
}

person George    schedule 08.05.2013    source источник
comment
Вы найдете ответ в этой старой теме: stackoverflow.com/questions/1625234/   -  person Dek Dekku    schedule 08.05.2013
comment
@DekDekku: спасибо, но это другое дело. Я уже добавляю данные в файл.   -  person George    schedule 08.05.2013
comment
Можно ли переключиться на сохранение двоичной структуры данных?   -  person Fildor    schedule 08.05.2013
comment
О, извините, теперь я понял. Вы хотите обновить запись в файле. У меня была такая же проблема, и я просто переписал файл. Как насчет использования базы данных документов, такой как Redis или Mongo?   -  person Dek Dekku    schedule 08.05.2013
comment
@Fildo: я не знаю о двоичных структурах данных, поэтому думаю, что нет.   -  person George    schedule 08.05.2013
comment
@Dek Dekku: я не знаком с этим, я не знаю..   -  person George    schedule 08.05.2013
comment
Курс MongoDB для разработчиков Java только начинается на веб-сайте 10gen: education.10gen.com/courses Возможно, вы не будете использовать его в этом проекте, но если у вас есть несколько часов в неделю, чтобы потратить на него, попробуйте.   -  person Dek Dekku    schedule 08.05.2013


Ответы (2)


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

//Asumming your values are these:
        List<String> datesList = new ArrayList<String>();
        List<Double> dataList = new ArrayList<Double>();
        //You must fill your data of course...
        //I use a buffer to put in order my data

        StringBuffer stringAppender = new StringBuffer();       
        for (int i = 0; i < dataList.size(); i++) {
            stringAppender.append(dataList.get(i));
            stringAppender.append(",");
            stringAppender.append(datesList.get(i));
            if (i != dataList.size()-1) {
                stringAppender.append("\n");
            }
        }
        //I use the Buffered Writer and then save all the data ordered in one single String.
        BufferedWriter bw = new BufferedWriter(new FileWriter(new File("/home/mtataje/saved.txt")));        
        bw.write(stringAppender.toString());
        bw.close();

Затем... у вас есть новые данные, верно?

        //I read my file first
    BufferedReader br = new BufferedReader(new FileReader(new File("/home/mtataje/saved.txt")));
    String line;

    StringBuffer auxBuffer = new StringBuffer();

    while ((line = br.readLine()) != null) {
        auxBuffer.append(line);
        auxBuffer.append("\n");
    }

    //Then append to the StringBuffer again, but your StringBuffer has data saved inside :)
    for (int i = 0; i < newDataListIncoming.size(); i++) {
        auxBuffer.append(newDataListIncoming.get(i));
        auxBuffer.append(",");
        auxBuffer.append(newDatesIncoming.get(i));
        if (i != newDataListIncoming.size()-1) {
            auxBuffer.append("\n");
        }
    }
    //And write your file
    BufferedWriter bw2 = new BufferedWriter(new FileWriter(new File("/home/mtataje/saved.txt")));       
    bw2.write(auxBuffer.toString());
    bw2.close();

Конечно, вы будете использовать методы и не использовать избыточность в своем коде, как я, надеюсь, я помог вам в этом. С наилучшими пожеланиями.

person Marcelo Tataje    schedule 08.05.2013
comment
: В вашем примере у вас есть строка, содержащая все данные. У меня есть список строк и двойной список. - person George; 09.05.2013
comment
Что ж, моя цель состояла в том, чтобы показать вам, как должен работать процесс, вам просто нужно было адаптировать его к вашим требованиям; однако я обновил ответ, чтобы показать вам, как это можно сделать с вашими списками (String и Double). С наилучшими пожеланиями. - person Marcelo Tataje; 09.05.2013
comment
: Прежде всего, спасибо за помощь. Я обновил, чтобы показать вам, как я сохраняю и как я загружаю. Я попробовал первый код, который у вас есть, и он сохраняет данные, но сохраняет 1 и 05/05/13 в той же ячейке Excel. я сохраняю их в разных ячейках. Мои данные находятся в столбце A, а даты - в столбце B. Помимо этого, я не могу больше реализовать ваш код. Я не использую newDataList. Я просто использую списки mydata и date_Strings. Все данные записываются там. Я просто добавляю файл. Итак, у меня проблема с реализацией вашего кода. (я не опытный пользователь) - person George; 09.05.2013
comment
ну, во-первых, вы могли бы сказать мне, что вы используете файл на основе ячеек, я думал, что вы используете просто простой текстовый файл, но я думаю, что вы используете файл результата как файл CSV для Excel или что-то в этом роде (который, кстати, я импортировал в Excel и показал мне данные в A1 и даты в B1), также, как уже упоминалось, я знаю, что вы будете использовать только свой двойной и строковый список, поскольку это приложение на основе файлов, я просто хотел чтобы показать вам последовательность того, как это должно работать. Надеюсь, вы нашли свое решение этой проблемы. С наилучшими пожеланиями. - person Marcelo Tataje; 09.05.2013
comment
: Хорошо, я думаю, вы правы. Я просто не могу понять, как применить последовательность ко всему этому. Потому что у меня есть только сохранение и загрузка, а у вас есть сохранение, загрузка, сохранение. В любом случае, спасибо! - person George; 10.05.2013

Вы должны загрузить предыдущее значение в свой файл.. прочитать его и добавить новое значение.. затем сохранить его!

person matzone    schedule 08.05.2013
comment
: Я обновил, чтобы показать вам, как я загружаю. Можете ли вы объяснить мне, что вы имеете в виду? Пример? Спасибо! - person George; 08.05.2013