vertx.FileResolver文件解析
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文件解析相关推荐
- [翻译]运用文件解析器在任意文件中使用虚拟应用路径(~)
原文出处:http://www.codeproject.com Using the FileResolver to allow virtual application paths ( ~ ) i ...
- Json文件解析(下
Json文件解析(下) 代码地址:https://github.com/nlohmann/json 从STL容器转换 任何序列容器(std::array,std::vector,std::deque, ...
- Json文件解析(上)
Json文件解析(上) 代码地址:https://github.com/nlohmann/json 自述文件 alt=GitHub赞助商 data-canonical-src="https: ...
- OpenCV读写视频文件解析(二)
OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++: bool VideoCapture::set(int propId, double value ...
- OpenCV读写视频文件解析
OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在OpenCV 中,VideoCapture 类 ...
- cocosstudio csd文件解析为.lua
在学习python过程中,有幸能够看到一位大神在网页中公开的一个关于<CocosStudio 文件解析工具CsdAnalysis>的源码.本人使用稍作改变,由原有的.csd文件转换为C++ ...
- java解析五元组_pcap文件解析,并且按照五元组分类
[实例简介] pcap文件解析,并按照五元组分包,全部用java语言实现. [实例截图] [核心代码] PcapTestZZ ├── PcapTestZ │ ├── 111.206.37.1930 ...
- 文件解析库doctotext源码分析
doctotext中没有make install选项,make后生成可执行文件 在buile目录下面有.so动态库和头文件,需要的可以从这里面拷贝 build/doctotext就是可执行程序. do ...
- 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
最新文章
- 什么叫安装文件索引服务器,搜出精彩 玩转Windows 2008系统心得
- python中基本程序结构_关于Python 程序格式框架的描述,正确的是( )
- Apache Camel入门
- php文件怎么设置隐藏显示代码,php文件隐藏的方法
- 专题导读:大数据支撑的智能应用
- sessionStorage与clone方法在项目中的应用
- 张朝阳:社交是互联网的中原 做「狐友」是要逐鹿中原
- c mysql dll_PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰
- Fade To Black《消失在黑暗中》BY Metallica [转]
- 经典三层模型制作学校论坛系统(BBS)
- 毕向东java ppt下载_毕向东Java基础ppt课件
- 使用opencv进行车牌提取及识别
- vue 实现二维码 vue-qart 和 qrcodejs2
- 基于Python实现的远程控制主机设计
- 如何让他喜欢你?让他多看一眼
- oracle 12c 关闭,oracle 12c的启动与关闭
- POST /product/:id 获取单个商品
- 用C/C++写一个简单的音乐播放器(基于windows控制台编程)
- 电子面单打印机设置 天元打印机 佳博1324D错位校准自检
- tomcat报错 Unable to process Jar entry
热门文章
- [題解](并查集)luogu_P2391 白雪皚皚
- 分类与监督学习,朴素贝叶斯分类算法
- Everything Has Changed(HDU6354+圆交+求周长)
- 【数字图像处理】直方图均衡化
- Failed to resolve: 之一
- IOI1999 花店橱窗布置
- python日记----2017.8.1
- 基于JAVA实现的排序算法总结
- Codeforces 118 D. Caesar's Legions (dp)
- Android的JNI开发涉及的char和string之间的互相转换