以下代码可以正常运行,但需要花费太长时间(超过一分钟)才能打开一个小文件。 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;
}
谢谢大家!!
答案 0 :(得分:6)
在字符串上使用+=
非常效率低下 - 它会不断地分配和释放内存,这是您需要避免的事情!
如果您需要不断添加字符,请使用StringBuilder
并预先为其提供足够大的缓冲区。
但是,最好只将整个文件作为字节数组读取,然后从该字节数组中创建一个字符串。使用String(byte[])
构造函数。
答案 1 :(得分:2)
内容+ =(字符)c;
嗯,这是你的问题。如果必须重复执行,则字符串连接慢。并且你一次只读取一个字符,这也很慢。
您希望使用read(byte[] buffer)
方法有效地将文件读入缓冲区。然后,如果需要,您可以对缓冲区进行字符串化。
答案 2 :(得分:2)
不是一次只读一个字节,而应使用read(byte[])读取多个字节。
另外,字符串是不可变的,所以每次你做String s = s +“a”;您可能正在创建一个新的String对象。您可以使用StringBuilder来构建更大的字符串。
答案 3 :(得分:2)
答案 4 :(得分:0)
尝试使用缓冲区read(byte[] buff)
进行阅读答案 5 :(得分:0)
原因是:
content += (char)c;
创建过多的String对象 - 使用StringBuilder来附加读取数据,然后最后调用StringBuilder上的toString()。