打开一个12kb的文本文件需要花费太长时间......?

时间:2010-12-01 21:45:57

标签: android sd-card fileinputstream

以下代码可以正常运行,但需要花费太长时间(超过一分钟)才能打开一个小文件。 LogCat显示了很多“## ms”中“GC_FOR_MALLOC释放#### objects / ######字节”的实例。有什么建议吗?

 File dirPath = new File(Environment.getExternalStorageDirectory(), "MyFolder");
 String content = getFile("test.txt");

 public String getFile(String file){
  String content = "";
  try {
   File dirPathFile = new File(dirPath, file);
   FileInputStream fis = new FileInputStream(dirPathFile);
   int c;
   while((c = fis.read()) != -1) {
    content += (char)c;
   }
   fis.close();
  } catch (Exception e) {
   getLog("Error (" + e.toString() + ") with: " + file);
  }
  return content;
 }

更新

这就是现在的样子:

File dirPath = new File(Environment.getExternalStorageDirectory(), "MyFolder");
String content = getFile("test.txt");

public String getFile(String file){
    String content = "";
    File dirPathFile = new File(dirPath, file);
    try {
        StringBuilder text = new StringBuilder();
        BufferedReader br = new BufferedReader(new FileReader(dirPathFile));
        String line;
        while ((line = br.readLine()) != null) {
            text.append(line);
            text.append('\n');
        }
        content = new String(text);
        } catch (Exception e) {
            getLog("Error (" + e.toString() + ") with: " + file);
    }
    return content;
}

谢谢大家!!

6 个答案:

答案 0 :(得分:6)

在字符串上使用+= 非常效率低下 - 它会不断地分配和释放内存,这是您需要避免的事情!

如果您需要不断添加字符,请使用StringBuilder并预先为其提供足够大的缓冲区。

但是,最好只将整个文件作为字节数组读取,然后从该字节数组中创建一个字符串。使用String(byte[])构造函数。

答案 1 :(得分:2)

  

内容+ =(字符)c;

嗯,这是你的问题。如果必须重复执行,则字符串连接。并且你一次只读取一个字符,这也很慢。

您希望使用read(byte[] buffer)方法有效地将文件读入缓冲区。然后,如果需要,您可以对缓冲区进行字符串化。

答案 2 :(得分:2)

不是一次只读一个字节,而应使用read(byte[])读取多个字节。

另外,字符串是不可变的,所以每次你做String s = s +“a”;您可能正在创建一个新的String对象。您可以使用StringBuilder来构建更大的字符串。

答案 3 :(得分:2)

Schlemiel the painter再次罢工!

答案 4 :(得分:0)

尝试使用缓冲区read(byte[] buff)

进行阅读

答案 5 :(得分:0)

原因是:

  1. 您正在使用content += (char)c;创建过多的String对象 - 使用StringBuilder来附加读取数据,然后最后调用StringBuilder上的toString()。
  2. 您不使用byte [](或char [],它取决于实现)缓冲区从文件中读取。通常1KB缓冲区是最佳的,而不是逐个读取。