跳至主要內容
JDK Jar 包操作

JAR 文件是一种 Java 归档文件,可以包含多个 Java 类文件、资源文件和其他文件。

Java 中的 java.util.jar.JarOutputStream 类是用于创建和输出 JAR 文件的输出流。 JarOutputStream 类提供了一系列方法来向 JAR 文件中写入条目(Entry,JarEntry extends ZipEntry)并设置相关属性。

使用场景:

  • 创建 JAR 文件:可以使用 JarOutputStream 类来创建一个 JAR 文件,将多个文件打包到一个 JAR 文件中。这在构建和分发 Java 应用程序时非常有用。
  • 压缩文件:JarOutputStream 类提供了压缩文件的功能,可以选择性地压缩 JAR 文件中的文件。通过设置 ZipEntry 对象的压缩属性,可以控制是否对文件进行压缩。
  • 添加和更新文件:使用 JarOutputStream 可以向现有的 JAR 文件中添加新的文件或更新已有文件。通过设置 ZipEntry 对象的属性,可以指定新文件的名称和位置。
  • 创建清单文件:在 JAR 文件中,清单文件(Manifest)用于记录 JAR 文件的元数据和配置信息。可以使用 JarOutputStream 类的构造函数,指定一个 Manifest 对象,以创建一个包含清单文件的 JAR 文件。

Steven大约 3 分钟java
JDK 介绍

参考:

  • 为什么还用 jdk8 https://developer.aliyun.com/article/1108370

OpenJDK 发展

历史:

  • 1996 年 1 月,Sun 公司发布了 Java 的第一个开发工具包,我们称它为 Sun JDK。
  • 2006 年 Sun 公司在 JavaOne 大会上宣布将 Java 开源,并于 2009 年 4 月 15 日正式发布 OpenJDK
  • 2009 年,甲骨文(Oracle)公司宣布收购 Sun 公司,从此更名为 Oracle JDK。
  • 2019 年 4 月 16 号 Oracle 宣布 JDK 开始商用收费,JDK 从 8u211 版本开始。

Steven大约 2 分钟java
JDK IO 功能

JDK IO 使用

todo https://howtodoinjava.com/java/io/outputstream-to-inputstream/

todo File

todo

Java BIO INPUTSTREAM/OUT/READER/WRITER/FILE/PIP/ZIP JAVA NIO FileChannel/bytebuffer/mapbytebuffer JAVA NIO2.0 PATHS/FILES/WATCH/

todo Socket

参考: https://www.bilibili.com/list/watchlater?


Steven小于 1 分钟java
H2 使用

参考:

  • https://springdoc.cn/spring-boot-h2-database/
  • http://www.h2database.com/html/main.html

参考:

  • https://www.learnfk.com/h2/h2-database-introduction.html
  • https://www.w3ccoo.com/h2_database/index.html
  • https://www.bookstack.cn/read/h2-database-doc/README.md
    https://waylau.gitbooks.io/h2-database-doc/content/
    https://github.com/waylau/h2-database-doc
    https://github.com/waylau/h2-demos

Steven小于 1 分钟java
JDK 序列化/反序列化功能(jackson)

Java 对象和 JSON 数据之间进行转换。

核心概念、基本用法、高级配置及处理集合类型的数据。

参考:

  • 原理、使用与高级配置 - https://blog.csdn.net/qq_38411796/article/details/139962039
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

Steven大约 1 分钟javajson
JDK 序列化/反序列化功能

序列化/反序列化

spring

接口日志

@Aspect
@Component
@Order(1000)
@Slf4j
public class LogInfoAspect {
  /**
   * 通过 @Pointcut 注解声明频繁使用的切点表达式
   */
  @Pointcut("execution(* com.example.demo..*.*(..))")
  public void AspectController() {

  }

  @Pointcut("execution(* com.example.demo..*.*(..))")
  public void AspectController2() {

  }

  /**
   * 先执行、先退出
   */
  @Around("AspectController() || AspectController2()")
  public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    log.debug("环绕前");
    MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
    pjp.getTarget();
    LogAnnotation logAnnotationClass = pjp.getTarget().getClass().getAnnotation(LogAnnotation.class);
    LogAnnotation logAnnotationMethod = pjp.getTarget().getMethod().getAnnotation(LogAnnotation.class);
    if (logAnnotationClass == null && logAnnotationMethod == null) {
      return pjp.proceed();
    }
    LogAnnotation logAnnotation = ObjectUtils.defaultIfNull(logAnnotationMethod, logAnnotationClass);
    StopWatch sw = new StopWatch();
    String className = pjp.getTarget().getClass().getName();
    String methodName = methodSignature.getName();
    if (logAnnotation.parameter()) {
      log.info("{}:{}:parameter:{}", className, methodName, pjp.getArgs());
    }
    sw.start();
    Object result = null;
    try {
      result = pjp.proceed();
    } catch (Throwable e) {
      if (logAnnotation.exception()) {
        log.warn(e.getMessage(), e);
      }
      throw e;
    }
    if (logAnnotation.result()) {
      log.info("{}:{}:result:{}", className, methodName, result);
    }
    sw.stop();
    if (logAnnotation.totalConsume()) {
      log.info("{}:{}:totalConsume:{}s", className, methodName, sw.getTotalTimeSeconds());
    }
    log.debug("环绕后");
    return result;
  }
}

Steven小于 1 分钟java