我如何有效地编写代码?当前代码需要几分钟才能读取文件,这太长了。可以更快地完成吗?没有堆栈跟踪,因为它可以工作,但是太慢了。谢谢!
问题代码:
private void list(){
String strLine2="";
wwwdf2 = new StringBuffer();
InputStream fis2 = this.getResources().openRawResource(R.raw.list);
BufferedReader br2 = new BufferedReader(new InputStreamReader(fis2));
if(fis2 != null) {
try {
LineNumberReader lnr = new LineNumberReader(br2);
String linenumber = String.valueOf(lnr);
int i=0;
while (i!=1) {
strLine2 = br2.readLine();
wwwdf2.append(strLine2 + "\n");
String contains = String.valueOf(wwwdf2);
if(contains.contains("itisdonecomplet")){
i++;
}
}
// Toast.makeText(getApplicationContext(), strLine2, Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), wwwdf2, Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用StringBuilder
代替StringBuffer
。
[StringBuffer
]已同步,您不需要这样做。
不要使用String.valueOf
,它会生成一个字符串,并使用StringBuffer
/ Builder
取反值。您正在从整个缓冲区中构建一个字符串,进行检查,丢弃该字符串,然后再次构建几乎相同的字符串。
改为使用if (wwwdf2.indexOf("itisdonecomplet") >= 0)
,这样可以避免创建字符串。
但是这仍然会相当慢,因为即使您不会构造字符串并搜索所有字符串,您仍在搜索。
您可以通过仅搜索字符串的最末尾来加快速度。例如,您可以使用wwwdf2.indexOf("itisdonecomplet", Math.max(0, wwwdf2.length() - strLine2.length() - "itisdonecomplet".length()))
。
尽管,blackapps在注释中指出,您可以简单地检查strLine2
是否包含该字符串。
append
的调用中不要使用字符串连接:请进行两个单独的调用。
wwwdf2.append(strLine2);
wwwdf2.append("\n");
您不检查是否到达文件末尾。检查strLine2
是否为空,如果为空,则中断循环。
我新创建的代码:(我的测试设备是三星S8)
private void list(){
String strLine2="";
wwwdf2 = new StringBuilder();
InputStream fis2 = this.getResources().openRawResource(R.raw.list);
BufferedReader br2 = new BufferedReader(new InputStreamReader(fis2));
if(fis2 != null) {
try {
LineNumberReader lnr = new LineNumberReader(br2);
String linenumber = String.valueOf(lnr);
int i=0;
while (i!=1) {
strLine2 = br2.readLine();
wwwdf2.append(strLine2);
wwwdf2.append("\n");
if (wwwdf2.indexOf("itisdonecomplet") >= 0){
i++;
}
}
// Toast.makeText(getApplicationContext(), strLine2, Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), wwwdf2, Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}