JAVA SE: IO流
一、Java流式输入输出原理
Java对于输入输出是以流(Stream)的方式进行的,JDK提供各种各样的“流”类,以获取不同类型的数据。
可以理解为将管道插入到文件中,然后从管道获取数据。这个管道外边还可以套管道,外边的管道对数据进行处理,即套了“处理流”。
二、输入输出流分类
按功能:数据流、处理流
按方向:输入流、输出流
按数据单位:字节流、字符流(2个字节)
Java.io内的流类型继承自一下四种:
2种输入输出 * 2中数据单位:(字节) InputStream、OutputStream、(字符)Reader、Writer
Tip:这里的输入输出是站在程序角度来看的
三、字节流和处理流
字节流:从节点读写数据(如文件、内存)
处理流:套在字节流外,对数据进行处理,为程序提供更强大的读写能力
3.1 字节流类型
类型 | 字节流(1字节)InputStream OutputStream | 字符流(2字节) Reader Writer |
File (File) | FileInputStream FileOutputStream | FileReader FileWriter |
MemoryArray (ByteArray/CharArray) | ByteArrayInputStream ByteArrayOutputStream | CharArrayReader CharArrayWriter |
MemoryString (String) | - - | StringReader StringWriter |
Pipe (Piped) | PipedInputStream PipedOutputStream | PipedReader PipedWriter |
3.2 处理流类型
处理类型 | 字节 InputStream/Steam OutputStream | 字符 Reader Writer |
Buffering | BufferedInputStream BufferedOutputStream | BufferedReader BufferedWriter |
Filtering | FilterInputStream FilterOutputStream | FilterReader FilterWriter |
bytes和chaacter之间转换 | InputStreamReader OutputStreamWriter | |
Object Serialization | ObjectInputStream ObjectOutputStream | |
Data conversion | DataInputStream DataOutputStream | |
Counting | LineNumberInputStream | LineNumberReader |
Peeking ahead | PushbackInputStream | PushbackReader |
Printing | PrintStream | PrintWriter |
四、字节流
InputStream
以字节形式向程序输入数据(8bit)
基本步骤:
新建FileInputStream对象in
打开文件
try:new一个文件路径的对象,给in;
catch:FileNotFoundException
读取文件
try:
判断in.read()是不是-1, 是的话就到头了,就不读了、
关闭in
catch:IOException
总结:
以字节的形式挨个读取,输出时要用(char)将ASC码转换出来
FileInputStream对象,new、赋值、.read()、close()
两个异常:FileNotFoundException、IOException
public static void main(String[] args) {int b = 0;// 新建一个FileInputStream对象FileInputStream in = null;try {// 给FileInputStream赋值in = new FileInputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number.txt");}catch (FileNotFoundException e){System.out.println("系统找不到指定文件");System.exit(-1);// 系统非正常退出}// 开始读取long num = 0; // 记录读取了多少个数字try {while ((b = in.read() )!= -1){ // 主要是in.read()System.out.println((char)b);num++;}in.close(); // 关闭输入流System.out.println();System.out.println("总共读了" + num + "个字节");}catch(IOException e){System.out.println("文件读取错误");}}
OutputStream
新建:new一个OutputStream对象,=null
读写:
文件名对应一个对象,赋值给上面新建的对象,这里存在找不到文件的可能(FileNotFoundException)
将东西写到对应的OutputStream中,存在复制失败的可能(IOException)
关闭:各种close(), (也要IOException)
public static void main(String[] args) {FileInputStream in = null;FileOutputStream out = null;try {// 新建, 以下需catch FileNotFoundExceptionin = new FileInputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number.txt");out = new FileOutputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number2.txt");// 读写。 以下需catch IOExceptionint b = 0;while ((b = in.read()) != -1){out.write((char)b);}// 关闭in.close();out.close();}catch(FileNotFoundException e){System.out.println("系统没有找到指定文件");System.exit(-1);}catch (IOException e){System.out.println("读写错误");}
Reader/Writer
注意这里的writer,要写成String.valueOf(i)
因为,int是4个字节,API里写入了低16位的2个字节,忽略了高16位的2个字节。
所以,在输入到文件时不妨吧整形转为char 或者字符串


fw.write(String.valueOf(12));
fw.write(Character.valueOf('1')); public static void main(String[] args) {FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number.txt");fw = new FileWriter("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number3.txt");// 读写for(int i = 0; i < 30; i++){fw.write(String.valueOf(i));}// 关闭fr.close();fw.close();}catch (FileNotFoundException e){System.out.println("找不到指定文件");}catch (IOException e){System.out.println("文件复制错误");}}五、处理流
5.1 Buffer缓冲流
缓冲是内存中的一块区域,数据在内存中缓冲,然后Flush()立刻写出,需要在close()将缓冲区内容强行输出,否则可能没有输出去。
如果没有buffer,是读一个写一个,很慢;如果有缓冲区,先放内存里,读完后统一写出去,底层会快很多。
BufferedInputStream
构造函数 BufferedInputStream( InputStream in) 或者 (InputStream in , int size)
不明白这个mark()和reset()是干啥的。。。
public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\number.txt");BufferedInputStream in = new BufferedInputStream(fis);// mark一下in.mark(2);// 输出do re mi fint c = 0;for (int i = 0; i < 10 && (c = in.read() )!= -1; i++){System.out.println((char)c);}// reset 输出do re mi fin.reset();for (int i = 0; i < 10 && (c = in.read() )!= -1; i++){System.out.println((char)c);}// 关闭in.close();fis.close();}catch (FileNotFoundException e){System.out.println("未找到指定文件");}catch (IOException e){System.out.println("读写错误");}}BufferedReader/ BuffreedWriter
bw.write() 配合 bw.newLine() 向文件里写,最后写操作要进行.flush(),才能写进去,不然在缓存里
br.readLine() 读取整行
bw = new BufferedWriter(new FileWriter("文件路径")) 真的像是包在字符流外边的管道
br = new BufferedReader(new FileReader("文件路径"))
最后要.close()
以上,要配合IOException()的catch操作
public static void main(String[] args) {BufferedWriter bw = null;BufferedReader br = null;try {bw = new BufferedWriter(new FileWriter("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\numBufferWriter.txt"));String s = null;for(int i = 0; i < 10; i++){s = String.valueOf(Math.random());bw.write(s);bw.newLine();}// 重要!!如果不flush,是写不到文件里的bw.flush();br = new BufferedReader(new FileReader("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\numBufferWriter.txt"));while ((s = br.readLine()) != null){ // 这里是null来判断System.out.println(s);}// 关闭两个处理流bw.close();br.close();}catch (IOException e){System.out.println("系统错误");}}5.2 转换流
InputStreamReader 和 OutputStreamWriter
如果我们用FileOutputStream流往文件里写东西,是一个字节一个字节的写;外面套上OutputStreamWriter,就是一个字符一个字符的写了。
新建:
OutputStreamWriter osw = new OutputStreamWriter(new一个FileOutputStream对象, "编码格式")
在FileOutputStream中,可以选择是否true, 如果true就不会覆盖原来的,直接接着写
osw.write(内容)
osw.close()
public static void main(String[] args) {try {// 新建OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\numTransfrom1.txt"));// 写入 .write()osw.write("hello transform");//------编码方式 UTF8System.out.println(osw.getEncoding());// 关闭 .close()osw.close();// 指定编码 new OutputStreamWriter(new FileoutputStream("文件路劲", true),编码格式)// 加了true,就在原有的文件下面接着写,否则就覆盖了// 就用上面的osw就行了osw = new OutputStreamWriter(new FileOutputStream("D:\\工作\\编程\\after 2022.11\\KuangShengShuo\\src\\com\\baidu\\File\\numTransfrom2.txt",true),"ISO8859_1");osw.write("hello world again!");System.out.println(osw.getEncoding());osw.close();}catch (IOException e){System.out.println("系统错误");}}
相关文章:
JAVA SE: IO流
一、Java流式输入输出原理Java对于输入输出是以流(Stream)的方式进行的,JDK提供各种各样的“流”类,以获取不同类型的数据。可以理解为将管道插入到文件中,然后从管道获取数据。这个管道外边还可以套管道,外边的管道对数据进行处理…...
打破原来软件开发模式的无代码开发平台
前言传统的系统开发是需要大量的时间和成本的,如今无代码开发平台的出现就改变了这种状况。那么你知道什么是无代码开发平台?无代码开发对企业来说有什么特殊的优势么?什么是无代码平台无代码平台指的是:使用者无需懂代码或手写代码,只需通…...
06-redux中的hook
知识点06-redux的hook 在函数组件中要和redux连接,分为两个步骤 前提状态机已经主备就绪 注入store到根组件 在函数组件中,使用Provider包裹根组件,并将store注入这一步,依旧是不能少的 import store from "./redux/store…...
watch监听不到数组对象的变化
watch监听不到数组对象的变化一、利用索引直接改变arr的值二、修改数组的长度arr.length三、添加和修改对象属性和值Vue不能监听到数组和对象值的变化其实和双向绑定的原理有关。Vue双向绑定原理是利用js中的Object.defineproperty重定义对象的GET和SET方法,而同时这…...
言语理解与表达之语句表达
考点一语句填空提问方式:填入划横线处最恰当的一句是( )1.横线在结尾:总结前文提出对策2.横线在开头:需概括文段的中心内容3.横线在中间:注意与上下文联系把握好主题词,保证文段话题一致实例1和…...
2023年全国最新食品安全管理员精选真题及答案14
百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 131.食品生产企业在一年内()次因违反《中华人民共…...
【MySQL】约束
文章目录1. 约束2. 非空约束 NOT NULL3. 唯一性约束 UNIQUE4. 主键约束 PRIMARY KEY5. 自增约束 AUTO_INCREMENT6. 外键约束FOREIGN KEY7. 默认值约束 DEFAULT8. 小结1. 约束 为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面…...
C语言学习(三)
#include <stdio.h> int main(void){int a; scanf("%d",&a); printf("%d",a); return 0;} 正在上传…重新上传取消正在上传…重新上传取消&符号作用是把键盘中输入的值给变量a,使用scanf()时输入数值,需要按一下enter…...
TOUGH系列软件建模及在地下水、CO2地质封存、水文地球化学、地热等多相多组分系统多过程耦合
TOUGH2系列软件传统地下水模拟软件Feflow和Modflow不同,TOUGH2系列软件采用模块化设计和有限积分差网格剖分方法,通过配合不同EOS模块,软件可以处理各种复杂地质条件下,诸如地热能开发,非饱和带水气运移、油气运移&…...
k8s学习之路 | k8s 工作负载 ReplicaSet
文章目录1. ReplicaSet 基础概念1.1 RS 是什么?1.2 RS 工作原理1.3 什么时候使用 RS1.4 RS 示例1.5 非模板 Pod 的获得1.6 编写 RS1.7 使用 RS1.8 RS 替代方案2. ReplicaSet 与 ReplicationController2.1 关于 RS、RC2.2 两者的选择器区别2.3 总结1. ReplicaSet 基础…...
python实现半色调技术图像转换
半色调技术 半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。 比如说,在一块只能显示纯黑或纯白的屏幕上,如何将一张灰度图显示出灰度的效果,这时就可以用半色调技术实现。 如下…...
c++面试技巧-基础篇
1.面试官:简述C语言的优缺点。 应聘者:C语言的优缺点如下。 • C语言的优点:C语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构…...
三八妇女节即将到来,跨境电商如何玩转节日营销?
随着国际妇女节的到来,跨境电商商家们都开始了为自己的店铺进行节日营销的准备。商家做节日营销的目的都是一样的,无非都是增加曝光率,拉动客流,增加营业额。但是每一个节日营销的形式是可以不一样的。今年有什么营销玩法呢&#…...
【Java学习笔记】10.条件语句 - if...else及switch case 语句
前言 本章介绍Java的条件语句 - if…else和switch case 语句。 Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法如下: if(布尔表达式) {//如果布…...
解析STM32启动过程
相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x…...
微信小程序开发自学笔记 —— 八、小程序基础库的更新迭代
小程序基础库的更新迭代 小程序基础库 小程序的运行环境是分成渲染层和逻辑层的,在渲染层可以用各类组件组建界面的元素,在逻辑层可以用各类API来处理各种逻辑,组件、API其实都是小程序基础库进行包装提供的,基础库的职责还要处…...
Mysql迁移Postgresql
目录原理环境准备操作系统(Centos7)Mysql客户端安装Psql客户端安装数据库用户空字符串处理成null导表脚本dbmysql2pgmysqlcopy测试在mysql中建表导表测试查看pg中的表原理 Mysql抽取:mysql命令重定向到操作系统文件,处理成csv文件; PG装载&a…...
关于信息安全认证CISP、PTE对比分析
CISP 注册信息安全专业人员 CISP-PTE 注册渗透测试工程师(以下简称PTE) 1 、发证机构 CISP与PTE的发证机构都是中国信息安全测评中心,政府背景给认证做背书,学员信息都在中国政府可控的机构手中; 如果想在政府、国…...
游戏场景编辑器和骨骼动画相关软件
游戏场景编辑器 一.Tiled(2D) Tiled 是帮助你开发游戏内容的 2D 地图编辑器。它的主要功能是可以编辑各种形式的瓦片地图,还支持通过用空图片这种强大的方式来标记额外信息给游戏使用。Tiled 关注的是总体灵活性,同时尽量保持直观性。 Tiled Map 不但…...
vue3常用的API
目录 1.ref函数 2.reactive函数 3.reactive对比ref 4.computed函数 5.watch函数 6.toRef 7..provide && inject 1.ref函数 作用: 定义一个响应式的数据 语法: const xxx ref(initValue) 创建一个包含响应式数据的引用对象(reference对象ÿ…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
