前言:一步一步来实现迷你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+"");
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()=='.'){//判断开头是否有'.',有的话截取
packageName = packageName.substring(,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);
}
}
}
扫描文件,有许多种方式,但是都离不开递归

java扫描文件。的更多相关文章

  1. java扫描文件夹下面的所有文件(递归与非递归实现)

    java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...

  2. Java扫描指定文件路径下的文件并且递归扫描其子目录下的所有文件

    本文主要实现了扫描指定文件路径下的文件,递归扫描其子目录下的所有文件信息,示例文件为: 要求将后缀为.dat的文件夹信息也写入到数据库中,然后将.chk文件解析,将文件中对应的内容读出来写入到数据库, ...

  3. Android扫描文件

    扫描文件及文件夹 package com.bwie.demo; import java.io.File; import java.io.FileFilter; import java.util.Arr ...

  4. java 大文件分割与组装

    不多说,直接上代码 1 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; im ...

  5. java实现文件监控

    文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...

  6. Java超大文件上传解决办法

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  7. H5+JAVA的文件上传,断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  8. Java实现文件夹下文件实时监控

    一.commons-io方法 1.使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的 (1)可以监控文件夹的创建.删除和修改 (2)可以监控文件的创 ...

  9. java创建文件和目录

    java创建文件和目录 2013-09-04 12:56 99933人阅读 评论(7) 收藏 举报  分类: JAVA基础(10)  版权声明:本文为博主原创文章,未经博主允许不得转载. 创建文件和目 ...

随机推荐

  1. win7下编译Microsoft版的caffe包的MATLAB接口(CPU模式)

    本博客是基于http://www.cnblogs.com/njust-ycc/p/5776286.html这篇博客修改的,做出了更正与补充. 本人机器的环境:Win7+MATLAB2014b+VS20 ...

  2. webservice学习教程(三)--

    快速入门 首先,我们来尝试一下调用别人写好的webService 来体验一把:我们访问http://www.webxml.com.cn/zh_cn/index.aspx 进入到里边 当我们输入一个号码 ...

  3. python学习笔记1-基础知识

    # 0.输入输出 # print数值型直接输出计算结果 pirnt( + ) # 输出 + = # input输入(可在括号内加提示语句) name = input('please enter you ...

  4. C#基础加强(6)之引用相等与运算符重载

    引用相等 介绍 在 C# 中可以通过 object.ReferenceEquals(obj1, obj2) 方法来判断两个变量引用的是不是同一个地址,如果是,那么就是引用相等. 引用相等是针对引用类型 ...

  5. 深浅copy

    浅拷贝 只copy了一层 可哈希的变量改变则二者不同   不可哈希变量改变二者都改变深拷贝  全部都copy了 不论什么值改变 原值都改变呢 变量赋值.浅拷贝.深拷贝 1,创建变量 1.1不可变对象 ...

  6. 使用@Autowired时,取值为null

    如果取不到,可以考虑其他方式 场景: @Autowired private StringRedisTemplate redisTemplate; 想使用redisTemplate,但是使用时为null ...

  7. Android Studio旧版(内含SDK)安装和环境变量配置 转自I-T枭

    win10下Android Studio和SDK下载.安装和环境变量配置 ------made by siwuxie095 转自I-T枭https://me.csdn.net/hahahhahahah ...

  8. python之dict(或对象)与json之间的互相转化

    在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import json导入. 在json模块有2个方法, loads():将 ...

  9. Mysql 导入CSV文件,中文内容乱码问题

    项目中用到含有中文字段的数据CSV文件,导入Mysql数据中发现中文内容乱码. 分析原因:因为数据库字符编码问题引起. [1]创建utf-8字符集数据库 CREATE DATABASE db_name ...

  10. Springboot 实现多环境配置

    多环境配置 我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发.测试.生产等.其中每个环境的数据库地址.服务器端口等等配置都会不同,如果在为不同环境打包时 ...