Я не могу понять, как читать данные после того, как я их сохранил

#android #file

#Android #файл

Вопрос:

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

код, который сохраняет файл и, похоже, работает

 boolean Save()
{
      String FILENAME = "hello_file";
      String string = "hello world!";
      cDate mAppoitments[];   


      try {
      FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE );

      int i;
      mAppoitments=cDates.GetUpperDates();
      for(i=0;i<cDates.getMaxAmount();i  )
      {
          i=mAppoitments[i].getMonth();
          fos.write( i  );
          i=mAppoitments[i].getDay();
          fos.write( i  );
          i=mAppoitments[i].getYear()-1900;
          fos.write( i  );            
      }

      mAppoitments=cDates.GetLowerDates();
      for(i=0;i<cDates.getMaxAmount();i  )
      {
          i=mAppoitments[i].getMonth();
          fos.write( i  );
          i=mAppoitments[i].getDay();
          fos.write( i  );
          i=mAppoitments[i].getYear()-1900;
          fos.write( i  );            
      }       
      fos.close();
      }
      // just catch all exceptions and return false
        catch (Throwable t) {
            return false;
        }

 return true;
  }
  

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

1. Все еще смущен тем, что вы пытаетесь здесь. Вы пытаетесь прочитать файл, который вы только что сохранили?

Ответ №1:

Просто откройте файл в виде потока:

 // open the file for reading
InputStream instream = openFileInput(FILENAME);
// prepare the file for reading
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
  

Чем вы можете прочитать это построчно

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

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

2. @MByD — так что просто пропустите BufferReader и UnputReader и считывайте байт за байтом из InputStream. Это просто подсказка использовать другие более «интеллектуальные» материалы и, вероятно, записывать их построчно…

3. Я согласен, но это также следует упомянуть.

Ответ №2:

У меня есть правило использовать один и тот же тип потока для чтения и записи. Итак, если вы открыли файл для записи с помощью openFileOutput , используйте openFileInput , чтобы открыть входной поток для чтения. поскольку метод write(int) записывает один байт в файл, вы можете безопасно использовать метод read() для чтения каждого байта и присвоения его переменной.

НО в ваших циклах есть большая проблема — вы изменяете i внутри цикла, не связанного с индексацией:

       i=mAppoitments[i].getMonth(); // now i might be assigned with 12
      fos.write( i  ); // you write 12
      i=mAppoitments[i].getDay(); // now you look for mAppoitments[12].getDay()
      ....
  

Используйте другую переменную, чтобы записать эти значения в файл, не изменяйте i внутри цикла. Например:

 for(i=0;i<cDates.getMaxAmount();i  )
  {
      int j;
      j=mAppoitments[i].getMonth();
      fos.write( j  );
      j=mAppoitments[i].getDay();
      fos.write( j  );
      j=mAppoitments[i].getYear()-1900;
      fos.write( j  );            
  }
  

Ответ №3:

Если вам так удобнее, вы можете обернуть выходной поток в PrinterWriter, а входную программу steam Reader — в BufferedReader. Затем вы могли бы записывать и читать строки.

Ответ №4:

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