JDK 之资源文件管理

JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html)

一、文件资源

  • user.home 用户目录,如 Linux 上 root 的用户目录为 /root
  • user.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 实现:

  1. Java 9 Flow API
  2. RxJava Reactive Extension Java
  3. 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

参考:

  1. 《JavaBean 以及内省技术详解》:https://www.cnblogs.com/yejiurui/archive/2012/10/06/2712693.html

每天用心记录一点点。内容也许不重要,但习惯很重要!

JDK 之资源文件管理的更多相关文章

  1. C#资源文件管理

    1.右键项目点属性; 2.点资源项,添加资源下拉框的添加现在文件,如下图: 3.直接上代码获取并复制到指定文件夹下: private void button1_Click(object sender, ...

  2. Phalcon资源文件管理(Assets Management)

    资源文件管理(Assets Management)¶ Phalcon\Assets是一个让开发人员管理静态资源的组件,如管理css,javascript等. Phalcon\Assets\Manage ...

  3. WebJars 进行 css js 资源文件管理

    WebJars是将这些通用的Web前端资源打包成Java的Jar包,然后借助Maven工具对其管理,保证这些Web资源版本唯一性,升级也比较容易.关于webjars资源,有一个专门的网站http:// ...

  4. .NET平台的资源文件管理

    可以管理文本.图片等不同类型的资源 管理方式(增删改) 可以直接修改XXX.resx源文件(XML格式,文本直接管理内容,图片需要指定路径,资源名和图片名可以不同) 也可以在VS的可视化界面上进行操作 ...

  5. node —— 静态资源文件管理

    var http = require("http"); var url = require("url"); var fs = require("fs& ...

  6. Spring 系列目录

    Spring(https://spring.io/) 系列目录 第一篇:Spring 系列 第一章 Spring Core (1) Convert 1.1.1 Spring ConversionSer ...

  7. 在.NET中读取嵌入和使用资源文件的方法

    转http://www.jb51.net/article/84660.htm 本文分别介绍了使用GetManifestResourceStream读取嵌入资源,和使用. resx资源文件嵌入资源,希望 ...

  8. [Xcode 实际操作]一、博主领进门-(3)使用资源文件夹(Assets.xcassets)导入并管理图片素材

    目录:[Swift]Xcode实际操作 本文将演示如何使用资源文件夹(Assets.xcassets)导入并管理图片素材. [Assets.xcassets]资源文件夹可以方便的进行图片的管理, 在读 ...

  9. WebJars简介 —— 前端资源的jar包形式(以后接触到再深入总结)

    对于日常的web开发而言,像css.js.images.font等静态资源文件管理是非常的混乱的.比如jQuery.Bootstrap.Vue.js等,可能每个框架使用的版本都不一样.一不注意就会出现 ...

随机推荐

  1. 2.6、CDH 搭建Hadoop在安装(安装CDH和其他软件)

    第6步:安装CDH和其他软件 设置Cloudera Manager数据库后,启动Cloudera Manager Server,然后登录Cloudera Manager Admin Console: ...

  2. Webpack Loaders

    [Webpack Loaders] 1.Query parameters Loader can be passed query parameters via a query string (just ...

  3. 解题(MiGong--迷宫问题(深度搜索))

    题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0,  ...

  4. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  5. VS2013 warning C4018 "<” 有符号/无符号不匹配

    1, VS2013 warning C4018 "<” 有符号/无符号不匹配" 警告 出错代码: void show(const vector<int>& ...

  6. AssetBundle Manager and Example Scenes

    示例 1:加载资源 使用 “Asset/AssetBundles/Simulation Mode” 菜单打开模拟模式 打开 “AssetBundleSample/Scenes/AssetLoader” ...

  7. C语言之栈区、堆区

    一 局部变量存放在栈区中,函数调用结束后释放内存空间. #include "stdio.h"; #include "stdlib.h"; int *getNum ...

  8. 如何成功再次安装MYSQL

    以前安过,后来再安装就是停在启动项就是过不去,无响应 弄了两天,期待奇迹,网上各种教程试了个遍就是不行,大体就是删除INI,清理注册表,以下是新的发现:(转载) 如果你的电脑里装过MySQL,想再重新 ...

  9. Spring Boot 使用465端口发送邮件

    2017年10月27日 15:04:24 伊宇紫 阅读数:2710 标签: 465端口邮件springboot 更多 个人分类: Java   版权声明:本文为博主原创文章,未经博主允许不得转载. h ...

  10. Java_7.1 ArrayList应用点名器

    1.ArrayList同样可以添加自定义的类 将学生类添加到ArrayList集合中,其中学生类包括学生姓名,年龄 自定义学生类 package demo1; public class Student ...