《On Java进阶卷》阅读笔记(五)
第7章 IO系统
I/O流:
IO有很多不同的来源和去处,如文件、控制台网络连接等,而且还涉及需求以很多种方式,如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等。
Java8的函数式流相关的类和IO流之间并无关联。
IO流隐藏了实际的IO设备中数据情况的下列细节:
- 字节流用于处理原始的二进制数据。
- 字符流用于处理字符数据。它会自动处理和本地字符集间的相互转换。
- 缓冲区流提升了性能。它通过减少调用本地API的次数,优化了输入和输出。
输入里read()方法,用于从字节数组中读取单个字节或字节数组。
输出里write()方法,用于写入单个字节或字节数组。
各种InputStream类型:
- 字节数组
- 字符串对象
- 文件
- 管道
- 其他流组成的序列,这样可以将这些流合并成单个流。
- 其他源,例如外部网络连接。
类
功能
使用方法
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进阶】验证码案例
目 🌲实现说明 🎄Hutool介绍 🌳准备工作 🌴约定前后端交互接口 🚩接口定义 🚩实现服务器后端代码 🚩前端代码 🚩整体测试 🌲实现说明 随着安全性的要求越来越⾼…...
Uniapp 短视频去水印解析工具开发实现
最近搞了一个有意思的小工具——短视频去水印解析器!这玩意儿可以把短视频中的水印给抹掉,还能提取视频、封面等资源。整个项目用了 Uniapp 开发,做完后体验了一下,发现还挺顺手。今天就来跟大家聊聊实现思路和代码细节~ 需求分析…...
计算机网络-八股-学习摘要
一:HTTP的基本概念 全称: 超文本传输协议 从三个方面介绍HTTP协议 1,超文本:我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…...
编程速递-庆祝Delphi诞生30周年!
庆祝Delphi 30周年纪念是一个特别的时刻。 回到1995年,也就是30年前,在微软Windows和互联网时代的曙光初现之时,Borland Delphi的创建者们无法想象,当时使用Borland Delphi构建的应用程序至今仍在运行——为全世界数十亿人服务。…...
每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块
本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…...
性能测试流程、主流性能工具
性能测试流程 性能测试流程 测试测试需求分析 性能测试计划和方案 测什么: 测试背景 测试目的 测试范围 谁来测: 进度和分工 交付清单 怎么测: 测试策略 性能测试用例设计 性能测试测试执行 性能分析和调优 性能测试报告 测试报告是…...
DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏
DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器,可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API,开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…...
无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架
Solon 框架! Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet&#…...
【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版
针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接:https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录,保持与游戏主程序同目录下。...
使用 playwright 自定义 js 下载的路径和文件名
遇到一个问题,点击按钮自动下载文件,路径和文件名都不能自定义,可以用 playwright 来解决这个问题 from playwright.sync_api import sync_playwright import os import time class ExcelDownloader: def __init__(self, download_pat…...
Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析
#作者:孙德新 文章目录 分区分配操作(kafka-reassign-partitions.sh)1.1 分区扩容、数据均衡、迁移(kafka-reassign-partitions.sh)1.2、修改topic分区partition的副本数(扩缩容副本)1.3、Partition Reassign场景限流1.4、节点内副本移动到不…...
3.从零开始学会Vue--{{生命周期,工程化,组件化}}
1.生命周期钩子 1.是什么 生命周期 概念:就是一个Vue实例从创建 到 销毁 的整个过程 生命周期包括:① 创建 ② 挂载 ③ 更新 ④ 销毁 四个阶段 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改…...
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内存主要分为栈和堆,方法相关的部分主要在栈内存里,每个方法调用时会在栈里创建一个栈帧,存放局部变量和方法执行的信息。执行完后栈帧被销毁,局部变量消失。而对象实例存在堆里,由垃圾回收器管理。 **Java方法内…...
SQLMesh 系列教程4- 详解模型特点及模型类型
SQLMesh 作为一款强大的数据建模工具,以其灵活的模型设计和高效的增量处理能力脱颖而出。本文将详细介绍 SQLMesh 模型的特点和类型,帮助读者快速了解其强大功能。我们将深入探讨不同模型类型(如增量模型、全量模型、SCD Type 2 等࿰…...
SpringBoot(接受参数相关注解)
文章目录 1.基本介绍2.PathVariable 路径参数获取信息 1.代码实例 1.index.html2.ParameterController.java3.测试 2.细节说明 3.RequestHeader 请求头获取信息 1.代码实例 1.index.html2.ParameterController.java3.测试 2.细节说明 4.RequestParameter 请求获取参数信息 1.…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
