Чтение / запись файла во внутреннее хранилище - PullRequest
10 голосов
/ 06 марта 2011

Я портирую приложение с Symbian / iPhone на Android, часть которого сохраняет некоторые данные в файл.Я использовал FileOutputStream , чтобы сохранить файл в личной папке / data / data / имя_пакета / files :

FileOutputStream fos = iContext.openFileOutput( IDS_LIST_FILE_NAME, Context.MODE_PRIVATE ); 
fos.write( data.getBytes() ); 
fos.close();

Теперь я ищу способ какзагрузить их.Я использую FileInputStream , но он позволяет мне читать файл побайтно, что довольно неэффективно:

int ch;
StringBuffer fileContent = new StringBuffer("");
FileInputStream fis = iContext.openFileInput( IDS_LIST_FILE_NAME );
while( (ch = fis.read()) != -1)
  fileContent.append((char)ch);
String data = new String(fileContent);

Поэтому мой вопрос состоит в том, как прочитать файл, используя лучший способ?

Ответы [ 4 ]

12 голосов
/ 06 марта 2011

Используя FileInputStream.read (byte []) вы можете читать намного эффективнее.

Как правило, вы не хотите читать файлы произвольного размера в память.

Большинство парсеров будет принимать InputStream. Возможно, вы могли бы сообщить нам, как вы используете файл, и мы могли бы предложить лучшее соответствие.

Вот как вы используете версию байтового буфера read():

byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
    fileContent.append(new String(buffer));
}
8 голосов
/ 06 марта 2011

Это не совсем Android, но больше ориентировано на Java.

Если вместо этого вы предпочитаете линейно-ориентированное чтение, вы можете заключить FileInputStream в InputStreamReader, который затем можно передать в BufferedReader. Экземпляр BufferedReader имеет метод readLine (), который вы можете использовать для чтения построчно.

InputStreamReader in = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(in);
String data = br.readLine()

В качестве альтернативы, если вы используете библиотеку Google Guava , вы можете использовать вспомогательную функцию в ByteStreams :

String data = new String(ByteStreams.toByteArray(fis));
1 голос
/ 23 сентября 2014

// для записи

String data = "Hello World";
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(FILENAME,     
Context.MODE_PRIVATE));
outputStreamWriter.write(data);
outputStreamWriter.close();

// читать

String ret = "";

    try {
        InputStream inputStream = openFileInput(FILENAME);

        if ( inputStream != null ) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String receiveString = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ( (receiveString = bufferedReader.readLine()) != null ) {
                stringBuilder.append(receiveString);
            }

            inputStream.close();
            ret = stringBuilder.toString();
        }
    }
    catch (FileNotFoundException e) {
        Log.e(TAG, "File not found: " + e.toString());
    } catch (IOException e) {
        Log.e(TAG, "Can not read file: " + e.toString());
    }

    return ret;
}
0 голосов
/ 06 мая 2018

context.getFilesDir () возвращает объект File каталога, в котором context.openFileOutput () выполнял запись файла.

...