Java 应用与开发 - 高级 I/O 编程
Source) ▶ 数据宿(Data Sink) ▶ 流(Stream) Java 中把不同的数据源与程序间的数据传输都抽象表述为 流,java.io 包中定义了多种 I/O 流类型实现数据 I/O 功能。 大纲 Java I/O 原理 基础 I/O 流 常用 I/O 流类型 I/O 应用 Java I/O 流的分类 O 按照数据流动的方向 Java 流可分为输入流(Input Stream)和输出流(Output 可分为节点流(Node Stream)和处理流(Processing Stream)。 ▶ 节点流直接连接到数据源; ▶ 处理流是对一个已存在的流的连接和封装,通过所封装的流 的功能调用实现增强的数据读/写功能,处理流并不直接连 到数据源。 Howareyou? Imissyou. h o w 文件 read() 节点流FileReader 处理流BufferedReader BufferedReader(Reader in) ▶ public BufferedReader(Reader in, int size) // size of buffer ▶ BufferedWriter 提供字符的缓冲写出功能,该类的 newLine() 方法可以写出平台相关的行分隔符来标记一行的 终止,此分割符由系统属性 line.separator 确定。 CODE ± Fragment: 使用字符处理流实现文件复制0 码力 | 27 页 | 609.17 KB | 1 年前3《Java 应用与开发》课程讲义 - 王晓东
. . . . . . . . . . . . . . . . . . . . 175 13.4.1 属性信息的导入/导出 . . . . . . . . . . . . . . . . . . . . . . . . . . 175 13.4.2 属性信息的导入/导出 . . . . . . . . . . . . . . . . . . . . . . . . . . 176 13.4 14.3.5 synchronized 的用法示例 . . . . . . . . . . . . . . . . . . . . . . . . 196 14.3.6 synchronized 的功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 14.3.7 线程死锁 . . . . . . . . . . . . . . . . . . . . 226 17.2.2 请求对象类型与生命周期 . . . . . . . . . . . . . . . . . . . . . . . 226 17.2.3 请求对象功能与方法 . . . . . . . . . . . . . . . . . . . . . . . . . . 226 17.2.4 取得请求头 . . . . . . . . . . . . .0 码力 | 330 页 | 6.54 MB | 1 年前3Hello 算法 1.0.0b4 Java版
淘宝订单。购物者下单后,订单将加入队列中,系统随后会根据顺序依次处理队列中的订单。在双十一 期间,短时间内会产生海量订单,高并发成为工程师们需要重点攻克的问题。 ‧ 各类待办事项。任何需要实现“先来后到”功能的场景,例如打印机的任务队列、餐厅的出餐队列等。 队列在这些场景中可以有效地维护处理顺序。 5.3. 双向队列 对于队列,我们仅能在头部删除或在尾部添加元素。然而,「双向队列 Deque」提供了更高的灵活性,允许 。换句话说,双向队列需要实现另一个对称方向 的操作。为此,我们采用「双向链表」作为双向队列的底层数据结构。 我们将双向链表的头节点和尾节点视为双向队列的队首和队尾,同时实现在两端添加和删除节点的功能。 5. 栈与队列 hello‑algo.com 83 Figure 5‑8. 基于链表实现双向队列的入队出队操作 以下是具体实现代码。 // === File: linkedlist_deque 这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(即队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。 请注意,“撤销”的核心逻辑仍然遵循0 码力 | 342 页 | 27.39 MB | 1 年前3Hello 算法 1.1.0 Java版
淘宝订单。购物者下单后,订单将加入队列中,系统随后会根据顺序处理队列中的订单。在双十一期 间,短时间内会产生海量订单,高并发成为工程师们需要重点攻克的问题。 ‧ 各类待办事项。任何需要实现“先来后到”功能的场景,例如打印机的任务队列、餐厅的出餐队列等, 队列在这些场景中可以有效地维护处理顺序。 5.3 双向队列 在队列中,我们仅能删除头部元素或在尾部添加元素。如图 5‑7 所示,双向队列(double‑ended 实现另一个对称方向 的操作。为此,我们采用“双向链表”作为双向队列的底层数据结构。 如图 5‑8 所示,我们将双向链表的头节点和尾节点视为双向队列的队首和队尾,同时实现在两端添加和删除 节点的功能。 图 5‑8 基于链表实现双向队列的入队出队操作 实现代码如下所示: // === File: linkedlist_deque.java === /* 双向链表节点 */ 第 5 章 栈与队列 这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。请 注意,“撤销”的核心逻辑仍然遵循栈0 码力 | 378 页 | 18.47 MB | 1 年前3Hello 算法 1.0.0 Java版
淘宝订单。购物者下单后,订单将加入队列中,系统随后会根据顺序处理队列中的订单。在双十一期 间,短时间内会产生海量订单,高并发成为工程师们需要重点攻克的问题。 ‧ 各类待办事项。任何需要实现“先来后到”功能的场景,例如打印机的任务队列、餐厅的出餐队列等, 队列在这些场景中可以有效地维护处理顺序。 5.3 双向队列 在队列中,我们仅能删除头部元素或在尾部添加元素。如图 5‑7 所示,「双向队列 double‑ended 实现另一个对称方向 的操作。为此,我们采用“双向链表”作为双向队列的底层数据结构。 如图 5‑8 所示,我们将双向链表的头节点和尾节点视为双向队列的队首和队尾,同时实现在两端添加和删除 节点的功能。 图 5‑8 基于链表实现双向队列的入队出队操作 实现代码如下所示: // === File: linkedlist_deque.java === /* 双向链表节点 */ 第 5 章 栈与队列 这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。请 注意,“撤销”的核心逻辑仍然遵循栈0 码力 | 376 页 | 17.59 MB | 1 年前3Hello 算法 1.2.0 简体中文 Java 版
淘宝订单。购物者下单后,订单将加入队列中,系统随后会根据顺序处理队列中的订单。在双十一期 间,短时间内会产生海量订单,高并发成为工程师们需要重点攻克的问题。 ‧ 各类待办事项。任何需要实现“先来后到”功能的场景,例如打印机的任务队列、餐厅的出餐队列等, 队列在这些场景中可以有效地维护处理顺序。 5.3 双向队列 在队列中,我们仅能删除头部元素或在尾部添加元素。如图 5‑7 所示,双向队列(double‑ended 实现另一个对称方向 的操作。为此,我们采用“双向链表”作为双向队列的底层数据结构。 如图 5‑8 所示,我们将双向链表的头节点和尾节点视为双向队列的队首和队尾,同时实现在两端添加和删除 节点的功能。 图 5‑8 基于链表实现双向队列的入队出队操作 实现代码如下所示: // === File: linkedlist_deque.java === /* 双向链表节点 */ 第 5 章 栈与队列 这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。请 注意,“撤销”的核心逻辑仍然遵循栈0 码力 | 379 页 | 18.48 MB | 10 月前3Hello 算法 1.0.0b5 Java版
淘宝订单。购物者下单后,订单将加入队列中,系统随后会根据顺序依次处理队列中的订单。在双十一 期间,短时间内会产生海量订单,高并发成为工程师们需要重点攻克的问题。 ‧ 各类待办事项。任何需要实现“先来后到”功能的场景,例如打印机的任务队列、餐厅的出餐队列等。 队列在这些场景中可以有效地维护处理顺序。 5.3 双向队列 在队列中,我们仅能在头部删除或在尾部添加元素。如图 5‑7 所示,「双向队列 deque」提供了更高的灵活 实现另一个对称方向 的操作。为此,我们采用“双向链表”作为双向队列的底层数据结构。 如图 5‑8 所示,我们将双向链表的头节点和尾节点视为双向队列的队首和队尾,同时实现在两端添加和删除 节点的功能。 第 5 章 栈与队列 hello‑algo.com 100 图 5‑8 基于链表实现双向队列的入队出队操作 实现代码如下所示。 // === File: linkedlist_deque 这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(即队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。 请注意,“撤销”的核心逻辑仍然遵循0 码力 | 376 页 | 30.69 MB | 1 年前3跟我学Shiro - 张开涛
Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,因为它相 当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大,但是在实际工作时 可能并不需要那么复杂的东西,所以使用小而简单的 Shiro 就足够了。对于它俩到底哪个 好,这个不必纠结,能更简单的解决项目问题就好了。 本教程只介绍基本的 Shiro 使用,不会过多分析源码等,重在使用。 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓 存等。这不就是我们想要的嘛,而且 Shiro 的 API 也是非常简单;其基本功能点如下图所 示: Authentication:身份认证/登录,验证用户是不是拥有相应的身份; Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用 一个线程,能 把权限自动传播过去; Testing:提供测试支持; Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问; Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录 了。 记住一点,Shiro 不会去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过 相应的接口注入给 Shiro 即可。 接下来我们分别从外部和内部来看看0 码力 | 219 页 | 4.16 MB | 10 月前3Hello 算法 1.0.0b1 Java版
淘宝订单。购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在 双十一时,在短时间内会产生海量的订单,如何处理「高并发」则是工程师们需要重点思考的问题。 ‧ 各种待办事项。任何需要实现“先来后到”的功能,例如打印机的任务队列、餐厅的出餐队列等等。 5.3. 双向队列 对于队列,我们只能在头部删除或在尾部添加元素,而「双向队列 Deque」更加灵活,在其头部和尾部都能 执行元素添加或删除操作。 例如,给定一个包含 ? 个学生的数据库,每个学生有“姓名 name ”和“学号 id ”两项数据,希望实现一个查 询功能:输入一个学号,返回对应的姓名,则可以使用哈希表实现。 Figure 6‑1. 哈希表的抽象表示 6.1.1. 哈希表效率 除了哈希表之外,还可以使用以下数据结构来实现上述查询功能: 1. 无序数组:每个元素为 [学号, 姓名] ; 2. 有序数组:将 1. 中的数组按照学号从小到大排序; 的右子结点。 Figure 7‑28. 有 grandChild 的左旋操作 观察发现,「左旋」和「右旋」操作是镜像对称的,两者对应解决的两种失衡情况也是对称的。根据对称性,我 们可以很方便地从「右旋」推导出「左旋」。具体地,只需将「右旋」代码中的把所有的 left 替换为 right 、 所有的 right 替换为 left ,即可得到「左旋」代码。 7. 树 hello‑algo.com 1160 码力 | 186 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b2 Java版
淘宝订单。购物者下单后,订单就被加入到队列之中,随后系统再根据顺序依次处理队列中的订单。在 双十一时,在短时间内会产生海量的订单,如何处理「高并发」则是工程师们需要重点思考的问题。 ‧ 各种待办事项。任何需要实现“先来后到”的功能,例如打印机的任务队列、餐厅的出餐队列等等。 5.3. 双向队列 对于队列,我们只能在头部删除或在尾部添加元素,而「双向队列 Deque」更加灵活,在其头部和尾部都能 执行元素添加或删除操作。 nums[index(j)]; } return res; } } 5.3.3. 双向队列应用 双向队列同时表现出栈与队列的逻辑,因此可以实现两者的所有应用,并且提供更高的自由度。 我们知道,软件的“撤销”功能需要使用栈来实现;系统把每一次更改操作 push 到栈中,然后通过 pop 实现 撤销。然而,考虑到系统资源有限,软件一般会限制撤销的步数(例如仅允许保存 50 步),那么当栈的长度 > 50 时 例如,给定一个包含 ? 个学生的数据库,每个学生有“姓名 name ”和“学号 id ”两项数据,希望实现一个查 询功能:输入一个学号,返回对应的姓名,则可以使用哈希表实现。 Figure 6‑1. 哈希表的抽象表示 6.1.1. 哈希表效率 除了哈希表之外,还可以使用以下数据结构来实现上述查询功能: 1. 无序数组:每个元素为 [学号, 姓名] ; 2. 有序数组:将 1. 中的数组按照学号从小到大排序;0 码力 | 197 页 | 15.72 MB | 1 年前3
共 36 条
- 1
- 2
- 3
- 4