我正在将应用程序从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);
所以我的问题是如何使用更好的方式读取文件?
答案 0 :(得分:12)
使用FileInputStream.read(byte[])可以更有效地阅读。
通常,您不希望将任意大小的文件读入内存。
大多数解析器都会使用InputStream
。也许您可以告诉我们您是如何使用该文件的,我们可以建议更合适。
以下是使用read()
的字节缓冲区版本的方法:
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
fileContent.append(new String(buffer));
}
答案 1 :(得分:8)
这不是特定于Android的,而是更加面向Java。
如果您更喜欢面向行的读取,则可以将FileInputStream包装在InputStreamReader中,然后可以将其传递给BufferedReader。 BufferedReader实例有一个readLine()方法,您可以使用它逐行读取。
InputStreamReader in = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(in);
String data = br.readLine()
或者,如果您使用Google Guava library,则可以使用ByteStreams中的便捷功能:
String data = new String(ByteStreams.toByteArray(fis));
答案 2 :(得分:1)
//写
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;
}
答案 3 :(得分:0)
context.getFilesDir()返回context.openFileOutput()执行文件写入的目录的File对象。