java File獲取Ubuntu共享目錄 for循環遍歷速度

昨天下午修復了系統的bug(這個bug居然能佔很是高的資源,並且會影響到系統的核心服務。。。),就是下面的這兩段代碼,形成的bug。(不過這個bug僅存在於Ubuntu共享目錄下,在非共享目錄和window系統中均不會出現這個bug),最終使用foreach方法。html

     //計算長度1000/60s
     /*for(int i=0;i<picIpDir.list().length;i++) 
     {*/
     
     //省掉計算長度時間
     /*int m = picIpDir.list().length; 
     for (int i = 0; i <m; i++)
     {*/
     
     //省掉計算長度1000/60s
         for(String fileName:picIpDir.list())
        {
     //省掉獲取文件時間1000/60s
     //  String fileName = picIpDir.list()[i];
       if ((fileName.indexOf("SnapshotSubface") > 0) && (isBetween(fileName, requestImage.startTime, requestImage.endTime))) {
        File readfile = new File(picIpDir.getAbsolutePath() + File.separator + fileName);
         String imageContect = getImageBase64(readfile.getAbsolutePath());
         
         if (imageContect != null) {
           rtnList.add(imageContect);
         }
       }
     }
     return rtnList;
   }

自我感受,多是Ubuntu下計算文件夾下文件數組的長度和經過下標取圖片名花費了資源(Ubuntu共享目錄是經過路由的方式,共享windows文件夾到Ubuntu下面的。)經過foreach能夠省去計算文件夾下文件長度和經過下標取圖片名。使用foreach循環遍歷數組和集合時,無需得到數組和集合的長度,無須根據索引來訪問數組元素和集合元素,foreach循環自動遍歷數組和集合的每個元素。java

經過測試發現windows

for(int i = 0; i < picIpDir.list().length; i++)
//測試方法
 int m = picIpDir.list().length;
   for (int i = 0; i <m; i++)

每次要對list長度進行計算,1000個圖片 ,須要68s數組

 String fileName = picIpDir.list()[i];  //取下標60s

取圖片文件名,1000個圖片,時間:64241毫秒————————64秒oop

而後對java的for循環進行了學習也就明白了for循環的具體用法調優,參考博文:http://www.360doc.com/content/11/0527/11/987036_119734904.shtml學習

package stytle;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author buru
* @date 2009年11月29日15:04:04
* @qq 258274473
* @email shaliebao@163.com
* */
public class ForLoop {
/**
* just for test
* 
* @param args
*/
public static void main(String[] args) {
   List<String> list = new ArrayList<String>();
   list.add("sha");
   list.add("lie");
   list.add("bao");
   /**
   * 方法一:最普通的不加思考的寫法
   * <p>
   * 優勢:較常見,易於理解
   * <p>
   * 缺點:每次都要計算list.size()
   */
   for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
   }
   /**
   * 方法二:數組長度提取出來
   * <p>
   * 優勢:沒必要每次都計算
   * <p>
   * 缺點:一、m的做用域不夠小,違反了最小做用域原則 二、不能在for循環中操做list的大小,好比除去或新加一個元素
   */
   int m = list.size();
   for (int i = 0; i < m; i++) {
    System.out.println(list.get(i));
   }
   /**
   * 方法三:數組長度提取出來
   * <p>
   * 優勢:一、沒必要每次都計算 二、全部變量的做用域都遵循了最小範圍原則
   * <p>
   * 缺點:一、m的做用域不夠小,違反了最小做用域原則 二、不能在for循環中操做list的大小,好比除去或新加一個元素
   */
   for (int i = 0, n = list.size(); i < n; i++) {
    System.out.println(list.get(i));
   }
   /**
   * 方法四:採用倒序的寫法
   * <p>
   * 優勢:一、沒必要每次都計算 二、全部變量的做用域都遵循了最小範圍原則
   * <p>
   * 缺點:一、結果的順序會反 二、看起來不習慣,不易讀懂
   * <p>
   * 適用場合:與顯示結果順序無關的地方:好比保存以前數據的校驗
   */
   for (int i = list.size() - 1; i >= 0; i--) {
    System.out.println(list.get(i));
   }
   /**
   * 方法五:Iterator遍歷
   * <p>
   * 優勢:簡潔
   * <p>
   * 缺點:
   */
   for (Iterator<String> it = list.iterator(); it.hasNext();) {
    System.out.println(it.next());
   }
   /**
   * 方法六:jdk1.5新寫法
   * <p>
   * 優勢:簡潔結合泛型使用更簡潔
   * <p>
   * 缺點:jdk1.4向下不兼容
   */
   for (Object o : list) {
    System.out.println(o);
   }
}
}
 
此外不要在for循環內部聲明變量
如
bad:
for(;;){
Object obj = new Object();
}
good:
Object obj=null;
for(;;){
obj = new Object();
}
相關文章
相關標籤/搜索