Java SE 18 新增特性

作者:Grey

原文地址:Java SE 18 新增特性

源码

源仓库: Github:java_new_features

镜像仓库: GitCode:java_new_features

默认使用 UFT-8 编码

在 Java SE 18 之前的 Java中,标准字符集会因操作系统和语言设置的不同而不同。Java 标准字符集决定了在 JDK 类库的许多方法中如何将字符串转换为字节,反之亦然(例如,在写入和读取文本文件时)。这些方法包括:

  • FileReader, FileWriter, InputStreamReader, OutputStreamWriter的构造函数。

  • FormatterScanner的构造函数。

  • URLEncoder.encode()URLDecoder.decode()的静态方法。

当一个应用程序在一个环境中被开发和测试,然后在另一个环境中运行( Java 选择了不同的默认字符集),这可能导致不可预测的行为。

此外,由于较新的类库方法在没有指定字符集的情况下总是使用 UTF-8 ,所以变得更加混乱,例如:

Files.writeString(),Files.readString(),Files.newBufferedWriter()Files.newBufferedReader()

为了保护应用程序免受此类错误的影响,有两种解决方案:

方案一:在调用所有将字符串转换成字节的方法时指定字符集,反之亦然。

FileWriter fw = new FileWriter("happy-coding.txt", StandardCharsets.UTF_8);
// ...
FileReader fr = new FileReader("happy-coding.txt", StandardCharsets.UTF_8);
// ...
Files.readString(Path.of("happy-coding.txt"), StandardCharsets.UTF_8);

这个方案会导致大量的代码重复,容易出错。

方案二:通过系统属性 "file.encoding "设置默认字符集。

这种方案中的属性值在 Java SE 17 之前(包括 Java SE 17 )中没有正式记录(见system-properties)。

其次,如上所述,指定的字符集并不用于所有的 API 方法。比如:

public class Jep400Example {
public static void main(String[] args) throws IOException {
try (FileWriter fw = new FileWriter("happy-coding.txt");
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write("ハッピーコーディング!");
} String text = Files.readString(Path.of("happy-coding.txt"));
System.out.println(text);
}
}

让我们用标准编码 US-ASCII 来运行一次该程序。

java -Dfile.encoding=US-ASCII Jep400Example.java

运行结果如下

?????????????????????????????????

结果是垃圾,因为 FileWriter 考虑到了默认编码,但Files.readString()忽略了它,总是使用UTF-8。只有在你统一使用 UTF-8 的情况下才能正常运行。

java -Dfile.encoding=UTF-8 Jep400Example.java

运行结果如下

ハッピーコーディング!?

在 Java SE 18 中,无论操作系统、地域和语言设置如何,默认编码将始终是 UTF-8,见:JEP 400

另外,系统属性file.encoding也可以被合法使用。然而,我们应该谨慎地这样做。

最好的方法是将-Dfile.encoding设置为 UTF-8 或完全省略它。

代码示例

package git.snippets.jdk18;

import java.nio.charset.Charset;

public class UFT8Test {
public static void main(String[] args) {
System.out.println("Default charset : " + Charset.defaultCharset());
System.out.println("file.encoding : " + System.getProperty("file.encoding"));
System.out.println("native.encoding : " + System.getProperty("native.encoding"));
System.out.println(Charset.defaultCharset());
System.out.println("你好");
}
}

输出结果为:

Default charset : UTF-8
file.encoding : UTF-8
native.encoding : GBK
UTF-8
你好

JDK 自带 Web Server

准备一个html页面,放到任意文件夹中,

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Java自带的WebServer</title>
</head>
<body>
Web Server By JDK18
</body>
</html>

然后在这个文件所在目录执行

C:\jdk\jdk-18\bin\jwebserver.exe

启动后,控制台会打印如下信息

Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving C:\workspace\java_new_features\jdk18_features\src\main\resources and subdirectories on 127.0.0.1 port 8000
URL http://127.0.0.1:8000/

访问http://127.0.0.1:8000/可以看到效果

API 文档注释中支持代码片段

如果我们想把多行代码片段集成到 JavaDoc 中,我们必须通过<pre>...</pre>来完成,而且必须与{@code ...}相结合,这样做非常麻烦

下面是一个使用<pre>标签的例子:

/**
* How to write a text file with Java 7:
*
* <pre>{@code try (BufferedWriter writer = Files.newBufferedWriter(path)) {
* writer.write(text);
*}}</pre>
*/

在 Java SE 18 中,引入了@snippet标签,可以用于代码片段的注释

/**
* How to write a text file with Java 7:
*
* {@snippet :
* try (BufferedWriter writer = Files.newBufferedWriter(path)) {
* writer.write(text);
* }
* }
*/

更多

Java SE 7及以后各版本新增特性

参考资料

JDK 18 Release Notes

Java18 新特性

New Features in Java 18

Java 18 Features (with Examples)

Java SE 18 新增特性的更多相关文章

  1. Java SE 8 新增特性

    Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  2. Java SE 11 新增特性

    Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  3. Java SE 19 新增特性

    Java SE 19 新增特性 作者:Grey 原文地址: 博客园:Java SE 19 新增特性 CSDN:Java SE 19 新增特性 源码 源仓库: Github:java_new_featu ...

  4. Java SE 9 新增特性

    Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  5. Java SE 10 新增特性

    Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  6. Java SE 12 新增特性

    Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  7. Java SE 13 新增特性

    Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  8. Java SE 14 新增特性

    Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  9. Java SE 15 新增特性

    Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

随机推荐

  1. 开发工具-Typora编辑器下载地址

    更新记录 2022年6月10日 完善标题. 比较好用的Markdown编辑器了,哈哈. https://typoraio.cn/

  2. Python中的逻辑表达式

    首先要明确一点,Python的逻辑运算符,可以用来操作任何类型的表达式(不局限于Bool类型),且运算后的结果也不一定是Bool类型的,而是其左右其中一个表达式的值 表达式1 and 表达式2 pyt ...

  3. Codeforces Round #783 (Div. 2)

    A. Direction Change 题意 从(1,1)点出发到(n,m),每次可以向上下左右四个方向移动,但是不能与上次移动方向相同 最少要移动多少不,如果不能到达输出 -1 思路 假设n< ...

  4. js导入excel&导出excel

    Excel导入 html代码 <button style={{ color: '#1890ff', fontSize: '14px', cursor: 'pointer' }} onClick= ...

  5. 《Stepwise Metric Promotion for Unsupervised Video Person Re-identification》 ICCV 2017

    Motivation: 这是ICCV 17年做无监督视频ReID的一篇文章.这篇文章简单来说基于两个Motivation. 在不同地方或者同一地方间隔较长时间得到的tracklet往往包含的人物是不同 ...

  6. Java对接拼多多开放平台API(加密上云等全流程)

    前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...

  7. DHCP原理及配置

    DHCP工作原理 集中的管理.分配IP地址,使client动态的获得IP地址.Gateway地址.DNS服务器地址等信息,并能够提升地址的使用率. 简单来说,DHCP就是一个不需要账号密码登录的.自动 ...

  8. 【Python3】列表字典集合元组

    1 列表 1.1 定义与索引 在Python中,第一个列表元素的下标为 0通过将索引指定为 -1 可以让Python返回最后一个列表元素 inventory = ['sword', 'armor', ...

  9. 图像文本跨模态细粒度语义对齐-置信度校正机制 AAAI2022

    论文介绍:Show Your Faith: Cross-Modal Confidence-Aware Network for Image-Text Matching (跨模态置信度感知的图像文本匹配网 ...

  10. GDOI 2022 普及组游记

    To LuoguDAY -1 期中考成绩下来了,全无了除了历史 (96) 和生物 (95) 还能看,剩下的-,语文 101.5 ,少错一道选择和断句就 107.5 了,居然比雌兔还低 数学少错一道选择 ...