Java18新特性(极简)
一、引言
自1995年Java语言首次亮相以来,它已经成为企业级应用、移动应用和游戏开发等领域不可或缺的一部分。随着技术的不断进步,Java也在持续演化,每个新版本都带来了诸多新特性和性能优化,旨在提升开发者的编程效率和应用程序的性能。
在众多Java版本中,Java 18的发布无疑是一个重要的里程碑。它不仅继承了之前版本的强大功能,还引入了一系列引人注目的新特性。这些新特性不仅让Java语言更加现代化和高效,还进一步提升了Java在各种应用场景中的竞争力。
在本文中,我们将深入探讨Java 18的新特性,分析它们如何影响开发者的编程体验,以及这些特性如何推动Java生态系统的发展。让我们一起揭开Java 18的神秘面纱,探索它所带来的创新和变革。
现在,让我们先概览一下Java 18带来的主要新特性,以及与之前版本,特别是Java 17的对比,看看Java 18在哪些方面进行了显著的改进和增强。在接下来的章节中,我们将逐一深入解析这些新特性,并探讨它们在实际开发中的应用和影响。
二、Java 18新特性概览
Java 18作为Java发展史上的又一重要版本,引入了一系列令人瞩目的新特性,不仅增强了语言的功能性,还针对JVM和API进行了一系列优化。以下是对Java 18新特性的一个概览。
1. 语言层面的增强
Java 18在语言层面进行了显著的增强,其中最为引人注目的是模式匹配在switch语句中的应用。这一新特性使得switch语句的使用更加灵活和直观,极大地简化了复杂的条件判断逻辑。此外,文本块的改进也使得处理多行字符串变得更加容易,提升了代码的可读性和维护性。
2. JVM性能和并发性的提升
在JVM层面,Java 18带来了一系列性能和并发性的优化。这些优化旨在提高Java程序的执行效率和响应速度,使得应用程序能够更高效地处理大量数据和并发请求。这些改进不仅提升了程序的运行速度,还增强了系统的稳定性和可靠性。
3. 丰富的API和功能扩展
除了语言和JVM层面的改进,Java 18还引入了新的API和功能扩展。这些新的API不仅丰富了Java语言的功能性,还为开发者提供了更多的编程选择和灵活性。例如,新的日期和时间API的改进使得处理日期和时间变得更加简单和直观,而新的网络和安全功能则增强了Java应用程序的安全性和防护能力。
与Java 17相比,Java 18在多个方面都进行了显著的改进和增强。这些新特性不仅提升了Java语言的表达能力和编程效率,还使得Java在各种应用场景中更加灵活和高效。在接下来的章节中,我们将逐一深入解析这些新特性,并探讨它们在实际开发中的应用和影响。
通过以上概览,我们可以看到Java 18在语言、JVM和API等多个方面都带来了显著的改进和增强。这些新特性不仅提升了Java的编程效率和应用程序性能,还为开发者提供了更多的编程选择和灵活性。在接下来的章节中,我们将深入探讨这些新特性的具体细节和应用场景。
三、详细解析Java 18新特性
1. 新的语言特性
1.1 模式匹配 for switch
Java 18引入了模式匹配(Pattern Matching)到switch语句中,简化了复杂的条件判断。通过模式匹配,我们可以在switch语句中直接匹配对象的类型和值,而无需显式地使用if-else
语句或类型转换。
示例代码:
Object obj = "Hello, Java 18!"; switch (obj) { case String s -> System.out.println("It's a string: " + s); case Integer i -> System.out.println("It's an integer: " + i); default -> System.out.println("Unknown type");
}
在上面的代码中,我们根据对象的实际类型进行匹配,并执行相应的操作。这种语法更加简洁明了,提高了代码的可读性。
1.2 文本块的改进
Java 18对文本块进行了进一步的改进,使得处理多行字符串更加便捷。文本块使用三个双引号(""")来定义,可以跨越多行,并且会自动处理换行和缩进。
示例代码:
String text = """ This is a text block spanning multiple lines. It preserves formatting and indentation. """;
System.out.println(text);
输出:
This is a text block
spanning multiple lines.
It preserves formatting
and indentation.
2. 新的JVM特性和改进
Java 18 继续优化了 Just-In-Time (JIT) 编译器,使得字节码到机器码的转换更加高效。这通常意味着更快的程序启动时间和更高的运行效率。
示例:虽然 JIT 编译器的优化对开发者是透明的,但你可以通过一个简单的性能测试来感受其影响。
public class JitTest { public static void main(String[] args) { long startTime = System.nanoTime(); for (int i = 0; i < 1000000; i++) { complexCalculation(); } long endTime = System.nanoTime(); System.out.println("Time taken: " + (endTime - startTime) + " nanoseconds"); } public static void complexCalculation() { // 一些复杂的数学计算或逻辑操作 }
}
3. 新的API和功能
3.1 新的日期和时间API的改进
Java 8引入了全新的日期和时间API,而Java 18在此基础上进行了进一步的改进和增强。这些改进包括新的日期和时间格式化选项、更强大的日期计算功能等。
示例代码:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter; public class DateTimeExample { public static void main(String[] args) { LocalDate date = LocalDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.ENGLISH); String formattedDate = date.format(formatter); System.out.println("Formatted date: " + formattedDate); }
}
输出(根据当前日期而定):
Formatted date: 07 April 2023
3.2 新的网络和安全功能
Java 18在网络和安全领域也带来了一些新功能和改进。其中一个显著的特点是增强了TLS(传输层安全性)协议的支持,包括TLS 1.3版本的进一步优化和对新密码套件的支持。这些改进有助于提高网络通信的安全性。
以下是一个简单的示例,展示了如何在Java 18中使用TLS 1.3来建立一个安全的服务器-客户端连接。
服务器端代码示例:
import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore; public class SecureServer { public static void main(String[] args) throws Exception { // 加载服务器的密钥库 KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(new FileInputStream("server.keystore"), "keystore_password".toCharArray()); // 设置密钥管理器 KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, "keystore_password".toCharArray()); // 创建SSL上下文并初始化 SSLContext sslContext = SSLContext.getInstance("TLSv1.3"); sslContext.init(kmf.getKeyManagers(), null, null); // 创建服务器套接字并接受连接 SSLServerSocketFactory sf = sslContext.getServerSocketFactory(); SSLServerSocket serverSocket = (SSLServerSocket) sf.createServerSocket(8443); SSLSocket socket = (SSLSocket) serverSocket.accept(); // 读写数据 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream()); String inputLine; while ((inputLine = in.readLine()) != null) { out.println(inputLine); } // 关闭资源 in.close(); out.close(); socket.close(); serverSocket.close(); }
}
客户端代码示例:
import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore; public class SecureClient { public static void main(String[] args) throws Exception { // 创建信任管理器(接受所有证书,生产环境中应使用更严格的信任管理器) TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init((KeyStore) null); // 创建SSL上下文并初始化 SSLContext sslContext = SSLContext.getInstance("TLSv1.3"); sslContext.init(null, tmf.getTrustManagers(), null); // 创建套接字并连接到服务器 SSLSocketFactory sf = sslContext.getSocketFactory(); SSLSocket socket = (SSLSocket) sf.createSocket("localhost", 8443); // 读写数据 PrintWriter out = new PrintWriter(socket.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.println("Hello, Secure Server!"); String response = in.readLine(); System.out.println("Server response: " + response); // 关闭资源 out.close(); in.close(); socket.close(); }
}
请注意,上述代码仅用于演示目的。在生产环境中,您应该使用有效的密钥库和信任库,并确保正确处理证书验证和错误处理。
Java 18通过这些新的网络和安全功能,为开发者提供了更强大的工具来确保应用程序的数据传输安全。通过使用TLS 1.3等现代安全协议,可以大大提高网络通信的保密性和完整性。
四、Java 18性能优化与最佳实践
1. JIT编译器优化
Java 18对Just-In-Time (JIT) 编译器进行了进一步的优化,提升了代码的执行效率。这些优化包括对特定代码模式的识别与改进,以及更智能的编译策略。为了充分利用这些优化,开发者应了解JIT编译器的工作原理,并编写符合其优化策略的代码。
代码举例:
public class JITOptimizationExample { public static void main(String[] args) { long startTime = System.nanoTime(); // 执行大量计算,触发JIT编译 for (int i = 0; i < 1000000; i++) { complexCalculation(i); } long endTime = System.nanoTime(); System.out.println("Execution time: " + (endTime - startTime) + " nanoseconds"); } public static int complexCalculation(int input) { // 一些复杂的计算逻辑 int result = 0; for (int i = 0; i < input; i++) { result += i; } return result; }
}
在上述代码中,通过重复执行complexCalculation
方法,我们增加了方法的热度,使得JIT编译器更有可能将其编译为本地代码,从而提高执行效率。
2. 垃圾回收优化
Java 18在垃圾回收方面也进行了改进,包括更高效的内存管理和回收策略。开发者可以通过合理配置JVM参数,选择适合的垃圾回收器,以及优化对象的生命周期来提升性能。
代码举例(配置JVM参数):
启动Java应用程序时,可以通过配置JVM参数来选择垃圾回收器和调整堆内存大小。例如:
java -XX:+UseG1GC -Xmx4G -Xms2G MyApplication
上述命令中,-XX:+UseG1GC
选择了G1垃圾回收器,-Xmx4G
设置了最大堆内存为4GB,-Xms2G
设置了初始堆内存为2GB。
3. 并发性能提升
Java 18在并发编程方面也进行了改进,提供了更高效的并发工具和类库。开发者可以利用这些工具来提升多线程应用程序的性能。
代码举例(使用CompletableFuture
提升并发性能):
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException; public class ConcurrencyExample { public static void main(String[] args) throws ExecutionException, InterruptedException { CompletableFuture<Double> futurePrice = CompletableFuture.supplyAsync(() -> { // 模拟长时间运行的任务,如远程调用获取价格 try { Thread.sleep(2000); // 模拟延迟 } catch (InterruptedException e) { e.printStackTrace(); } return 42.5; // 假设的价格 }); CompletableFuture<Double> futureTax = futurePrice.thenApplyAsync(price -> { // 在价格确定后异步计算税费 double tax = price * 0.05; // 假设的税费计算方式 try { Thread.sleep(1000); // 模拟延迟 } catch (InterruptedException e) { e.printStackTrace(); } return tax; }); // 等待所有异步操作完成,并获取结果 CompletableFuture.allOf(futurePrice, futureTax).join(); double price = futurePrice.get(); double tax = futureTax.get(); System.out.println("Price: " + price + ", Tax: " + tax); }
}
在上述代码中,我们使用了CompletableFuture
来异步获取价格和计算税费,从而提高了程序的并发性能。
4. 代码质量与性能分析工具
Java 18还提供了更强大的代码质量与性能分析工具,帮助开发者定位性能瓶颈和优化代码。利用这些工具,开发者可以在开发过程中及时发现并解决性能问题。
例如,可以使用JProfiler、VisualVM等工具来分析Java应用程序的性能。这些工具可以提供关于CPU使用率、内存消耗、线程状态等方面的详细信息,帮助开发者找到性能优化的关键点。
通过遵循Java 18的性能优化建议,并结合实际的应用场景进行代码调整和优化,开发者可以显著提升Java应用程序的性能和响应速度。
五、结论与展望
1. 总结Java 18带来的主要新特性和改进
Java 18的发布为开发者带来了众多引人注目的新特性和改进。其中,最显著的包括Switch表达式的模式匹配,这使得代码更加简洁易读,提高了代码的可维护性。同时,Java 18还引入了简单的Web服务器,为轻量级Web应用的开发提供了便利。在并发编程方面,Java 18通过增强对并发流的支持,使得处理大量数据变得更加高效。此外,Java 18还在JIT编译器、垃圾回收和代码质量分析工具等方面进行了优化,从而提升了程序的执行效率和性能。
2. 对Java未来发展的展望和期待
展望未来,Java的发展潜力依然巨大。随着云计算、大数据和人工智能等领域的快速发展,Java作为一种成熟稳定的编程语言,将继续在这些领域发挥重要作用。我们期待Java在未来能够进一步简化编程模型,提供更高效的并发编程工具,以满足日益复杂的应用需求。同时,我们也希望Java能够在性能优化、内存管理以及安全性等方面持续创新,为开发者提供更加稳定、安全和高效的编程环境。
3. 鼓励读者尝试并应用Java 18的新特性,以提升编程效率和程序性能
Java 18的新特性和改进不仅展示了Java语言的强大功能和灵活性,也为开发者提供了更多优化程序和提高效率的工具。我鼓励读者积极尝试并应用Java 18的这些新特性,无论是Switch表达式的模式匹配、简单的Web服务器,还是增强的并发流支持,都将成为提升编程效率和程序性能的有力武器。通过实践和应用,我们可以更好地理解和掌握Java 18的这些新特性,从而在实际开发中发挥出更大的价值。让我们一起迎接Java的新时代,共同创造更加美好的未来!
相关文章:
Java18新特性(极简)
一、引言 自1995年Java语言首次亮相以来,它已经成为企业级应用、移动应用和游戏开发等领域不可或缺的一部分。随着技术的不断进步,Java也在持续演化,每个新版本都带来了诸多新特性和性能优化,旨在提升开发者的编程效率和应用程序的…...
vscode连接ssh远程服务器
当使用Visual Studio Code (VSCode) 连接SSH远程服务器时,可以遵循以下步骤。这些步骤将帮助你设置并连接到远程服务器,包括免密登录的设置(如果需要)。 一、安装并配置Remote-SSH插件 下载并安装VSCode:确保你已经下…...
【趣味测试】
编程过程中遇到的趣味知识 1 Cpp 1.1 浮点数计算 if (0.1 0.2 0.3) {std::cout << "0.1 0.2 0.3 true" << std::endl;} else {std::cout << "0.1 0.2 0.3 false" << std::endl;}if (0.1 0.3 0.4) {std::cout << &…...
数据结构经典面试之数组——C#和C++篇
文章目录 1. 数组的基本概念与功能2. C#数组创建数组访问数组元素修改数组元素数组排序 3. C数组创建数组访问数组元素修改数组元素数组排序 4. 数组的实际应用与性能优化5. C#数组示例6. C数组示例总结 数组是编程中常用的数据结构之一,它用于存储一系列相同类型的…...
docker的基本知识
文章目录 前言docker的基本知识1. docker 的底层逻辑2. docker 的核心要素2.1. 镜像的基本概念:2.2. 容器的基本概念:2.3. 仓库的基本概念: 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 …...
React Native性能优化红宝书
一、React Native介绍 React Native 是Facebook在React.js Conf2015 推出的开源框架,使用React和应用平台的原生功能来构建 Android 和 iOS 应用。通过 React Native,可以使用 JavaScript 来访问移动平台的 API,使用 React 组件来描述 UI 的…...
后端不提供文件流接口,前台js使用a标签实现当前表格数据(数组非blob数据)下载成Excel
前言:开发过程中遇到的一些业务场景,如果第三方不让使用,后端不提供接口,就只能拿到table数据(Array),实现excel文件下载。 废话不多说,直接上代码,方法后续自行封装即可: functio…...
如何使用ChatGPT辅助设计工作
文章目录 设计师如何使用ChatGPT提升工作效率?25个案例告诉你!什么是 prompt?咨询信息型 prompt vs 执行任务 prompt编写出色 prompt 的基本思路撰写 prompt 的案例和技巧1、将 ChatGPT 视作专业人士2、使用 ChatGPT 创建表单3、使用 ChatGPT…...
hadoop服务器启动后无法执行hdfs dfs命令
集群启动后,无法正常使用hdfs的任何命令。使用jps查看进程,发现namenode没有启动,然后再进入到Hadoop的相应目录,打开里面的logs文件 打开Hadoop的master的log 再使用vi编辑器查看(也可以用less或者more命令查看&#…...
Flink 1.19.1 standalone 集群模式部署及配置
flink 1.19起 conf/flink-conf.yaml 更改为新的 conf/config.yaml standalone集群: dev001、dev002、dev003 config.yaml: jobmanager address 统一使用 dev001,bind-port 统一改成 0.0.0.0,taskmanager address 分别更改为dev所在host dev001 config.…...
【深度学习】GELU激活函数是什么?
torch.nn.GELU 模块在 PyTorch 中实现了高斯误差线性单元(GELU)激活函数。GELU 被用于许多深度学习模型中,包括Transformer,因为它相比传统的 ReLU(整流线性单元)函数能够更好地近似神经元的真实激活行为。…...
如何编译和运行您的第一个Java程序
如何编译和运行您的第一个Java程序 让我们从一个简单的java程序开始。 简单的Java程序 这是一个非常基本的java程序,它会打印一条消息“这是我在java中的第一个程序”。 public class FirstJavaProgram {public static void main(String[] args){System.…...
vscode用vue框架写一个登陆页面
目录 一、创建登录页面 二、构建好登陆页面的路由 三、编写登录页代码 1.添加基础结构 2.给登录页添加背景 3.解决填充不满问题 4.我们把背景的红颜色替换成背景图: 5.在页面中央添加一个卡片来显示登录页面 6.设置中间卡片页面的左侧 7.设置右侧的样式及…...
腾讯云API安全保障措施?有哪些调用限制?
腾讯云API的调用效率如何优化?怎么使用API接口发信? 腾讯云API作为腾讯云提供的核心服务之一,广泛应用于各行各业。然而,随着API应用的普及,API安全问题也日益突出。AokSend将详细探讨腾讯云API的安全保障措施&#x…...
在建设工程合同争议案件中,如何来认定“竣工验收”?
在建设工程合同争议案件中,如何来认定“竣工验收”? 建设工程的最终竣工验收,既涉及在建设单位组织下的五方单位验收,又需政府质量管理部门的监督验收以及竣工验收备案,工程档案还需递交工程所在地的工程档案馆归档。…...
Linux:多线程中的互斥与同步
多线程 线程互斥互斥锁互斥锁实现的原理封装原生线程库封装互斥锁 死锁避免死锁的四种方法 线程同步条件变量 线程互斥 在多线程中,如果存在有一个全局变量,那么这个全局变量会被所有执行流所共享。但是,资源共享就会存在一种问题࿱…...
数据仓库之主题域
数据仓库的主题域(Subject Area)是按照特定业务领域或主题对数据进行分类和组织的方式。每个主题域集中反映一个特定的业务方面,使得数据分析和查询更加清晰和高效。主题域通常与企业的关键业务过程相关,能够帮助用户在数据仓库中…...
【简易版tinySTL】 vector容器
文章目录 基本概念功能思路代码实现vector.htest.cpp 代码详解变量构造函数析构函数拷贝构造operatorpush_backoperator[]insertprintElements 本实现版本 和 C STL标准库实现版本的区别: 基本概念 vector数据结构和数组非常相似,也称为单端数组vector与…...
BRAVE:扩展视觉编码能力,推动视觉-语言模型发展
视觉-语言模型(VLMs)在理解和生成涉及视觉与文本的任务上取得了显著进展,它们在理解和生成结合视觉与文本信息的任务中扮演着重要角色。然而,这些模型的性能往往受限于其视觉编码器的能力。例如,现有的一些模型可能对某…...
使用 Verdaccio 建立私有npm库
网上有很多方法,但很多没标注nginx的版本所以踩了一些坑,下方这个文档是完善后的,对linux不是很熟练,所以不懂linux不会搭建的跟着做就可以了 搭建方法 首先需要一台云服务器 以139.196.226.123为例登录云服务器 下载node cd /usr/local/lib下载node 解压 下载 wget https://…...
个人职业规划(含前端职业+技术线路)
1. 了解自己的兴趣与长处 喜欢擅长的事 职业方向 2. 设定长期目标(5年) 目标内容 建立自己的品牌建立自己的社交网络 适量参加社交活动,认识更多志同道合的小伙伴寻求导师指导 建立自己的作品集 注意事项 每年元旦进行审视和调整永葆积极…...
LeetCode | 344.反转字符串
设置头尾两个指针,依靠中间变量temp交换头尾指针所指元素,头指针后移,尾指针前移,直到头尾指针重合或者头指针在尾指针后面一个元素 class Solution(object):def reverseString(self, s):""":type s: List[str]:r…...
一步一步用numpy实现神经网络各种层
1. 首先准备一下数据 if __name__ "__main__":data np.array([[2, 1, 0],[2, 2, 0],[5, 4, 1],[4, 5, 1],[2, 3, 0],[3, 2, 0],[6, 5, 1],[4, 1, 0],[6, 3, 1],[7, 4, 1]])x data[:, :-1]y data[:, -1]for epoch in range(1000):...2. 实现SoftmaxCrossEntropy层…...
vue学习(二)
9.vue中的数据代理 通过vm对象来代理data对象中的属性操作(读写),目的是为了更加方便操作data中的数据 基本原理:通过Object.defineProperty()把data对象所有属性添加到vm上,为每一个添加到vm上的属性,都增…...
Maven 介绍
Maven open in new window 官方文档是这样介绍的 Maven 的: Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a projects build, reporting and documentation fr…...
QT截图程序三-截取自定义多边形
上一篇文章QT截图程序,可多屏幕截图二,增加调整截图区域功能-CSDN博客描述了如何截取,具备调整边缘功能后已经方便使用了,但是与系统自带的程序相比,似乎没有什么特别,只能截取矩形区域。 如果可以按照自己…...
Unity的三种Update方法
1、FixedUpdate 物理作用——处理物理引擎相关的计算和刚体的移动 (1) 调用时机:在固定的时间间隔内,而不是每一帧被调用 (2) 作用:用于处理物理引擎的计算,例如刚体的移动和碰撞检测 (3) 特点:能更准确地处理物理…...
[Python学习篇] Python字典
字典是一种可变的、无序的键值对(key-value)集合。字典在许多编程(Java中的HashMap)任务中非常有用,因为它们允许快速查找、添加和删除元素。字典使用花括号 {} 表示。字典是可变类型。 语法: 变量 {key1…...
react项目中如何书写css
一:问题: 在 vue 项目中,我们书写css的方式很简单,就是在 .vue文件中写style标签,然后加上scope属性,就可以隔离当前组件的样式,但是在react中,是没有这个东西的,如果直…...
PostgreSQL源码分析——绑定变量
这里分析一下函数中应用绑定变量的问题,但实际应用场景中,不推荐这么使用。 prepare divplan2(int,int) as select div($1,$2); execute divplan2(4,2);语法解析 分别分析prepare语句以及execute语句。 gram.y中定义 /******************************…...
绍兴网站建设设计/做一个网站要多少钱
1:我们打开vs开发工具新建项目添加asp.net web 服务应用程序 2 添加web应用程序服务好后可以先测试service.asmx文档 3 我在后service.asmx后台添加四个功能函数(求和、差、乘、除) using System; using System.Collections.Generic; using S…...
做淘客网站用什么服务器好/关键词搜索工具有哪些
什么是HTML?HTML 是用来描述网页的一种语言。HTML 指的是超文本标记语言: HyperText Markup LanguageHTML 不是一种编程语言,而是一种标记语言标记语言是一套标记标签 (markup tag)HTML 使用标记标签来描述网页HTML 文档包含了HTML标签及文本内容HTML文档也叫做web…...
长沙有什么做试卷的网站/湖南手机版建站系统开发
简介 Redis全球多活产品是阿里云自研、基于云数据库Redis版(ApsaraDB for Redis)、100%兼容 Redis 协议的多活数据库系统。通过数据同步通道,把多个Redis实例组网成1个逻辑上的 Redis 多活实例,多活实例内的所有实例均可读写并保持实时数据同步。数据同…...
网站备案被注销了/小程序开发流程详细
早晨起床时间:7:20 晚上休息时间:22:11 今日总结:今天基本上又没做什么事,简单的进行了一些测试。...
网站运营者网址/推广链接点击器
属性/样式初始化【转】 一、PP_AttrProp类 1、类功能说明,代表了一个相同类型的属性/样式集合 PP_AttrProp captures the complete set of XML and CSS Attributes/Properties for a piece of the document. These are generally created by the file-reade…...
合肥市城乡建设局网站/百度广告推广怎么收费
C文本文件读写操作详解 前面章节中,已经给大家介绍了文件流对象如何调用 open() 方法打开文件,并且在读写(又称 I/O )文件操作结束后,应调用 close() 方法关闭先前打开的文件。那么,如何实现对文件内容的读…...