[API]节点流和处理流字节流和字符流(七)
java将流分为节点流和处理流两类:
-
节点流:也称为低级流,是真实连接程序和另一端的"管道",负责实际读写数据的流,读写一定是建立在节点流的基础之上进行的。节点流好比家里的"自来水管",连接我们的家庭与自来水厂,负责搬运水。就一对:文件流
-
处理流:也称为高级流,不能独立存在,必须连接在其他流上,目的是当数据经过当前流时对其进行某种加工处理,简化我们对数据的同等操作。高级流好比家里常见的对水做加工的设备,比如"净水器"、"热水器",有了它们我们就不必再自己对水进行加工了。好多对。
实际开发中我们经常会串联一组高级流最终连接到低级流上,在读写操作时以流水线式的加工来完成复杂IO操作,这个过程称为"流的连接"
缓冲流:是一对高级流,作用是提高读写数据的效率。
-
缓冲流内部有一个字节数组,默认长度是8K.缓冲流读写数据时一定是将数据的读写方式转换为块读写来保证读写效率.
-
通过缓冲流写出的数据会被临时存入缓冲流内部的字节数组,直到数组存满数据才会真实写出一次
package io;import java.io.*;/*** 缓冲流:是一对高级流,作用是加快读写效率* 1)BufferedInputStream:缓冲输入流* 2)BufferedOutputStream:缓冲输出流* 缓冲流读写效率快的原因:* 1)缓冲流内部有一个8KB的字节数组,* 你看着是一个字节一字节的读写,但缓冲流底层已经把它转换为块读写了* 缓冲流何时用才有意义:* 1)不同的高级流有不同的功能,但只有缓冲流才具有加速功能(块读写),* 其它的高级流不具备加速功能,都是单字节读写,* 此时若又想先完成功能再加速处理,则需要流连接,将功能流连到缓冲流上*/
public class CopyDemo3Buffered {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("wkj.jpg");BufferedInputStream bis = new BufferedInputStream(fis);FileOutputStream fos = new FileOutputStream("wkj_cp2.jpg");BufferedOutputStream bos = new BufferedOutputStream(fos);long start = System.currentTimeMillis();int d;while((d=bis.read())!=-1){ //使用缓冲流读取字节bos.write(d); //使用缓冲流写出字节}long end = System.currentTimeMillis();System.out.println("复制完毕!耗时:"+(end-start)+"ms");bis.close(); //只需关高级流,因为高级流中先关了低级流bos.close();}
}
对象流:是一对高级流,在流连接中的作用是进行对象的序列化与反序列化。
-
对象序列化:将一个java对象按照其结构转换为一组字节的过程
注意:
-
需要进行序列化的类必须实现接口:java.io.Serializable
-
transient关键字可以修饰属性,用于在进行对象序列化时忽略不必要的属性,达到对象瘦身的目的
-
package io;import java.io.Serializable;
import java.util.Arrays;/*** 学生类*/
public class Student implements Serializable {//私有属性、公开构造、公开getter/setter、重写toString()private String name;private int age;private String gender;/*当一个属性被关键字transient修饰后,当这个对象进行序列化时,此属性值会被忽略忽略不必要的属性值可以达到对象序列化瘦身的目的,可以减少磁盘开销或提高网络传输效率*/private transient String[] otherInfo;public Student() {}public Student(String name, int age, String gender, String[] otherInfo) {this.name = name;this.age = age;this.gender = gender;this.otherInfo = otherInfo;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String[] getOtherInfo() {return otherInfo;}public void setOtherInfo(String[] otherInfo) {this.otherInfo = otherInfo;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +", otherInfo=" + Arrays.toString(otherInfo) +'}';}
}package io;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;/*** 对象流:处理流/高级流---ObjectInputStream和ObjectOutputStream* 1)作用:进行对象的序列化和反序列化* 2)对象序列化:将一个java对象转换为一组字节的过程称为对象序列化* 对象反序列化:将一组字节还原为java对象*/
public class OOSDemo {public static void main(String[] args) throws IOException {String name = "张三";int age = 25;String gender = "男";String[] otherInfo = {"是一名学生","黑龙江佳木斯的","喜欢打篮球","喜欢王老师"};Student zs = new Student(name,age,gender,otherInfo);System.out.println(zs);/*** 对象输出流的writeObject()可以进行对象的序列化* 对象输出流在序列化对象时,必须保证序列化对象必须实现Serializable接口* 若没有实现序列化接口会发生NotSerializableException异常*/FileOutputStream fos = new FileOutputStream("student.obj");ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(zs);System.out.println("写出完毕");oos.close();}
}
对象反序列化:将一组字节还原为java对象(前提是这组字节是一个对象序列化得到的字节)
package io;import java.io.*;/*** 使用对象输入流进行对象的反序列化* 反序列化:将一组字节还原为java对象*/
public class OISDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {/*Object readObject():对象输入流的readObject()可以进行对象的反序列化注意:对象输入流通过下面所连接的流来读取的字节必须是对象输出流序列化对象之后的一组字节说白了:序列化的是学生对象,反序列化出来的也一定是学生对象*/FileInputStream fis = new FileInputStream("student.obj");ObjectInputStream ois = new ObjectInputStream(fis);Object obj = ois.readObject();Student zs = (Student)obj;System.out.println(zs);ois.close();}
}
IO将流按照读写单位划分为字节流和字符流:
- 字节流的超类: InputStream和OutputStream,以字节为单位读写数据的流
- 字符流的超类:Reader和Writer,以字符为单位读写数据的流
注意:
这两组超类是平级关系,互相不存在继承关系
字节流分低级流也有高级流,文件流为低级流,缓冲流和对象流为高级流
字符流都是高级流
字符流最小读写单位为字符(char),但是底层实际还是读写字节,只是字符与字节的转换工作由字符流完成.
-
常用的字节流有三种:
-
文件流:是一组低级流(见昨天的笔记)
-
缓冲流:是一组高级流(见上)
-
对象流:是一组高级流(见上)
-
-
常用的字符流有两种:
-
转换流:是一组高级流
-
...........(见下篇):
-
-
转换流:是一对高级流,它们是字符流非常常用的一对实现类同时也是一对高级流,实际开发中我们不直接操作它们,但是它们在流连接中是非常重要的一环.
-
转换流在在流连接中的意义:由于其它字符流在流连接中要求只能连接在其它字符流上,而不能直接连接在字节流上,原因:字符流是以字符为单位读写,而字节流是以字节为单位读写,读写单位不同,因此不能直接串联在一起工作。转换流是一对字符流,并且是唯一可以直接连接在字节流上的字符流。因此其它字符流都只能连接在转换流上,而转换再连接在字节流上,实现串联起写读写
-
package io;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;public class OSWDemo {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("osw.txt");//创建转换流时通常会指定第2个参数来明确字符集,以此来保证跨平台性OutputStreamWriter osw = new OutputStreamWriter(fos,StandardCharsets.UTF_8);osw.write("和我在成都的街头走一走,哦哦哦哦...");osw.write("直到所有的灯都熄灭了也不停留");System.out.println("写出完毕!");osw.close(); //关闭高级流时会自动关闭低级流}
}package io;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;/*** 使用转换流读取文本数据*/
public class ISRDemo {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("osw.txt");InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);/*int read()读取1个字符(到底读取几个字节要根据它的内容以及对应的字符集来决定)返回的int值实际上是一个char,返回-1表示读取了末尾*/int d;while((d=isr.read())!=-1){System.out.print((char)d);}isr.close();}
}
相关文章:
[API]节点流和处理流字节流和字符流(七)
java将流分为节点流和处理流两类: 节点流:也称为低级流,是真实连接程序和另一端的"管道",负责实际读写数据的流,读写一定是建立在节点流的基础之上进行的。节点流好比家里的"自来水管",…...
开心档之C++ 模板
C 模板 目录 C 模板 函数模板 实例 类模板 实例 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用…...

拥抱还是革命,ChatGPT时代 AI专家给出15条科研生存之道
来源:专知 微信号:Quan_Zhuanzhi 你是学术机构的人工智能研究员吗?你是否担心自己无法应对当前人工智能的发展步伐?您是否觉得您没有(或非常有限)访问人工智能研究突破所需的计算和人力资源?你并不孤单; 我们有同样的感觉。越来越多的人工智能学者不…...
python算法中的数学算法(详解下)
目录 一. 学习目标: 二. 学习内容: Ⅰ. 数值优化 ①、均值 ②、方差 ③、协方差...

Docker Desktop使用PostgreSql配合PGAdmin的使用
在看此教程之前,请先下载安装Docker Desktop 安装成功可以查看版本 然后拉取postgresql的镜像:docker pull postgres:14.2 版本可以网上找一个版本,我的不是最新的 发现会报一个问题 no matching manifest for windows/amd64 10.0.19045 i…...

大佬入局AI,职场人有新机会了?
卸任搜狗CEO一年半后,王小川宣布在AI大模型领域创业,与前搜狗COO茹立云联合成立人工智能公司百川智能,打造中国版的OpenAI,并对媒体表示:“追上ChatGPT水平,我觉得今年内可能就能够实现,但对于G…...

《攻防演练》在没有基础安全能力的情况下如何做好蓝队防守
目的: 1、净化企业或机构的网络环境、强化网络安全意识; 2、防攻击、防破坏、防泄密、防重大网络安全故障; 3、检验企业关键基础设施的安全防护能力; 4、提升关键基础设施的网络安全防范能力和水平。 现状: 那么问…...
SLAM 十四讲(第一版)疑难排查
SLAM 十四讲(第一版)疑难排查 记录《SLAM 十四讲(第一版)》学习过程遇到的疑难杂症和排查结果,包括数学上的和编程环境上的,欢迎补充。 0. 使用软件环境 WSL:windows 下的 linux 子系统&…...

JavaScript的基础语法学习
文章目录 一、JavaScript let 和 const二、JavaScript JSON三、javascript:void(0) 含义四、JavaScript 异步编程总结 一、JavaScript let 和 const let 声明的变量只在 let 命令所在的代码块内有效。 const 声明一个只读的常量,一旦声明,常量的值就不…...
大语言模型Prompt工程之使用GPT4生成图数据库Cypher
大语言模型Prompt工程之使用GPT4生成图数据库Cypher 大语言模型Prompt工程之使用GPT4生成图数据库Cypher Here’s the table of contents: 大语言模型Prompt工程之使用GPT4生成图数据库Cypher 使用GPT4测试了生成Cypher的能力,没想到大型语言模型(LLM,La…...

ChatGPT已死?AutoGPT太强?
今天聊聊 AutoGPT。 OpenAI 的 Andrej Karpathy 都大力宣传,认为 AutoGPT 是 prompt 工程的下一个前沿。 近日,AI 界貌似出现了一种新的趋势:自主人工智能。 这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉…...

Java基础总结(二)
文章目录 一、ObjectObject中的成员方法(11个)toStringequalsclone 二、Objects三、BigInteger和BigDecimaBigIntegerBigDecima 四、正则表达式五、DateJDK7前时间相关类SimpleDateFormat类Calendar类 JDK8新增时间相关类 六、包装类异常 一、Object 没…...

大数据-玩转数据-oracle创建dblink及应用
一、创建DBLINK的应用场景 oracle在进行跨库访问时,可以通过创建dblink实现。 二、创建DBLINK应用场景 在tnsnames.ora中配置两个数据库别名:orcl(用户名:wangyong 密码:1988)、orcl2(用户名:wangyong 密码…...

冯诺依曼体系结构
冯诺依曼体系结构 目录 冯诺依曼体系结构引入1、冯诺依曼体系结构1.1 内存1.2 操作系统预加载 2、操作系统2.1 理解管理2.2 系统调用接口2.3 操作系统四大基本功能 引入 冯诺依曼体系结构(von Neumann architecture)是现代计算机体系结构的基础…...

Axios请求(对ajax的二次封装)——Axios API、Axios实例、请求配置、Axios响应结构
axios起步——介绍和使用基本用例post请求 场景复现核心干货axios APIaxios(config)axios(url[,config])请求方式别名 axios实例创建一个axios实例axios.create([config])实例方法 axios请求配置axios响应结构 场景复现 最近学习与前端相关的小程序时,接触了异步请…...

Scrum of Scrums规模化敏捷开发管理全流程
Scrum of Scrums是轻量化的规模化敏捷管理模式,Leangoo领歌可以完美支持Scrum of Scrums多团队敏捷管理。 Scrum of Scrums的场景 Scrum of Scrums是指多个敏捷团队共同开发一个大型产品、项目或解决方案。Leangoo提供了多团队场景下的产品路线图规划、需求管理、…...

BP神经网络原来就是曲线拟合
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 在初学BP神经网络的时候,总是非常抽象和难理解 但是,学久了会发现,BP神经网络原来就是曲线拟合! 一下子才具体、深入的理解到BP神经网络是什么 本文…...
Oracle数据库查看与修改内存配置
Oracle数据库查看与修改内存配置 Oracle内存管理模式查看Oracle内存分配修改Oracle内存分配 Oracle内存管理模式 Oracle数据库的内存管理模式从自动管理化程度由高到低依次可以分为: 自动内存管理:完全由Oracle自动管理内存分配。DBA只需设置MEMORY_TA…...

Jenkins自动拉取SVN源代码构建打包vue前端项目
目录 1.功能需求 2.安装插件 2.1 安装NodeJS插件 2.2 安装SVN插件 3.配置环境 3.1 NodeJS环境 4.新建任务配置部署信息 4.1 源代码管理 4.2 构建触发器 4.3 构建环境 4.4 构建步骤 5.构建项目 5.1 点击查看控制台日志 1.功能需求 使用Jenkins从SVN上拉取Vue项…...

MySQL表的操作
文章目录: 创建表查看表结构修改表删除表 在使用 MySQL 数据库时,操作表是最基本和最重要的任务之一。表是 MySQL 数据库的核心对象,用于存储数据,并且可以通过 SQL 语句进行查询、插入、更新和删除等操作。因此,熟练掌…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...