JDK 之资源文件管理
JDK 之资源文件管理
JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html)
一、文件资源
user.home
用户目录,如 Linux 上 root 的用户目录为 /rootuser.dir
项目工作目录
二、类路径资源
三、网络资源
java.net 包下有几个核心的类:
URL
URLConnection
URLStreamHandler
URLStreamHandlerFactory
通过 URLStreamHandlerFactory 获取 URLStreamHandler,通过这个 Handler 获取 URLConnection,进而操作各种网络资源。
JDK 1.8 中 URLStreamHandlerFactory 有一个默认的实现类 Factory,这个类是 Launcher 的内部类,代码如下:
private static URLStreamHandlerFactory factory = new Factory();
private static class Factory implements URLStreamHandlerFactory {
private static String PREFIX = "sun.net.www.protocol";
public URLStreamHandler createURLStreamHandler(String protocol) {
String name = PREFIX + "." + protocol + ".Handler";
try {
Class<?> c = Class.forName(name);
return (URLStreamHandler)c.newInstance();
} catch (ReflectiveOperationException e) {
throw new InternalError(e);
}
}
}
可以看到 JDK 默认加载 sun.net.www.protocol 包下的网络协议,JDK 默认已经实现了 jar、file、ftp、http、https 等。那如何扩展自定义协议呢?
3.1 自定义网络资源处理器
package sun.net.www.protocol.classpath;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
/**
* 自定义网络资源处理器,注意包名是 sun.net.www.protocol. + 协议名
*/
public class Handler extends URLStreamHandler {
private final static String PROTOCOL_PREFIX = "classpath:/";
@Override
protected URLConnection openConnection(URL u) throws IOException {
String urlString = u.toString();
urlString = urlString.substring(PROTOCOL_PREFIX.length());
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
return classLoader.getResource(urlString).openConnection();
}
}
测试:
@Test
public void test3() throws Exception {
URL url = new URL("classpath:/spring-context-01.xml");
URLConnection urlConnection = url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
String content = IOUtils.toString(inputStream, Charset.forName("utf-8"));
System.out.println(content);
}
补充:JDK 中 classpath 问题
JDK 启动时 Launcher 创建了 Factory 对象,并将这个对象传递到了 ExtClassLoader 和 AppClassLoader 中。
public ExtClassLoader(File[] dirs) throws IOException {
super(getExtURLs(dirs), null, factory);
}
AppClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent, factory);
}
所以可以通过 classpath 获取对应的资源文件, JDK 内部实际上通过 factory 获取对应的资源文件,一般是 jar 协议 ,如何证明这一点呢?我们做个实验:
public void test() {
URL fileUrl = getClass().getResource("/spring-context-01.xml");
URL jarUrl = getClass().getResource("/META-INF/license.txt");
// file:/F:/doc/java/code-2018/spring/target/classes/spring-context-01.xml
System.out.println(fileUrl);
// jar:file:/D:/Program_Files/Maven/LocalRepository/org/springframework/spring-core/5.1.0.RELEASE/spring-core-5.1.0.RELEASE.jar!/META-INF/license.txt
System.out.println(jarUrl);
}
四、JDK 资源管理在 Spring 中的应用
Resource
ResourceLoader
ProtocolResolver
并发编程 Reactive Stream(一)Reator
本篇主要涉及到的是 java.util.concurrent 包中的 ExecutorService。ExecutorService 就是 Java 中对线程池的实现。
时代的局限性(JKD 9 之前)
阻塞编程:无法并行计算,资源低效使用
异步编程:Callback Future
数据方向:
Reactive Streams: 推模式(Push)
Iterator: 拉模式(Pull)
编程模式
Reactive Streams: 发布订阅模式(Publish-Subscriber)
Iterator: 命令式编程模式(Imperative)
onSubscribe() 订阅事件
onNext() 订阅事件
onComplete() 订阅事件
onError() 订阅事件
request() 订阅事件
cancel() 订阅事件
Mono 异步 0-1 元素序列,Futrue<Optional<?>>
Flux 异步 0-N 元素序列,Futrue<Collection<?>>
Reactive Stream 实现:
- Java 9 Flow API
- RxJava Reactive Extension Java
- Reacotr Reactor Framwork
Java 5 前时代
Java Green Thread
Java Native Thread
编程模型
Thread
Runable
缺少线程管理的原生支持
缺少执行完成的原生支持执行
结果获取困难
缺少“锁”API
Double Check Locking不确定性
Java 5 时代
JUC
编程模型
Executor
Runable Callable
Future
Java 7 异步并行框架
Fork/Join
编程模型
ForkJoinPool
ForkJoinTask
RecursiveActive
Future的限制无法手动完成
阻塞式结果返回
无法链式多个 Future
无法合并多个 Futures结果
缺少异常处理
Java 8 异步并行框架
Fork/Join
编程模型
CompletionStage
CompletionFuture
参考:
- 《JavaBean 以及内省技术详解》:https://www.cnblogs.com/yejiurui/archive/2012/10/06/2712693.html
每天用心记录一点点。内容也许不重要,但习惯很重要!
JDK 之资源文件管理的更多相关文章
- C#资源文件管理
1.右键项目点属性; 2.点资源项,添加资源下拉框的添加现在文件,如下图: 3.直接上代码获取并复制到指定文件夹下: private void button1_Click(object sender, ...
- Phalcon资源文件管理(Assets Management)
资源文件管理(Assets Management)¶ Phalcon\Assets是一个让开发人员管理静态资源的组件,如管理css,javascript等. Phalcon\Assets\Manage ...
- WebJars 进行 css js 资源文件管理
WebJars是将这些通用的Web前端资源打包成Java的Jar包,然后借助Maven工具对其管理,保证这些Web资源版本唯一性,升级也比较容易.关于webjars资源,有一个专门的网站http:// ...
- .NET平台的资源文件管理
可以管理文本.图片等不同类型的资源 管理方式(增删改) 可以直接修改XXX.resx源文件(XML格式,文本直接管理内容,图片需要指定路径,资源名和图片名可以不同) 也可以在VS的可视化界面上进行操作 ...
- node —— 静态资源文件管理
var http = require("http"); var url = require("url"); var fs = require("fs& ...
- Spring 系列目录
Spring(https://spring.io/) 系列目录 第一篇:Spring 系列 第一章 Spring Core (1) Convert 1.1.1 Spring ConversionSer ...
- 在.NET中读取嵌入和使用资源文件的方法
转http://www.jb51.net/article/84660.htm 本文分别介绍了使用GetManifestResourceStream读取嵌入资源,和使用. resx资源文件嵌入资源,希望 ...
- [Xcode 实际操作]一、博主领进门-(3)使用资源文件夹(Assets.xcassets)导入并管理图片素材
目录:[Swift]Xcode实际操作 本文将演示如何使用资源文件夹(Assets.xcassets)导入并管理图片素材. [Assets.xcassets]资源文件夹可以方便的进行图片的管理, 在读 ...
- WebJars简介 —— 前端资源的jar包形式(以后接触到再深入总结)
对于日常的web开发而言,像css.js.images.font等静态资源文件管理是非常的混乱的.比如jQuery.Bootstrap.Vue.js等,可能每个框架使用的版本都不一样.一不注意就会出现 ...
随机推荐
- php 5.3.10 cli 模式加载php_openssl.dll
问题描述: 开启php_openssl.dll,仍提示php_openssl.dll required/Not found 原因:可能是php的版本跟php_openssl.dll的版本不一样 具体排 ...
- html开发环境
标签(空格分隔): 环境 开发环境: 市面上有很多的HTML编辑器可以选择,常见的Hbuild.Sublime Text.Dreamweare都可以用来开发HTML. 当然PyCharm也支持HTML ...
- FileReader.FileWriter 执行文本复制
//导包动作必须做,否则会出现大片错误提示 import java.io.*; class FileReaderDemo { publicstatic void main(String[] args) ...
- vue element upload上传、清除等
如果项目中可以使用file-list,那我们可以点击file-list删除文件列表: 有时候项目中是不要这个文件列表的,所以在上传成功以后,文件列表一直存在,要重新上传就必须刷新页面,所以我们需要手动 ...
- c++ STL模板(一)
一.sort函数 1.头文件:#include < algorithm>: 2.它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n): 3.Sort函数有三个参数:(第三个参 ...
- verilog之inout
1.inout 类型的data信号 写操作有效时(rd_wr_l=0):data端口输入信号,此时data为高阻态,允许对其进行赋值. 读操作有效时(rd_wr_l=1):data端口输出信号,此时d ...
- Disruptor并发框架简介
Martin Fowler在自己网站上写一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金额交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一个业务逻辑处 ...
- vcenter或workstation12导入ovf出错:硬件系列vmx 14不受支持
原因是因为导出ovf的虚拟机版本太高. 两个方法,一个强制,一个推荐. 强制 1. 打开ovf后缀文件,把<vssd:VirtualSystemType>vmx-14</vssd:V ...
- Shell脚本break和continue命令
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用 break 和 continue 来跳出循环. break命令 允许跳出所有循环(终止执行后面的所有循环). continu ...
- Mac下JDK、Maven、Tomcat、Git开发安装及环境变量配置
本文主要内容: - 1.Mac OS 10.11.6 [OS X EL Captain] - 2.Mac OS 安装Java 设置环境变量 - 3.Mac OS 安装Maven设置环境变量 - 4.M ...