Android 在 Java 中高效阅读大文本
Android Reading a large text efficiently in Java
我的代码太慢了
如何高效地编写代码?目前代码需要几分钟才能读取文件,这太长了。这可以更快地完成吗?没有堆栈跟踪,因为它可以工作,但是太慢了。
谢谢!
问题代码:
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();
}
}
}
我的代码太慢了
如何高效地编写代码?目前代码需要几分钟才能读取文件,这太长了。这可以更快地完成吗?没有堆栈跟踪,因为它可以工作,但是太慢了。 谢谢!
问题代码:
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();
}
}
}