java掃描文件。


前言:一步一步來實現迷你ioc框架,前面的容器工廠也是一個鋪墊,這次的掃描文件也是一個鋪墊……

 

需求:掃描當前項目下所有文件。包括文件夾下文件夾里面的文件。利用遞歸進行掃描

ScanFileUtil類
package edu.nf.beans.util;

import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by Administrator on 2017/12/12.
 */
public class ScanUtil {

    //定義一個set來保存完整類名
    private static Set<String> classNames = new HashSet<String>();


    public static Set<String> scan(String packageName) {
        if(packageName==null){//拋異常
            throw new RuntimeException("The path can not be null.");
        }
        //傳入的包名格式為 edu.nf  進行轉換
        String packagePath = packageName.replace(".","\\");
        //根據當前線程當前執行類獲取url
        ClassLoader loader = Thread.currentThread().getContextClassLoader();

        try {
            //枚舉獲得一個路徑
            Enumeration<URL> urls = loader.getResources(packagePath);
            while (urls.hasMoreElements()){//如果不為空
                URL url = urls.nextElement();//獲取路徑
                System.out.println(url+"111");
                if("file".equals(url.getProtocol())){//如果是文件
                    String path = URLDecoder.decode(url.getPath(),"utf-8");//處理中文亂碼
                    scanFromDir(path,packageName);//進行類掃描,保存Set集合
                }
                if("jar".equals(url.getProtocol())){//如果是jar
                    JarURLConnection connection = (JarURLConnection)url.openConnection();
                    String pathjar =  URLDecoder.decode(String.valueOf(connection),"utf-8");
                    scanFromDir(pathjar,packageName);
                }
            }

        } catch (IOException e) {
            throw new RuntimeException("Resolve path error.", e);
        }

        return  classNames;
    }


    /**
     * 從項目文件獲取某包下所有類
     * @param filePath 文件目錄
     * @param packageName 包名
     */
    private static void scanFromDir(String filePath,String packageName){
        File[] files = new File(filePath).listFiles();
        packageName = packageName + ".";
        for (File childFile:files){ //遍歷文件
            if(childFile.isDirectory()){//還是文件夾就繼續遞歸
                scanFromDir(childFile.getPath(),packageName+childFile.getName());
            }else{
                String fileName = childFile.getName();//文件名
                if(fileName.endsWith(".class")){//判斷文件名是否是.class結尾
                    if(packageName.charAt(0)=='.'){//判斷開頭是否有'.',有的話截取
                        packageName = packageName.substring(1,packageName.length());
                    }
                    //拼接字符串,得到完整類名 如:edu.nf.beans.util.ScanUtil
                    String className = packageName+fileName.replace(".class","");
                   classNames.add(className);
                }
            }
        }
    }

    public static void main(String[] args) {
        Set<String> classNames=scan("edu.nf");
        for(String path:classNames){
            System.out.println(path);
        }
    }
}

掃描文件,有許多種方式,但是都離不開遞歸


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM