10

我正在将应用程序从 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);

所以我的问题是如何使用更好的方式读取文件?

4

4 回答 4

12

使用FileInputStream.read(byte[])您可以更有效地阅读。

一般来说,您不希望将任意大小的文件读入内存。

大多数解析器将采用InputStream. 也许您可以让我们知道您是如何使用该文件的,我们可以建议更合适的。

以下是使用字节缓冲区版本的方法read()

byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
    fileContent.append(new String(buffer));
}
于 2011-03-06T10:06:20.200 回答
8

这并不是真正的 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));
于 2011-03-06T10:12:14.303 回答
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;
}
于 2014-09-23T04:57:45.527 回答
0

context.getFilesDir() 返回 context.openFileOutput() 写入文件的目录的 File 对象。

于 2018-05-05T23:13:27.527 回答