FileResolver Class

//文件复制解析,复制文件到cache directory 中 ,VM options : -Dvertx.disableFileCPResolving
public static final String DISABLE_CP_RESOLVING_PROP_NAME = "vertx.disableFileCPResolving";
private static final boolean ENABLE_CP_RESOLVING = !Boolean.getBoolean(DISABLE_CP_RESOLVING_PROP_NAME);/*** enableCaching 文件解析器是否用缓存,默认ture, * 设置两种方式:一、VertxOptions类的setFileResolverCachingEnabled方法* 二、设置system property,VM options "-Dvertx.disableFileCaching",对原代码无侵入性*/
public FileResolver(Vertx vertx, boolean enableCaching) {this.vertx = vertx;this.enableCaching = enableCaching;//获取工作目录 -Dvertx.cwdString cwdOverride = System.getProperty("vertx.cwd");if (cwdOverride != null) {cwd = new File(cwdOverride).getAbsoluteFile();} else {cwd = null;}if (ENABLE_CP_RESOLVING) {setupCacheDir();}
}/***  建立cache目录*/
private void setupCacheDir() {//CACHE_DIR_BASE 通过-Dvertx.cacheDirBase设置,默认当前工作目录 .vertx隐藏目录下String cacheDirName = CACHE_DIR_BASE + "/file-cache-" + UUID.randomUUID().toString();cacheDir = new File(cacheDirName);if (!cacheDir.mkdirs()) {throw new IllegalStateException("Failed to create cache dir");}// 添加 shutdown hook,kill -15 pid 触发缓存清理shutdownHook = new Thread(() -> {CountDownLatch latch = new CountDownLatch(1);deleteCacheDir(ar -> latch.countDown());try {latch.await(10, TimeUnit.SECONDS);} catch (Exception ignore) {}});Runtime.getRuntime().addShutdownHook(shutdownHook);
}/*** 删除cache目录*/
private void deleteCacheDir(Handler<AsyncResult<Void>> handler) {if (cacheDir != null && cacheDir.exists()) {vertx.fileSystem().deleteRecursive(cacheDir.getAbsolutePath(), true, handler);} else {handler.handle(Future.succeededFuture());}
}

解析文件

/*** 解析文件*/
public File resolveFile(String fileName) {// 现在disk查找文件File file = new File(fileName);if (cwd != null && !file.isAbsolute()) {//是否是绝对路径file = new File(cwd, fileName);}// -Dvertx.disableFileCPResolving 设置if (!ENABLE_CP_RESOLVING) {return file;}/*** synchronized同步块,防止多线程对cache directory操作导致线程安全问题*/synchronized (this) {if (!file.exists()) {// 首先本地文件cache 查找File cacheFile = new File(cacheDir, fileName);if (enableCaching && cacheFile.exists()) {return cacheFile;}// 在classpath 查找ClassLoader cl = getClassLoader();//检查是否是UNIX separator,不是将文件路径 \ 替换为 /,不同操作系统 separator 存在差异if (NON_UNIX_FILE_SEP) {fileName = fileName.replace(FILE_SEP, "/");}String parentFileName = file.getParent();if (parentFileName != null) {//缓存父目录中存在的所有资源URL directoryContents = cl.getResource(parentFileName);if (directoryContents != null) {unpackUrlResource(directoryContents, parentFileName, cl, true);}}URL url = cl.getResource(fileName);if (url != null) {return unpackUrlResource(url, fileName, cl, false);}}}return file;
}/*** 复制目录下所有文件到cacheDir目录下*/
private File unpackUrlResource(URL url, String fileName, ClassLoader cl, boolean isDir) {//获取协议String prot = url.getProtocol();switch (prot) {case "file":return unpackFromFileURL(url, fileName, cl);case "jar":return unpackFromJarURL(url, fileName, cl);case "bundle": // Apache Felix, Knopflerfishcase "bundleentry": // Equinoxcase "bundleresource": // Equinoxreturn unpackFromBundleURL(url, isDir);default:throw new IllegalStateException("Invalid url protocol: " + prot);}
}

note:有时启动不了Application,很大可能由于用户权限问题无法建立cache directory 所导致

转载于:https://www.cnblogs.com/cmfa/p/10550757.html

vertx.FileResolver文件解析相关推荐

  1. [翻译]运用文件解析器在任意文件中使用虚拟应用路径(~)

    原文出处:http://www.codeproject.com    Using the FileResolver to allow virtual application paths ( ~ ) i ...

  2. Json文件解析(下

    Json文件解析(下) 代码地址:https://github.com/nlohmann/json 从STL容器转换 任何序列容器(std::array,std::vector,std::deque, ...

  3. Json文件解析(上)

    Json文件解析(上) 代码地址:https://github.com/nlohmann/json 自述文件 alt=GitHub赞助商 data-canonical-src="https: ...

  4. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++: bool VideoCapture::set(int propId, double value ...

  5. OpenCV读写视频文件解析

    OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在OpenCV 中,VideoCapture 类 ...

  6. cocosstudio csd文件解析为.lua

    在学习python过程中,有幸能够看到一位大神在网页中公开的一个关于<CocosStudio 文件解析工具CsdAnalysis>的源码.本人使用稍作改变,由原有的.csd文件转换为C++ ...

  7. java解析五元组_pcap文件解析,并且按照五元组分类

    [实例简介] pcap文件解析,并按照五元组分包,全部用java语言实现. [实例截图] [核心代码] PcapTestZZ ├── PcapTestZ │   ├── 111.206.37.1930 ...

  8. 文件解析库doctotext源码分析

    doctotext中没有make install选项,make后生成可执行文件 在buile目录下面有.so动态库和头文件,需要的可以从这里面拷贝 build/doctotext就是可执行程序. do ...

  9. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

最新文章

  1. 什么叫安装文件索引服务器,搜出精彩 玩转Windows 2008系统心得
  2. python中基本程序结构_关于Python 程序格式框架的描述,正确的是( )
  3. Apache Camel入门
  4. php文件怎么设置隐藏显示代码,php文件隐藏的方法
  5. 专题导读:大数据支撑的智能应用
  6. sessionStorage与clone方法在项目中的应用
  7. 张朝阳:社交是互联网的中原 做「狐友」是要逐鹿中原
  8. c mysql dll_PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰
  9. Fade To Black《消失在黑暗中》BY Metallica [转]
  10. 经典三层模型制作学校论坛系统(BBS)
  11. 毕向东java ppt下载_毕向东Java基础ppt课件
  12. 使用opencv进行车牌提取及识别
  13. vue 实现二维码 vue-qart 和 qrcodejs2
  14. 基于Python实现的远程控制主机设计
  15. 如何让他喜欢你?让他多看一眼
  16. oracle 12c 关闭,oracle 12c的启动与关闭
  17. POST /product/:id 获取单个商品
  18. 用C/C++写一个简单的音乐播放器(基于windows控制台编程)
  19. 电子面单打印机设置 天元打印机 佳博1324D错位校准自检
  20. tomcat报错 Unable to process Jar entry

热门文章

  1. [題解](并查集)luogu_P2391 白雪皚皚
  2. 分类与监督学习,朴素贝叶斯分类算法
  3. Everything Has Changed(HDU6354+圆交+求周长)
  4. 【数字图像处理】直方图均衡化
  5. Failed to resolve: 之一
  6. IOI1999 花店橱窗布置
  7. python日记----2017.8.1
  8. 基于JAVA实现的排序算法总结
  9. Codeforces 118 D. Caesar's Legions (dp)
  10. Android的JNI开发涉及的char和string之间的互相转换