私は自分のコードを最適化しようとしています。特定のフォルダ内のファイルを読み取り、それらをウィンドウに表示してから、それらとのさらなる作業を可能にします。すべてが意図どおりに機能していますが、フォルダ内に(100以上のような)たくさんのファイルがある場合、コンテンツのロードは実際には遅れています。ファイルを読むときにJavaのパフォーマンスを最適化する
誰でも私にこの機能を最適化する方法についてアドバイスできますか?
private void ReloadScanFiles() {
if (gsfCurRow != null) {
ArrayList<FileInfo> newTreeFileInfoList = new ArrayList<FileInfo>();
ArrayList<FileInfo> addTreeFileInfoList = new ArrayList<FileInfo>();
ArrayList<String> delTreeFileNameList = new ArrayList<String>();
File folder = new File(gsfCurRow.DOC_SOURCE_PATH);
FileFilter fileFilter = new FileFilter() {
public boolean accept(File file) {
return !file.isDirectory() && !file.isHidden();
}
};
/*
FilenameFilter fileFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".pdf") ||
name.toLowerCase().endsWith(".jpeg") ||
name.toLowerCase().endsWith(".jpg") ||
name.toLowerCase().endsWith(".tiff") ||
name.toLowerCase().endsWith(".txt");
}
};
*/
File[] listOfFiles = folder.listFiles(fileFilter);
for (int i = 0; i < listOfFiles.length; i++){
FileInfo fileInfo = new FileInfo();
fileInfo.Name = listOfFiles[i].getName();
//fileInfo.Length = (long) listOfFiles[i].length();
fileInfo.LastModified = (long) listOfFiles[i].lastModified(); //Long.parseLong("473", 10);
newTreeFileInfoList.add(fileInfo);
}
//add new items
for (FileInfo fileInfo: newTreeFileInfoList){
boolean existsItem = false;
if (actTreeFileInfoList != null){
for (FileInfo fileInfo1: actTreeFileInfoList){
if (fileInfo.Name.equals(fileInfo1.Name)) {
existsItem = true;
break;
}
}
}
if (!existsItem) {
addTreeFileInfoList.add(fileInfo);
}
}
//delete non existing items
if (actTreeFileInfoList != null){
for (FileInfo fileInfo: actTreeFileInfoList){
boolean existsItem = false;
for (FileInfo fileInfo1: newTreeFileInfoList){
if (fileInfo.Name.equals(fileInfo1.Name)) {
existsItem = true;
break;
}
}
if (!existsItem) {
delTreeFileNameList.add(fileInfo.Name);
}
}
}
actTreeFileInfoList = newTreeFileInfoList;
//add items to tree
for (FileInfo fileInfo: addTreeFileInfoList){
TreeItem item = new TreeItem(tv, SWT.NONE);
//item.setText(new String[] {fileInfo.Name, Long.toString(fileInfo.Length), df.format(fileInfo.LastModified)});
item.setText(new String[] {fileInfo.Name, null, df.format(fileInfo.LastModified)});
fileCount ++;
}
//delete item from tree
//update locked by
TreeItem [] items = tv.getItems();
for (TreeItem item: items){
//delete
if (delTreeFileNameList.contains(item.getText())) {
if (item.getChecked()) {
checkedFileCount --;
}
fileCount --;
item.dispose();
}
//update
if (!item.isDisposed()){
Integer lock_idusr = null;
try {
lock_idusr = db.FileLockedBy(gsfCurRow.DOC_SOURCE_ID, item.getText());
} catch (SQLException e) {
e.printStackTrace();
}
if ((lock_idusr != null) && (!lock_idusr.equals(idusr))){
try {
item.setText(3, db.GetOpid(lock_idusr));
} catch (SQLException e) {
e.printStackTrace();
}
Color color = new Color(display,180, 0, 0);
item.setForeground(color);
item.setChecked(false);
}
else{
item.setText(3, "");
Color color = new Color(display,0, 0, 0);
item.setForeground(color);
}
}
}
BtnDocAssignEnabled();
GenerateTreeStatusText();
}
}
あなたの投稿をhttps://codereview.stackexchange.com/に移動してください。 –
私はちょうどコードをすばやく見ましたが、私はここでスケジューラタスクを見ることができますか、プールされたexecuterサービスで管理できます。同時に同じファイルに触れないで、Files.walkerやnio操作のようないくつかのJava 7/8の機能を見てください – HRgiger