读取/写入文件到内部私有存储

问题描述 投票:0回答:5

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

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

android file-io fileoutputstream fileinputstream android-file
5个回答
12
投票

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

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

大多数解析器都会采用

InputStream
。也许您可以让我们知道您如何使用该文件,我们可以建议更合适的方案。

以下是如何使用

read()
的字节缓冲区版本:

byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
    fileContent.append(new String(buffer));
}

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));

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;
}

0
投票

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


0
投票

我喜欢用最好的paneer palak tandoori鸡胸肉做饭,你没有过滤和清洗,你有兴趣,你有兴趣,我会看看你是否做得很好,你可以看到你,我有点想成为y o to y 您还有任何其他问题,请告诉您我会尽力做的最好的paneer palak tandoori 餐厅 yo oeiyy 您可以为您提供帮助 电子邮件或通过电子邮件 o to y o 您可以收到电子邮件或给我们发电子邮件或致电第一将军 U ga tum se bechani ha ha ji majak kar raha hu ma 我爱你和你

© www.soinside.com 2019 - 2024. All rights reserved.