2017-10-31 3 views
0

私は自分のコードを最適化しようとしています。特定のフォルダ内のファイルを読み取り、それらをウィンドウに表示してから、それらとのさらなる作業を可能にします。すべてが意図どおりに機能していますが、フォルダ内に(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(); 
     } 
} 
+2

あなたの投稿をhttps://codereview.stackexchange.com/に移動してください。 –

+1

私はちょうどコードをすばやく見ましたが、私はここでスケジューラタスクを見ることができますか、プールされたexecuterサービスで管理できます。同時に同じファイルに触れないで、Files.walkerやnio操作のようないくつかのJava 7/8の機能を見てください – HRgiger

答えて

2

あなたがやった最も明白な誤りはこれです:あなたはそれがリストに既に存在だかいないかどうかを確認するために古いエントリのリスト全体を反復処理するすべての新しい要素について

 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); 
      } 
     } 

。 100個の新しいファイルを使用すると、5050回の反復が行われます。 ArrayListの代わりに、ファイル名をキーとしてMapを使用することを検討することもできます。あなたのチェックは次のようになります。

for (FileInfo fileInfo: newTreeFileInfoList){ 
    if (!actTreeFileInfoMap.containsKey(fileInfo.Name)) { 
     actTreeFileInfoMap.put(fileInfo.Name, fileInfo); 
    } 
} 

地図の実際のFileInfoは関係ない場合は、あなたが全体のチェックを省略し、代わりに地図への新FileInfoを置くことができます。これは、以前に追加されたものを新たに追加されたものに置き換えることにつながる。

関連する問題