Mongoosej.Blog.Software.Programing.Java.API
rt.jar
ClassLoader
java.lang.ClassLoader
getSystemResourceAsStream(String name)
程序开发中,经常会存在将一些资源放到jar内的情况,比如属性文件、图标、图片等等。
由于使用java.io.File只能获取到jar包以外的资源,获取jar包内的资源通常使用java.util.jar.JarFile或者java.lang.ClassLoader来获取,前者操作较为麻烦,通常使用该方法来加载jar包内类路径下的资源。核心思路就是,使用该方法将指定类路径下的资源作为输入流来执行操作。
在某些情况下,资源文件存在编码问题,此时需要注意使用java.io.InputStreamReader来指定编码,防止读取的资源文件乱码。
Java中getResourceAsStream的用法
Java中getResource()的详细介绍
Locale
java.util.Locale
Locale locale = Locale.getDefault();// 根据当前系统环境,获取语言、区域信息
// 返回此语言环境的国家/地区代码,将为空字符串或大写的 ISO 3166 两字母代码。
locale.getCountry();// CN
// 返回适合向用户显示的语言环境国家/地区名。
locale.getDisplayCountry();// 中国
// 返回此语言环境的语言代码,可以是空字符串或小写的 ISO 639 代码。
locale.getLanguage();// zh
// 返回适合向用户显示的语言环境语言名。
locale.getDisplayLanguage();// 中文
// 返回此语言环境国家/地区的三字母缩写。
locale.getISO3Country();// CHN
// 返回此语言环境语言的三字母缩写。
locale.getISO3Language();// zho
// 返回适合向用户显示的语言环境名。
locale.getDisplayName();// 中文 (中国)
// Returns a well-formed IETF BCP 47 language tag representing this locale.
locale.toLanguageTag();// zh-CN
File
java.io.File
文件是否相等
通过计算文件的md5值来比较。
- 如果文件B由文件A复制得到,那么A和B这两个文件的md5值相等。
- 如果文件B由文件A复制得到,并且修改了文件B的文件名称,那么A和B这两个文件的文件名不相等,但是这两个文件的md5值仍然相等。 ```java import org.apache.commons.codec.digest.DigestUtils;
String file1Md5 = DigestUtils.md5Hex(new FileInputStream(file1)); String file2Md5 = DigestUtils.md5Hex(new FileInputStream(file2)); System.out.println(file1Md5.equals(file2Md5));
<a name="ZXR4S"></a>
# Aspect
<a name="ZGTbm"></a>
## keywords
<a name="l3pPT"></a>
### final
[浅析Java中的final关键字](https://www.cnblogs.com/dolphin0520/p/3736238.html)
<a name="faW7h"></a>
## doc
<a name="csILk"></a>
#### 表格
代码注释插入表格,可以参考以下类:
- javax.swing.BoxLayout
<a name="eFyVw"></a>
## Annotation
[如何实现自定义注解](https://blog.csdn.net/Mr_wzc/article/details/119478793)<br />[如何自定义一个Java注解?](https://zhuanlan.zhihu.com/p/165641201)
<a name="yPUbS"></a>
## Upgrade
<a name="Nb406"></a>
### Java 8
Java 8(又称为jdk 1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java 8它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。
Java8新增了非常多的特性,主要包括以下几个:
- Lambda达式−Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
- 方法引用−方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
- 默认方法−默认方法就是一个在接口里面有了一个实现的方法。
- 新工具−新的编译工具,如:Nashorn引擎jjs、类依赖分析器jdeps。
- StreamAPI−新添加的StreamAPI(java.util.stream)把真正的函数式编程风格引入到Java中。
- DateTimeAPI−加强对日期与时间的处理。
- Optional类−Optional类已经成为Java8类库的一部分,用来解决空指针异常。
- Nashorn,JavaScript引擎−Java8提供了一个新的Nashornjavascript引擎,它允许我们在JVM上运行特定的javascript应用。
- <br />
<a name="Rtfay"></a>
#### Lambda
[Lamda 表达式学习](https://www.jianshu.com/p/848cf247ce28)<br />[Java Lambda 表达式](https://www.runoob.com/java/java8-lambda-expressions.html)<br />[Java8新特性--Lambda表达式](https://www.cnblogs.com/kexianting/p/8588987.html)
<a name="ue2Ce"></a>
#### Stream
[Java8中Stream详细用法大全](https://blog.csdn.net/qq_45228323/article/details/121328790)
<a name="jpGu9"></a>
## Traps
<a name="v4ITs"></a>
### Number
<a name="jjVPq"></a>
#### lang <---> int
```java
long startTime = System.currentTimeMillis();
Thread.sleep(1000);
int endTime = System.currentTimeMillis();
System.out.println("cost: " + (startTime-endTime) + "ms");
上述的代码,可能你预期的结果是
cost: 1000ms
,或者1000ms上下。 但实际的结果是cost: 1632087571479ms
,一个很大的数值,远大于1000ms。
结果在1000ms上下是可以理解的,因为cpu切换等等底层问题可能会导致时间不是恰恰1000ms那么准确。但是实际相差缺很大,为什么呢?
当前时间以2021-08-27 10:48来算,大概stratTime=1630032522844ms,endTime=1630032523844ms,上述代码第二行,把endTime由long转为了int,很明显1630032523844已经超过了int的取值范围(-2147483648 ~ 2147483647),所以实际endTime被转为了一个负数,实际endTime=-2055048635ms,所以(startTime-endTime)反而比startTime还更大了。
所以本质原因在于long转int的数据移出。
线程
代理
JDK代理、CGLIB(Code Generation Library)代理。
Spring AOP 代理实现的两种方式: JDK动态代理 和 Cglib框架动态代理
语法
null类型转换会不会报NPE?
public static void main(String[] args) {
IChannelEquipmentService ics = null;
EquipmentChargeService ecs = (EquipmentChargeService) ics;
System.out.println(ecs);// 实际会执行到这步输出null,不报NullPointException
}