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

IO流概述

🏡个人主页 :@ 守夜人st
🚀系列专栏:Java
…持续更新中敬请关注…
🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点

目录

  • IO流概述
    • IO 流的分类
      • 总结流的四大类
    • 字节流的使用
      • 文件字节输入流:FileInputStream
      • 文件字节输出流:FileOutputStream
      • 流的关闭与刷新
      • 文件拷贝
    • 资源释放
      • try-catch-finally
      • try-with-resource
    • 字符流的使用
      • 文件字符输入流(FileReader)
        • 一次读取一个字符
        • 一次读取一个字符数组
      • 文件字符输出流(FileWriter)
        • 流的关闭与刷新
    • 总结:

IO流概述

IO流也称为输入、输出流,用于数据的读写。

  • I 表示input,是数据从硬盘文件读入到内存的过程,称之为输入,负责读。
  • O 表示output,是内存程序的数据从内存写入到硬盘文件的过程,称之输出,负责写。

IO 流的分类

按流的方向分:输入流、输出流

按流中的数据最小单位分:字节流、字符流

总结流的四大类

  • 字节输入流(InputStream):以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流成为字节输入流
  • 字节输出流(OutputStream):以内存为基准,把内存中的数据以字节写入到磁盘文件或者网络中去的流称为字节输出流
  • 字符输入流(Reader):以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流
  • 字符输出流(Writer):以内存为基准,把内存中的数据以字符写入到磁盘文件或网络介质中去的流称为字符输出流

字节流的使用

文件字节输入流:FileInputStream

作用:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去

构造器说明
public FileInputStream(File file)创建字节输入流管道与源文件对象接通
public FileInputStream (String pathname)创建字节输入流管道与源文件对象接通
方法名称说明
public int read()每次读取一个字节返回,如果字节已经没有可读的返回 -1
public int read(byte[] buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回 -1

每次读取一个字节

package com.shouyeren.oop.api.byte_stream;import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamDemo1 {public static void main(String[] args) throws Exception {//创建一个文件字节输入流管道与源文件连通InputStream fileInputStream = new FileInputStream("src/data.txt");//每读取一个字节返回/*int b1 = fileInputStream.read();System.out.println((char) b1);int b2 = fileInputStream.read();System.out.println((char) b2);int b3 = fileInputStream.read();System.out.println((char) b3);*///使用循环改进//无法避免中文读取乱码int b;while ((b = fileInputStream.read()) != -1){System.out.print((char) b);}}
}

每次读取一个字节数组

package com.shouyeren.oop.api.byte_stream;import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamDemo2 {public static void main(String[] args) throws Exception {//创建一个文件字节输入流管道与源文件连通InputStream fileInputStream = new FileInputStream("src/data.txt");//定义一个字符数组byte[] buffer = new byte[3];int len;while ((len = fileInputStream.read(buffer)) != -1){System.out.print(new String(buffer,0,len));}}
}

一次读取全部字节

  • 定义一个与文件一样的字节数组,一次性读取完全部的字节
  • 如果文件过大,字节数组可能引起内存溢出
package com.shouyeren.oop.api.byte_stream;import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamDemo3 {public static void main(String[] args) throws Exception {//创建一个文件字节输入流管道与源文件连通InputStream fileInputStream = new FileInputStream("src/data.txt");//readAllBytes()是jdk9才出现的方法byte[] buffer = fileInputStream.readAllBytes();System.out.println(new String(buffer));}
}

文件字节输出流:FileOutputStream

方法名称说明
public vido write(int a)写一个字节
public void write(byte[] buffer)写一个字节数组
public void write(byte[] buffer,int pos,int len)写一个字节数组的一部分

流的关闭与刷新

方法说明
flush()刷新流,还可以继续写数据
close()关闭流,释放资源,但是在关闭前会先刷新流,一旦关闭就不能在写数据
package com.shouyeren.oop.api.byte_stream;import java.io.FileOutputStream;
import java.io.OutputStream;/*public FileOutputStream(File file,boolean append):创建一个追加数据的输出流管道流向目标文件对象
public FileOutputStream(String file,boolean append):创建一个追加数据的输出流管道流向目标文件路径*/
public class OutputStreamDemo01 {public static void main(String[] args) throws Exception {//清空原来的数据,写入新数据OutputStream os = new FileOutputStream("src/outputTest.txt");//写入一个字节os.write('a');//aos.write(98);//bos.write("\r\n".getBytes());//换行//中文写入乱码 UTF-8中一个中文字符占三个字节//os.write('男');//7//写入一个字节数组byte[] buffer = {'a',97,98,99};os.write(buffer);os.write("\r\n".getBytes());//写入中文byte[] buffer1 = "你好Java".getBytes();os.write(buffer1);os.write("\r\n".getBytes());/*//刷新流os.flush();*///关闭流 关闭之前先刷新os.close();}
}

文件拷贝

package com.shouyeren.oop.api.byte_stream;import java.io.*;/*** 目标:实现文件的拷贝(支持一切文件类型)*/
public class CopyDemo01 {public static void main(String[] args) {try {//1.创建一个字节输入流管道与源文件接通InputStream in = new FileInputStream("C:\\Users\\shouyeren\\Desktop\\20221227_114837.m4a");//2.创建一个字节输出流管道与源文件接通OutputStream out = new FileOutputStream("src/new.m4a");//3.定义一个字节数组转移数据byte[] buffer = new byte[1024];int len; //记录每次读取的字节数while ((len = in.read(buffer)) != -1){out.write(buffer,0,len);}System.out.println("文件拷贝完成!");//4.关闭流out.close();in.close();} catch (Exception e) {e.printStackTrace();}}
}

任何文件的底层都是字节,拷贝是一字不漏的转移字节,只要前后文件格式,编码一致没有任何问题。

资源释放

try-catch-finally

  • finally:在异常处理时提供finally块来执行所有清除操作,比如IO流的释放资源

  • 特点:被finally控制的语句最终一定会执行,除非JVM退出

  • 异常处理格式:try…catch…finally

    try{FileOutputStream fos = new FileOutputStream("a.txt");fos.write(97);}catch(IOExceptiopn e){e.printStackTrace();
    }finally{fos.close();
    }
    

try-with-resource

finally虽然可以释放资源,但是释放资源的代码过去繁琐

InputStream is = null;
OutputStream os = null;
try{
...
}catch(Exception e){e.printStackTrace();
}finally{try{if(os != null) os.close();}catch(Exception e){e,printStackTrace();}try{if(is != null) is.close();}catch(Exception e){e.printStackTrace();}
}

JDK7改进方案

try(定义流对象){可能出现异常的代码
}catch(异常类名 变量名){异常的处理代码
}

JDK9改进方案

定义输入流对象;
定义输出流对象;
try(输入流对象;输出流对象){可能出现异常的代码块;
}catch(异常类名 变量名){异常的处理代码
}  

字符流的使用

文件字符输入流(FileReader)

作用:以内存为基准,把磁盘中的数据以字符的形式读取到内存中去

构造器说明
public FileReader(File file)创建字符输入流管道与源文件对象接通
public FileReader(String pathname)创建字符输入流管道与源文件路径接通
方法名称说明
public int read()每次读取一个字符返回,如果字符已经没有可读的返回 -1
public int read(char[] buffer)每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回 -1

一次读取一个字符

字符流的好处,每次读取一个字符存在什么问题?

  • 读取中文字符不会出现乱码(代码和文件编码一致)
  • 性能较慢

一次读取一个字符数组

每次读取一个字符数组的优势:读取的性能得到了提升

文件字符输出流(FileWriter)

构造器说明
public FileWriter(File file)创建字符输出流管道与源文件对象接通
public FileWriter(File file,boolean append)创建字符输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath)创建字符输出流管道与源文件路径接通
public FileWriter(String filepath,boolean append)创建字符输出流管道与源文件路径接通,可追加数据
方法名称说明
void write(int c)写一个字符
void write(char[] cbuf)写入一个字符数组
void write(char[] cbuf,int off,int len)写入字符数组的一部分
void write(String str)写一个字符串
void write(String str,int off,int len)写一个字符串的一部分

流的关闭与刷新

与字节流类似,需要关流!!!

总结:

字节流与字符流如何选择使用?

  • 字节流适合做一切文件数据的拷贝
  • 字节流不适合读取中文内容输出
  • 字符流适合做文本文件的操作

在这里插入图片描述

感觉不错的话,动手点个赞吧!

相关文章:

IO流概述

🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录IO流概述IO 流的分类总结流的四大类字…...

【node.js】node.js的安装和配置

文章目录前言下载和安装Path环境变量测试推荐插件总结前言 Node.js是一个在服务器端可以解析和执行JavaScript代码的运行环境,也可以说是一个运行时平台,仍然使用JavaScript作为开发语言,但是提供了一些功能性的API。 下载和安装 Node.js的官…...

Python优化算法—遗传算法

Python优化算法—遗传算法一、前言二、安装三、遗传算法3.1 自定义函数3.2 遗传算法进行整数规划3.3 遗传算法用于旅行商问题3.4 使用遗传算法进行曲线拟合一、前言 优化算法,尤其是启发式的仿生智能算法在最近很火,它适用于解决管理学,运筹…...

数据埋点(Data buried point)的应用价值剖析

一、什么是数据埋点?数据埋点指在应用中特定的流程中收集一些信息,用来跟踪应用使用的状况,后续用来进一步优化产品或是提供运营的数据支撑。比如访问数(Visits),访客数(Visitor),停…...

一文弄懂硬链接、软链接、复制的区别

复制 命令:cp file1 file2 作用:实现对file1的一个拷贝。 限制:可以跨分区,文件夹有效。 效果:修改file1,对file2无影响;修改file2,对file1无影响。删除file1,对file…...

界面组件Telerik ThemeBuilder R1 2023开创应用主题研发新方式!

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET包含一个完…...

在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录

在FederatedScope 如何查看client/server之间的传递的参数大小(通讯量)? 对源码的探索记录 背景需求 想给自己的论文补一个通讯开销对比实验:需要计算出client和server之间传递的信息(例如,模型权重、embedding)总共…...

2023爱分析 · 数据科学与机器学习平台厂商全景报告 | 爱分析报告

报告编委 黄勇 爱分析合伙人&首席分析师 孟晨静 爱分析分析师 目录 1. 研究范围定义 2. 厂商全景地图 3. 市场分析与厂商评估 4. 入选厂商列表 1. 研究范围定义 研究范围 经济新常态下,如何对海量数据进行分析挖掘以支撑敏捷决策、适应市场的快…...

20230215_数据库过程_高质量发展

高质量发展 —一、运营结果 SQL_STRING:‘delete shzc.np_rec_lnpdb a where exists (select * from tbcs.v_np_rec_lnpdbbcv t where a.telnumt.telnum and a.outcarriert.OUTCARRIER and a.incarriert.INCARRIER and a.owncarriert.OWNCARRIER and a.starttimet.STARTTIME …...

【百度 JavaScript API v3.0】LocalSearch 位置检索、Autocomplete 结果提示

地名检索移动到指定坐标 需求 在输入框中搜索,在下拉列表中浮动,右侧出现高亮的列表集。选中之后移动到指定坐标。 技术点 官网地址: JavaScript API - 快速入门 | 百度地图API SDK 开发文档:百度地图JSAPI 3.0类参考 实现 …...

运用Facebook投放,如何制定有效的竞价策略?

广告投放中,我们经常会遇到一个问题,就是不知道什么样的广告适合自己的业务。其实,最简单的方法就是根据我们业务本身进行定位并进行投放。当你了解了广告主所处行业及目标受众后,接下来会针对目标市场进行搜索和定位(…...

大数据框架之Hadoop:HDFS(五)NameNode和SecondaryNameNode(面试开发重点)

5.1NN和2NN工作机制 5.1.1思考:NameNode中的元数据是存储在哪里的? 首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此&am…...

计算机网络 - 1. 体系结构

目录概念、功能、组成、分类概念功能组成分类分层结构概念总结OSI 七层模型应用层表示层会话层传输层网络层数据链路层物理层TCP/IP 四层模型OSI 与 TCP/IP 相同点OSI 与 TCP/IP 不同点为什么 TCP/IP 去除了表示层和会话层五层参考模型概念、功能、组成、分类 概念 &#x1f…...

银行业上云进行时,OLAP 云服务如何解决传统数仓之痛?

本文节选自《中国金融科技发展概览:创新与应用前沿》,从某国有大行构建大数据云平台的实践出发,解读了 OLAP 云服务如何助力银行实现技术平台化、组件化和云服务化,降低技术应用门槛,赋能业务创新。此外,本…...

特定领域知识图谱融合方案:文本匹配算法之预训练Simbert、ERNIE-Gram单塔模型等诸多模型【三】

特定领域知识图谱融合方案:文本匹配算法之预训练模型SimBert、ERNIE-Gram 文本匹配任务在自然语言处理中是非常重要的基础任务之一,一般研究两段文本之间的关系。有很多应用场景;如信息检索、问答系统、智能对话、文本鉴别、智能推荐、文本数据去重、文本相似度计算、自然语…...

【2023最新教程】从0到1开发自动化测试框架(0基础也能看懂)

一、序言 随着项目版本的快速迭代、APP测试有以下几个特点: 首先,功能点多且细,测试工作量大,容易遗漏;其次,代码模块常改动,回归测试很频繁,测试重复低效;最后&#x…...

linux备份命令小记 —— 筑梦之路

Linux dump命令用于备份文件系统。 dump为备份工具程序,可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。 dump命令只可以备份ext2/3/4格式的文件系统, centos7默认未安装dump命令,可以使用yum install -y dump安…...

vue项目(vue-cli)配置环境变量和打包时区分开发、测试、生产环境

1.打包时区分不同环境在自定义配置Vue-cli 的过程中,想分别通过.env.development .env.test .env.production 来代表开发、测试、生产环境。NODE_ENVdevelopment NODE_ENVtest NODE_ENVproduction本来想使用上面三种配置来区分三个环境,但是发现使用test…...

Python 命名规范

Python 命名规范 基本规范 类型公有内部备注Packagepackage_namenone全小写下划线式驼峰Modulemodule_name_module_name全小写下划线式驼峰ClassClassName_ClassName首字母大写式驼峰Methodmethod_nameprotected: _method_name private: __method_name全小写下划线式驼峰Exce…...

操作系统——2.操作系统的特征

这篇文章,我们来讲一讲操作系统的特征 目录 1.概述 2.并发 2.1并发概念 2.1.1操作系统的并发性 3.共享 3.1共享的概念 3.2共享的方式 4.并发和共享的关系 5.虚拟 5.1虚拟的概念 5.2虚拟小结 6.异步 6.1异步概念 7.小结 1.概述 上一篇文章,我们…...

【计算机网络期末复习】第六章 应用层

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为想复习学校计算机网络课程的同学提供重点大纲,帮助大家渡过期末考~ 📚专栏地址:https://blog.csdn.net/Newin2020/arti…...

TypeScript基本教程

TS是JS的超集,所以JS基础的类型都包含在内 起步安装 npm install typescript -g运行tsc 文件名 基础类型 Boolean、Number、String、null、undefined 以及 ES6 的 Symbol 和 ES10 的 BigInt。 1 字符串类型 字符串是使用string定义的 let a: string 123 //普…...

使用Windows API实现本地音频采集

Windows API提供了Winmm(Windows多媒体)库,其中包括了音频设备相关的函数,可以用来实现音频设备的枚举和测试。 下面是一个简单的示例代码,演示了如何使用Winmm库中的waveInGetNumDevs()函数来枚举计算机上的音频输入…...

实用的费曼学习法 | 一些思考

文章目录 一、前言二、费曼学习法CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 大数据与人工智能背景下,最重要的是:捕捉机会和快速学习的能力 一、前言 费曼学习法是美国著名的物理学家,理查德 ∙ \bullet ∙ 费曼总结出来的学习方法。 这个方法的核心是:当你学习了…...

Linux安装Docker配置docker-compose 编排工具【超详细】

一、介绍Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有…...

iTerm2 + Oh My Zsh 打造舒适终端体验

最终效果图: 因为powerline以及homebrew均需要安装command line tool,网络条件优越的同学在执行本文下面内容之前,可以先安装XCode并打开运行一次(会初始化安装components),省去以后在iterm2中的等待时间。…...

【scipy.sparse】diags()和dia_matrix()的区别

【scipy.sparse】diags()和dia_matrix()的区别 文章目录【scipy.sparse】diags()和dia_matrix()的区别1. 介绍2. 代码示例2.1 sp.diags()2.1.1 第一种用法(dataoffsets)2.1.2 广播(需要指定shape)2.1.3 只有一条对角线2.2 sp.dia_…...

java ssm自行车在线租赁系统idea

当前自行车在社会上广泛使用,但自行车的短距离仍旧不能完全满足广大用户的需求。自行车在线租赁系统可以为用户提供租赁用车等功能,拥有较好的用户体验.能实时在线租赁提供更加快捷方便的租车方式,解决了常见自行车在线租赁系统较为局限的自行车归还功能。 通过使用本系统&…...

GAN和CycleGAN

文章目录1. GAN 《Generative Adversarial Nets》1.1 相关概念1.2 公式理解1.3 图片理解1.4 熵、交叉熵、KL散度、JS散度1.5 其他相关(正在补充!)2. Cycle GAN 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Ne…...

源码项目中常见设计模式及实现

原文https://mp.weixin.qq.com/s/K8yesHkTCerRhS0HfB0LeA 单例模式 单例模式是指一个类在一个进程中只有一个实例对象(但也不一定,比如Spring中的Bean的单例是指在一个容器中是单例的) 单例模式创建分为饿汉式和懒汉式,总共大概…...

深圳网站建设科技有限公司/免费引流微信推广

点击 工具栏 左上角点击 (苹果Logo)标志,关于本机 --> 系统报告 -->(左侧栏中)软件 -->偏好设置面板 -->安全性与隐私性 -->是否64位:是...

泰安企业建站公司/软文写作网站

源码分析 前两天小编去面试了,被问到一个非常基础的问题,与equals的区别,可小编只是回答了一部分,一个比较基本数据类型,一个是比较引用数据类型,其他的就给忘了,回家之后,小编就百度…...

镇江市住房城乡建设局网站/乐天seo视频教程

在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来。不过呢,闲暇…...

wordpress建站视频教程下载/网络推广方案设计

在网上很难找相关的资料,我自己实现了一种,但是其中的一些偏移量与标准中的不一致。个别偏移量是根据我自己的三星手机拍的照片得到的。目前测试我自己的手机拍的照片得到的结果是正确的,现在把代码贴在这里,希望大家能够提出其中…...

北京市住房城乡建设厅网站/网站排名优化师

根据返回的错误代码判断3.1 错误代码:450 4.7.1 Client host rejected: cannot find your hostname错误原因:对方服务器未设置反向解析处理方式:请联络IDC进行处理。可参考中国互联网协会反垃圾中心提供的设置方式:http://www.an…...

东昌网站建设/数据分析师培训机构

随着 Unity 4.6 发布,新 UI 系统终于与大家见面了。 RectTransform Unity UI 系统使用 RectTransform 实现基本的布局和层次控制。RectTransform 继承于 Transform,所以 Transform 的所有特征 RectTransform 同样拥有。在 Transform 基础上,R…...