アプリケーションをSymbian/iPhoneからAndroidに移植していますが、その一部はデータをファイルに保存しています。 FileOutputStreamを使用してファイルをプライベートフォルダーに保存しました/ data/data/package_name/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);
だから私の質問は、より良い方法を使用してファイルを読み取る方法ですか?
FileInputStream.read(byte []) を使用すると、はるかに効率的に読み取ることができます。
一般に、任意のサイズのファイルをメモリに読み込むことは望ましくありません。
ほとんどのパーサーはInputStream
を取ります。おそらく、ファイルの使用方法をお知らせいただければ、より適切な方法を提案できます。
read()
のバイトバッファバージョンの使用方法は次のとおりです。
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
fileContent.append(new String(buffer));
}
これは実際にはAndroid固有ではありませんが、よりJava指向です。
代わりに行指向の読み取りを希望する場合は、FileInputStreamをInputStreamReaderでラップして、BufferedReaderに渡すことができます。 BufferedReaderインスタンスには、1行ずつ読み取るために使用できる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));
//書く
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;
}
context.getFilesDir()は、context.openFileOutput()がファイルの書き込みを行ったディレクトリのFileオブジェクトを返します。