Java SE 18 新增特性
Java SE 18 新增特性
作者:Grey
原文地址:Java SE 18 新增特性
源码
镜像仓库: GitCode:java_new_features
默认使用 UFT-8 编码
在 Java SE 18 之前的 Java中,标准字符集会因操作系统和语言设置的不同而不同。Java 标准字符集决定了在 JDK 类库的许多方法中如何将字符串转换为字节,反之亦然(例如,在写入和读取文本文件时)。这些方法包括:
FileReader,FileWriter,InputStreamReader,OutputStreamWriter的构造函数。Formatter和Scanner的构造函数。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 18 Features (with Examples)
Java SE 18 新增特性的更多相关文章
- Java SE 8 新增特性
Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- Java SE 11 新增特性
Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 19 新增特性
Java SE 19 新增特性 作者:Grey 原文地址: 博客园:Java SE 19 新增特性 CSDN:Java SE 19 新增特性 源码 源仓库: Github:java_new_featu ...
- Java SE 9 新增特性
Java SE 9 新增特性 作者:Grey 原文地址: Java SE 9 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- Java SE 10 新增特性
Java SE 10 新增特性 作者:Grey 原文地址:Java SE 10 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 12 新增特性
Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 13 新增特性
Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 14 新增特性
Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java SE 15 新增特性
Java SE 15 新增特性 作者:Grey 原文地址:Java SE 15 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
随机推荐
- printf 输出前导0
printf ("%3d\n", 5); printf ("%03d\n", 5); 输出为
- ElasticSearch6.4.2
做一个简单的API记录 1.依赖为6.4.2 比较老的版本 2.指定ES集群,可接多个Put(); Setting setting=Setting.builder().put("clust ...
- TypeScript(7)泛型
泛型 指在定义函数.接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性. 引入 下面创建一个函数, 实现功能: 根据指定的数量 count 和数据 value , 创建一个包 ...
- 关于Vue 移动端适配 (px2rem 插件将px转为rem)
一.安装 npm install px2rem-loader lib-flexible --save 二.入口文件main.js加上 import 'lib-flexible/flexible.js' ...
- ABAP CDS - Annotations 注解
Syntax ... annotation[.annotation1[.annotation2]][:value] ... Effect Annotation that can be specifi ...
- Servlet 之 Http协议
请求消息数据格式 请求行 请求方式 请求url 请求协议或者版本 (GET /login.html HTTP/1.1) 请求头 请求头名称:请求头值 多个用逗号分隔 请求空行 空行分隔作 ...
- React技巧之表单提交获取input值
正文从这开始~ 总览 在React中,通过表单提交获得input的值: 在state变量中存储输入控件的值. 在form表单上设置onSubmit属性. 在handleSubmit函数中访问输入控件的 ...
- 上传几张.NET5之后的机器人logo
上传几张.NET5之后的机器人logo
- PoweJob高级特性-MapReduce完整示例
由于网上搜索 PowerJob MapReduce 都是设计原理,demo也展示个空壳子,没有演示Map到Reduce结果怎么传递,对于没有MR开发经验的人来说并没有什么帮助,所以这里写了一个有完整计 ...
- vue2升级vue3指南(一)—— 环境准备和构建篇
1.nodejs和npm 注意二者的版本,版本过低需要升级,本人升级后的版本如下: $ node -v v16.15.1 $ npm -v 8.11.0 2.package.json 和依赖升级 由于 ...