我有2类a和b .我正在构建一个GUI用于检索文件列表。类B用于递归,并返回一个通用的文件列表。类A用于GUI,检索文件列表并将每个文件转换为字符串。
现在,我的问题是,当我打电话System.out.println (SomeFileName.toString ());在b类中,输出速度非常快!但是当我通过类A检索相同的文件列表并将输出附加到JTextArea——那么处理速度就会变慢一百万倍。
谁能给我一个解决办法?我应该使用缓冲区吗?或者我正在查看,有人建议我使用JTextArea的文档!我正在使用NetBeans。A类的编码如下:
List<File> hoohoo = cr.catalog(partition);
Iterator<File> it = hoohoo.iterator();
while (it.hasNext()) {
File myf = it.next();
filesText.append(myf.toString() + NEWLINE);
}
B类看起来像这样::
public List<File> catalog(String file) {
List<File> fileList = new LinkedList<File>();
File myfile = new File(file);
File[] fileNme = myfile.listFiles();
for (File name : fileNme) {
if (name.isDirectory()) {
fileList.add(name);
List<File> fist = sub_Catalogue(name);
Iterator<File> it = fist.iterator();
while (it.hasNext()) {
fileList.add(it.next());
}
} else if (name.isFile()) {
fileList.add(name);
}
}
return fileList;
}
private List<File> sub_Catalogue(File name) {
List<File> fileList2 = new LinkedList<File>();
File[] names = name.listFiles();
Humpty:
if (names == null) {
break Humpty;
} else {
HooHaa:
for (File n : names) {
if (n.isFile()) {
fileList2.add(n);
} else if (n.isDirectory()) {
fileList2.add(n);
List<File> fileList3 = sub_Catalogue(n);
Iterator<File> uf = fileList3.iterator();
while (uf.hasNext()) {
fileList2.add(uf.next());
}
}
}
}
return fileList2;
}
问题很可能是JTextArea在每个setText/append调用上做了大量的工作。调用那个方法一百万次会让内部字符串一次增长一点,做一些工作。在列表的大小上,你可能会得到一个O(N^2)的复杂度。
尝试以下操作:使用StringBuilder,将列表中的所有字符串组合成一个字符串。然后使用这个大字符串在JTextArea上调用setText。
构建字符串的更有效的方法是使用StringBuilder:
List<File> hoohoo = cr.catalog(partition);
Iterator<File> it = hoohoo.iterator();
StringBuilder filesSB = new StringBuilder();
while (it.hasNext()) {
File myf = it.next();
filesSB.append(myf.toString());
filesSB.append("n");
}
filesText.setText(filesSB.toString());
这是一篇关于在Swing中高效加载文本的文章:
http://users.cs.cf.ac.uk/o.f.rana/jdc/swing nov7 - 01. - txt