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 ...
随机推荐
- .NET C#基础(5):结构体 - 高性能代码的基石
0. 文章目的 本文面向有一定.NET C#基础知识的学习者,介绍C#中结构体定义.使用以及特点. 1. 阅读基础 了解C#基本语法 了解.NET中的栈与托管堆 2. 值类型 2.1 .N ...
- c++ 超长整数减法 高精度减法
c++ 超长整数减法 高精度减法 实现思路 和加法类似,设置临时变量记录借位 当对应位数相减得到的结果大于等于0时,该位数字为本身值,否则需要加上借位的10.则\(t=(t+10)%10\) 打卡代码 ...
- 给王心凌打Call的,原来是神奇的智能湖仓
图文原创:谭婧(王凌老粉) "爷青回" "我们只是老了,并没有死." 谭老师作为老粉,热烈庆祝"甜心教主"王凌成为现象级翻红顶流. 只要地球 ...
- LM431精密+3.3V产生电路
精密+3.3V电压通过三段可调并联稳压器LM431电路产生.LM431稳压电路如下图所示. 输出电压 UO仅与电阻 R35.R38 有关,计算公式如下: 式中常数2.5为内部基准电压,其保持恒定不变. ...
- IO流原理及流的分类
IO原理 I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于 处理设备之间的数据传输.如读/写文件,网络通讯等. Java程序中,对于数据的输入/输出操作以"流(st ...
- 开启apache2的ssl访问功能
Ubuntu 20.04 1. Apache2默认安装的时候,ssl模块是不启用的.开启命令: $ sudo apt install apache2 #安装$ sudo a2enmod ssl #开启 ...
- Css3入门详解
一.Css基本语法 1.Html和Css没分开时 点击查看代码 <!DOCTYPE html> <html lang="en"> <head> ...
- SSH远程连接学校实验室服务器 一 python版本问题
问题1: 连接上远程服务器后,输入 python 发现python版本只有2.7 .试图使用以下方式更新: sudo apt install python3.9 会出现如下报错信息: 解决方式: 一般 ...
- 【有用的SQL】查Greenplum的数据字典
Greenplum 查询哪个表的分布键 ( Greenplum ) SELECT att.nspname AS 模式名 , att.relname AS 表名 , table_comment AS 表 ...
- 华为云Stack南向开放框架,帮助生态伙伴高效入云
摘要:CloudBonder的生态社区通过一系列生态项目,解决提交叉组合.架构分层不清晰.运维界面不清晰等问题,简化对接流程,降低生态伙伴对接成本,缩短对接时间. 本文分享自华为云社区<[华为云 ...