当前位置: 首页 > news >正文

《On Java进阶卷》阅读笔记(五)

第7章 IO系统

I/O流:

IO有很多不同的来源和去处,如文件、控制台网络连接等,而且还涉及需求以很多种方式,如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等。

Java8的函数式流相关的类和IO流之间并无关联。

IO流隐藏了实际的IO设备中数据情况的下列细节:

  1. 字节流用于处理原始的二进制数据。
  2. 字符流用于处理字符数据。它会自动处理和本地字符集间的相互转换。
  3. 缓冲区流提升了性能。它通过减少调用本地API的次数,优化了输入和输出。

输入里read()方法,用于从字节数组中读取单个字节或字节数组。

输出里write()方法,用于写入单个字节或字节数组。

各种InputStream类型:

  1. 字节数组
  2. 字符串对象
  3. 文件
  4. 管道
  5. 其他流组成的序列,这样可以将这些流合并成单个流。
  6. 其他源,例如外部网络连接。

功能

使用方法

ByteArrayInputStream

使内存中的缓冲区可以充当InputStream

作为一种数据源:通过将其连接到FilterInputStream对象来提供有用的接口

StringBufferInputStream

将字符串转换为InputStream

作为一种数据源:通过将其连接到FilterInputStream对象来提供有用的接口

FileInputStream

用于从一个文件中读取信息

作为一种数据源:通过将其连接到FilterInputStream对象来提供有用的接口

PipedInputStream

用于生成写入到对应的PipedOutputStream中的数据。它实现了管道传输的概念

作为一种多线程形式数据源:通过将其连接到FilterInputStream对象来提供有用的接口

SequenceInputStream

将两个以上的InputStream转换为单个InputStream

作为一种数据源:通过将其连接到FilterInputStream对象来提供有用的接口

FilterInputStream

作为装饰器接口的抽象类,装饰器用来为其他InputStream类提供有用的功能。

各种OutputStream类型:

功能

使用方法

ByteArrayOutputStream

在内存创建一块缓冲区,所有发送到流中的数据都被放在该缓冲区

用于指定数据的目的地:通过将其连接到FilterOutputStream对象来提供有用的接口

FileOutputStream

用于向文件发送信息

用于指定数据的目的地:通过将其连接到FilterOutputStram对象来提供有用的接口

PipedOutputStream

向其中写入的任何信息都将自动作为对应的PipedInputStream的输入。实现了管道传输的概念。

用于为多线程制定数据的目的地:通过将其连接到FilterOutputStream对象来提供有用的接口

FilterOutputStream

作为装饰器接口的抽象类,装饰器用来为其他OutputStream类提供有用的功能

各种FilterInputStream类型:

功能

使用方法

DataInputStream

与DataOutputStream配合使用,以可移植的方式从流中读取基本类型,int、char、long等

包含用于读取基本类型的全部接口

BufferedInputStream

用于防止在每次需要更多数据时都进行物理上的读取。相等于声明使用缓冲区

这本质上并为提供接口,只是为进程增加缓冲操作而已,需要与接口对象搭配使用

LineNumberInputStream

记录输入流中的行号,可以调用getLineNumber()和setLineNumber(int)

只是增加了行号而已,因此可能需要与借口对象搭配使用

PushbackInputStream

包含一个单字节回退缓冲区,用于将最后读取的字符推回输入流

通常用于编译器的扫描器,一般不会用到

各种FilterOutputStream类型:

功能

使用方法

DataOutputStream

与DataInputStream搭配使用没这样就能以可移植的方式向流中写入基本类型

包含用于写入基本类型数据的全部接口

PrintStream

用于生成格式化的输出。DataOutputStream负责处理数据的存储,而PrintStream则负责处理数据的显示

应该作为OutputStream对象的最终包装,可能会经常用到

BufferedOutputStream

用来防止在每次发送数据的时候都发生物理写操作,相当于声明使用缓冲,可以调用flush方法来清空缓冲区

本质上并未提供借口,只是为进程增加缓冲操作而已,需要与借口对象搭配使用

独立的RandomAccessFile:

RandomAccesssFile适合用来处理由大小已知的记录组成的文件,由此可以通过seek方法在各条记录上来回移动,然后读取或者修改记录。文件中各条记录的大小不必相同,只需确定它们的大小以及在文件中的位置即可。

它是一个从零实现的、完全独立的类、有着完全属于自己、大部分是原生的方法,其行为和其他IO类型有本质上的区别。

IO流用法:

  • 缓冲输入文件,BufferdReader
  • 从内存输入,StringReader
  • 格式化的内存输入
  • 基本的文件输出
  • 存储和恢复数据
  • 读写随机访问文件

标准IO:

程序的所有输入都可以来自标准输入,所有输出都可以发送到标准输出,所有错误都可以发送到标准错误。

一个程序的标准输出可以称为另一个程序的标准输入。

新IO系统:

新IO库的目标只有一个:速度。

速度的提升来自于其所使用的更接近于操作系统的IO实现方式的结构:通道和缓冲区。

通道其实很简单:向其传入一个用于读写的Bytebuffer,然后锁住问区域以保证独占式访问。

FileChannel类,在旧IO系统中的类通过getChannel方法得到。

public class IOTest {public static void main(String[] args) {ByteBuffer byteBuffer = ByteBuffer.allocate(1024);try {FileInputStream inputStream = new FileInputStream("");FileChannel channel =  inputStream.getChannel();channel.read(byteBuffer);channel.write(byteBuffer);channel.lock();channel.tryLock();} catch (IOException e) {e.printStackTrace();}}
}

一旦调用了通道的read方法,就必须在缓冲区上调用flip方法,使缓冲区做好提取字节的准备。并且如果要用缓冲区来做进一步的read操作,就同样需要调用clear方法来让缓冲区为后续的每次read做好准备。

缓冲区中保存着简单的字节,为了将这些字节转换为字符,要么将字节放入的时候进行编码,要么在将他们从缓冲区中读取出来的时候进行解码。

ByteBuffer是由一个8字节的数组包装而成的,随后通过各种不同基本类型的师徒缓冲区将该数组显示出来。

字节序:不同的机器可以使用不同的字节排序方式保存数据。高位优先的方式将最高位的字节放在最低的内存地址,即内存起始地址。低位优先方式将最高位的字节放在最高的内存地址,即内存末尾地址。

内存映射文件:可以创建和修改那些因为太大而无法加载到内存中的文件。

通过在FileChannel上调用tryLock或lock,便可以获得整个文件上的FileLock。

相关文章:

《On Java进阶卷》阅读笔记(五)

第7章 IO系统 I/O流: IO有很多不同的来源和去处,如文件、控制台网络连接等,而且还涉及需求以很多种方式,如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等。 Java8的函数式流相关的类和IO流之间并无关联。 IO流隐藏了…...

《代码随想录》刷题笔记——回溯篇【java实现】

文章目录 组合组合总和 III电话号码的字母组合组合总和组合总和II思路代码实现 分割回文串※思路字符串分割回文串判断效率优化※ 复原 IP 地址优化版本 子集子集 II使用usedArr辅助去重不使用usedArr辅助去重 递增子序列※全排列全排列 II重新安排行程题意代码 N 皇后解数独直…...

数值积分:通过复合梯形法计算

在物理学和工程学中,很多问题都可以通过数值积分来求解,特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中,我将讨论如何使用 复合梯形法 来进行数值积分,并以一个简单的…...

AcWing——3624. 三值字符串

双指针解法 #include<iostream> #include<unordered_map> using namespace std; int main() {int n; cin >> n;while(n--){unordered_map<char, int> tree;string s; cin >> s;int ans 0x7fffffff; for(int i 0, j 0; j < (int)s.size();…...

【JavaEE进阶】验证码案例

目 &#x1f332;实现说明 &#x1f384;Hutool介绍 &#x1f333;准备工作 &#x1f334;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f6a9;实现服务器后端代码 &#x1f6a9;前端代码 &#x1f6a9;整体测试 &#x1f332;实现说明 随着安全性的要求越来越⾼…...

Uniapp 短视频去水印解析工具开发实现

最近搞了一个有意思的小工具——短视频去水印解析器&#xff01;这玩意儿可以把短视频中的水印给抹掉&#xff0c;还能提取视频、封面等资源。整个项目用了 Uniapp 开发&#xff0c;做完后体验了一下&#xff0c;发现还挺顺手。今天就来跟大家聊聊实现思路和代码细节~ 需求分析…...

计算机网络-八股-学习摘要

一&#xff1a;HTTP的基本概念 全称&#xff1a; 超文本传输协议 从三个方面介绍HTTP协议 1&#xff0c;超文本&#xff1a;我们先来理解「文本」&#xff0c;在互联网早期的时候只是简单的字符文字&#xff0c;但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…...

编程速递-庆祝Delphi诞生30周年!

庆祝Delphi 30周年纪念是一个特别的时刻。 回到1995年&#xff0c;也就是30年前&#xff0c;在微软Windows和互联网时代的曙光初现之时&#xff0c;Borland Delphi的创建者们无法想象&#xff0c;当时使用Borland Delphi构建的应用程序至今仍在运行——为全世界数十亿人服务。…...

每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块

本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…...

性能测试流程、主流性能工具

性能测试流程 性能测试流程 测试测试需求分析 性能测试计划和方案 测什么&#xff1a; 测试背景 测试目的 测试范围 谁来测&#xff1a; 进度和分工 交付清单 怎么测&#xff1a; 测试策略 性能测试用例设计 性能测试测试执行 性能分析和调优 性能测试报告 测试报告是…...

DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏

DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器&#xff0c;可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API&#xff0c;开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…...

无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架

Solon 框架&#xff01; Solon 是新一代&#xff0c;Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目&#xff08;最近“杭州六小龙”很火啊&#xff0c;我们也是杭州的哦&#xff09;。从零开始构建&#xff08;No Spring、No Java-EE、No Servlet&#…...

【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版

针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接&#xff1a;https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录&#xff0c;保持与游戏主程序同目录下。...

使用 playwright 自定义 js 下载的路径和文件名

遇到一个问题&#xff0c;点击按钮自动下载文件&#xff0c;路径和文件名都不能自定义&#xff0c;可以用 playwright 来解决这个问题 from playwright.sync_api import sync_playwright import os import time class ExcelDownloader: def __init__(self, download_pat…...

Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析

#作者&#xff1a;孙德新 文章目录 分区分配操作(kafka-reassign-partitions.sh)1.1 分区扩容、数据均衡、迁移(kafka-reassign-partitions.sh)1.2、修改topic分区partition的副本数&#xff08;扩缩容副本&#xff09;1.3、Partition Reassign场景限流1.4、节点内副本移动到不…...

3.从零开始学会Vue--{{生命周期,工程化,组件化}}

1.生命周期钩子 1.是什么 生命周期 概念&#xff1a;就是一个Vue实例从创建 到 销毁 的整个过程 生命周期包括&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁 四个阶段 1.创建阶段&#xff1a;创建响应式数据 2.挂载阶段&#xff1a;渲染模板 3.更新阶段&#xff1a;修改…...

Python--网络编程

3. 网络编程与Socket 3.1 Socket基础 创建Socket import socket# TCP Socket tcp_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# UDP Socket udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)服务器端函数 函数描述​bind((host, port))​绑定…...

【java】方法的基本内存原理(栈和堆)

java内存主要分为栈和堆&#xff0c;方法相关的部分主要在栈内存里&#xff0c;每个方法调用时会在栈里创建一个栈帧&#xff0c;存放局部变量和方法执行的信息。执行完后栈帧被销毁&#xff0c;局部变量消失。而对象实例存在堆里&#xff0c;由垃圾回收器管理。 **Java方法内…...

SQLMesh 系列教程4- 详解模型特点及模型类型

SQLMesh 作为一款强大的数据建模工具&#xff0c;以其灵活的模型设计和高效的增量处理能力脱颖而出。本文将详细介绍 SQLMesh 模型的特点和类型&#xff0c;帮助读者快速了解其强大功能。我们将深入探讨不同模型类型&#xff08;如增量模型、全量模型、SCD Type 2 等&#xff0…...

SpringBoot(接受参数相关注解)

文章目录 1.基本介绍2.PathVariable 路径参数获取信息 1.代码实例 1.index.html2.ParameterController.java3.测试 2.细节说明 3.RequestHeader 请求头获取信息 1.代码实例 1.index.html2.ParameterController.java3.测试 2.细节说明 4.RequestParameter 请求获取参数信息 1.…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...