JDK 之資源文件管理

JDK 之資源文件管理

JDK 規範目錄(http://www.javashuo.com/article/p-wdnembkc-ex.html)html

1、文件資源

  • user.home 用戶目錄,如 Linux 上 root 的用戶目錄爲 /root
  • user.dir 項目工做目錄

2、類路徑資源

3、網絡資源

java.net 包下有幾個核心的類:java

URL
URLConnection
URLStreamHandler
URLStreamHandlerFactory

經過 URLStreamHandlerFactory 獲取 URLStreamHandler,經過這個 Handler 獲取 URLConnection,進而操做各類網絡資源。react

JDK 1.8 中 URLStreamHandlerFactory 有一個默認的實現類 Factory,這個類是 Launcher 的內部類,代碼以下:spring

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);
}

4、JDK 資源管理在 Spring 中的應用

Resource
ResourceLoader
ProtocolResolveride

併發編程 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

天天用心記錄一點點。內容也許不重要,但習慣很重要!

相關文章
相關標籤/搜索