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+"");
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扫描文件。的更多相关文章
- java扫描文件夹下面的所有文件(递归与非递归实现)
java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...
- Java扫描指定文件路径下的文件并且递归扫描其子目录下的所有文件
本文主要实现了扫描指定文件路径下的文件,递归扫描其子目录下的所有文件信息,示例文件为: 要求将后缀为.dat的文件夹信息也写入到数据库中,然后将.chk文件解析,将文件中对应的内容读出来写入到数据库, ...
- Android扫描文件
扫描文件及文件夹 package com.bwie.demo; import java.io.File; import java.io.FileFilter; import java.util.Arr ...
- java 大文件分割与组装
不多说,直接上代码 1 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; im ...
- java实现文件监控
文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...
- Java超大文件上传解决办法
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- H5+JAVA的文件上传,断点续传
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- Java实现文件夹下文件实时监控
一.commons-io方法 1.使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的 (1)可以监控文件夹的创建.删除和修改 (2)可以监控文件的创 ...
- java创建文件和目录
java创建文件和目录 2013-09-04 12:56 99933人阅读 评论(7) 收藏 举报 分类: JAVA基础(10) 版权声明:本文为博主原创文章,未经博主允许不得转载. 创建文件和目 ...
随机推荐
- vue 封装组件
props 接收数据 props对象里面 键值 是对改数据的 数据类型 的规定.做了规范,使用者就只能传输指定类型的数据,否则报警告 先根据要求写出完整的代码,再一一用参数实现组件封装 这里试着封装一 ...
- ubuntu安装zabbix 3.2(转)
转自:http://www.zabbix.org.cn/viewtopic.php?f=13&t=1096本人略做了写修改. 准备工作 apt-get update apt-get upgra ...
- 如何增加Ubuntu交换空间swap
如何增加Ubuntu交换空间swap 1 使用命令查看系统内swap分区大小 green@green:~$ free -m total used free shared buff/cache ava ...
- Java设计模式之动态代理
关于Proxy: 1,他是所有动态代理的父类: 2,他可以用作创建动态代理类和动态代理对象: 3,JDK中自带的动态代理. 1,首先创建一个接口,方法申明如下: package com.proxy; ...
- 使用 acme.sh 签发续签 Let‘s Encrypt 证书 泛域名证书
1. 安装 acme.sh 安装很简单, 一个命令: curl https://get.acme.sh | sh 并创建 一个 bash 的 alias, 方便你的使用 alias acme.sh=~ ...
- 【数据结构】算法 LinkList (Reverse LinkedList) Java
反转链表,该链表为单链表. head 节点指向的是头节点. 最简单的方法,就是建一个新链表,将原来链表的节点一个个找到,并且使用头插法插入新链表.时间复杂度也就是O(n),空间复杂度就需要定义2个节点 ...
- getparameter的使用
在做项目的过程中,会遇到跳转的页面,直接打开到里面的子项,这个时候,看了UI给我设计了四个页面,如果做四个页面,肯定是可以实现的.但是这个不符合前端的设计.就在想通过点击传值进去,肯定是能够获取到的. ...
- spring源码解析2--容器的基本实现
spring的主要特性是IOC,实现IOC的关键是bean,而更关键的是如何bean的管理容器,也就是BeanFactory,本文的目标是弄清楚BeanFactory具体是怎么样的存在. 先看下最简单 ...
- 小程序 components 下的组件引入字体图标时样式不生效
在组件内的样式在引入一遍 字体图标样式, pages 下的组件不受影响,全局引入字体图标样式即刻,不需要再次引入
- Linux服务器---博客wordpress
Wordpress Wordpress是一个开源的博客平台,是搭建个人博客的首选,用户可以去wordpress中文网站寻找帮助资料 1.下载wordpress软件(https://cn.wordpre ...