[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 语句进行查询、插入、更新和删除等操作。因此,熟练掌…...

MySQL索引数据结构入门
之前松哥写过一个 MySQL 系列,但是当时是基于 MySQL5.7 的,最近有空在看 MySQL8 的文档,发现和 MySQL5.7 相比还是有不少变化,同时 MySQL 又是小伙伴们在面试时一个非常重要的知识点,因此松哥打算最近再抽空和小伙伴们…...

《低代码PaaS驱动集团企业数字化创新白皮书》-低代码PaaS应对行业集团企业数字化应用的需求(制造)
低代码PaaS应对行业集团企业数字化应用的需求 制造 制造业是我国重要的经济支柱之一,随着经济结构的调整,产业链的转移,劳动密集型制造业的利润已大不如前。在数字经济的大环境下,诸多制造业企业选择数字化转型,通过…...

深度学习实战26-(Pytorch)搭建TextCNN实现多标签文本分类的任务
大家好,我是微学AI,今天给大家介绍一下深度学习实战26-(Pytorch)搭建TextCNN实现多标签文本分类的任务,TextCNN是一种用于文本分类的深度学习模型,它基于卷积神经网络(Convolutional Neural Networks, CNN)实现。TextCNN的主要思想…...

还在精神内耗?还在焦虑?可以看看这个
作为一个即将毕业的本科生,总是会不由自主的焦虑。因为不考研,所以显得和同学们格格不入,每天都在进行精神内耗,但是我不经意间看到了一个东西-《邓宁克鲁格效应》 上述的四个阶段刻画出了一条典型的“大师养成之路”。但大师毕竟…...

Event Camera (事件相机)
1.传统相机的缺点 1.随着计算机视觉领域的不断发展,目标检测的算法也越来越多样化,特别是近些年深度学习在计算机视觉领域的进步,已经产生了很多优秀的目标检测方法,这些基于帧的方法对于图片的质量有一定的要求,比如合…...

藏经阁(七)有源蜂鸣器和无源蜂鸣器 解析
文章目录 特征区别场景选型实战应用 特征 有源蜂鸣器特征: 又被称为直流蜂鸣器包含了一个多谐振荡器只要额定直流电压可以在两端发出声音具有驱动控制简单价格略高 无源蜂鸣器特征: 又被称为交流蜂鸣器内部没有振荡器需要在两端施加特定频率的方波电…...

配置FTP/TFTP协议的ASPF
在多通道协议和NAT的应用中,ASPF是重要的辅助功能。通过配置ASPF功能,实现内网正常对外提供FTP和TFTP服务,同时还可避免内网用户在访问外网Web服务器时下载危险控件。 组网需求 如图1所示,FW部署在某公司的出口,公司提…...

泛型基本说明
使用传统方法的问题分析 不能对加入到集合ArrayList中的数据类型进行约束(不安全)遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响。泛型的好处 编译时,检查添加元素的类型,提…...

干洗店洗鞋下店预约小程序开发多少钱
干洗店小程序是一种便捷的移动应用程序,能够帮助用户快捷、轻松地处理干洗、洗衣和清洗等服务。随着智能手机普及和人们生活节奏的不断加快,越来越多人选择使用干洗店小程序来满足自己的日常衣物清洗需求。那干洗店小程序怎么弄,洗衣预约小程…...

用Python实现批量翻译文档文件
文件名批量翻译需要用到编程语言和相应的翻译 API,下面以 Python 和 Google 翻译 API 为例,介绍具体的实现步骤: 安装必要的 Python 库 使用 Python 代码进行文件名翻译需要先安装两个库:googletrans 和 os。 pip install goog…...