#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
в качестве итератора и в качестве переменной для хранения того, что вы пишете.