3

以下代码有效,但打开一个小文件需要很长时间(超过一分钟)。LogCat 显示了很多“GC_FOR_MALLOC freed #### objects / ###### bytes in ##ms”的实例。有什么建议么?

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

谢谢你们!!

4

6 回答 6

6

+=在 String 上使用效率极低- 它会不断分配和释放内存,这是您需要避免的!

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

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

于 2010-12-01T21:53:01.410 回答
2

内容 += (char)c;

好吧,这是你的问题。如果您必须重复进行字符串连接,则速度会很慢。而且您一次读取一个字符,这也很慢。

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

于 2010-12-01T21:52:05.730 回答
2

与其一次读取一个字节,不如使用read(byte[])读取多个。

此外,字符串是不可变的,因此每次执行 String s = s + "a"; 您可能正在创建一个新的 String 对象。您可以改用StringBuilder来构建更大的字符串。

于 2010-12-01T21:52:59.407 回答
2

画家施莱米尔再次出击!

于 2010-12-01T21:54:53.783 回答
0

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

于 2010-12-01T21:52:10.487 回答
0

原因是:

  1. 您正在使用创建太多 String 对象content += (char)c;- 使用 StringBuilder 代替附加读取数据,然后最后在 StringBuilder 上调用 toString()。
  2. 您不使用 byte[](或 char[],这取决于实现)缓冲区从文件中读取。通常 1KB 缓冲区是最佳的,而不是一个一个字节地读取。
于 2010-12-01T21:59:46.980 回答