【问题标题】:Read/write file to internal private storage读/写文件到内部私人存储
【发布时间】:2011-03-06 10:03:51
【问题描述】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复,这也是我最初的方法,但我无法获取文件大小...知道如何获取文件大小吗?该文件是某种专有格式(稍后,如果有时间,我会将其转换为 XML 并使用 InputStream 作为 XML DOM/Pull 解析器的输入...)。
    • 您应该将 FileInputStream 直接传递到您的 XML 解析器中。
    • 就读入字节缓冲区而言,您将字节缓冲区设为固定大小,然后在循环中将 read() 读入其中。当您到达文件末尾时, read() 将根据文档通知您。这是 i/o 的常见模式。
    • 我把read(byte[], int, int)改成了read(byte[]),这样更容易使用。
    • 谢谢 - 大力支持。顺便说一句,您知道是否可以通过 FileOutputStream 类访问 Android 上的内部私有存储?例如。 文件?谢谢
    【解决方案2】:

    这并不是真正特定于 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));
    

    【讨论】:

      【解决方案3】:

      //写

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-10-10
          • 2013-02-19
          • 2018-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-24
          • 1970-01-01
          相关资源
          最近更新 更多