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

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)的方式进行的&#xff0c;JDK提供各种各样的“流”类&#xff0c;以获取不同类型的数据。可以理解为将管道插入到文件中&#xff0c;然后从管道获取数据。这个管道外边还可以套管道&#xff0c;外边的管道对数据进行处理…...

打破原来软件开发模式的无代码开发平台

前言传统的系统开发是需要大量的时间和成本的&#xff0c;如今无代码开发平台的出现就改变了这种状况。那么你知道什么是无代码开发平台?无代码开发对企业来说有什么特殊的优势么?什么是无代码平台无代码平台指的是&#xff1a;使用者无需懂代码或手写代码&#xff0c;只需通…...

06-redux中的hook

知识点06-redux的hook 在函数组件中要和redux连接&#xff0c;分为两个步骤 前提状态机已经主备就绪 注入store到根组件 在函数组件中&#xff0c;使用Provider包裹根组件&#xff0c;并将store注入这一步&#xff0c;依旧是不能少的 import store from "./redux/store…...

watch监听不到数组对象的变化

watch监听不到数组对象的变化一、利用索引直接改变arr的值二、修改数组的长度arr.length三、添加和修改对象属性和值Vue不能监听到数组和对象值的变化其实和双向绑定的原理有关。Vue双向绑定原理是利用js中的Object.defineproperty重定义对象的GET和SET方法&#xff0c;而同时这…...

言语理解与表达之语句表达

考点一语句填空提问方式&#xff1a;填入划横线处最恰当的一句是&#xff08; &#xff09;1.横线在结尾&#xff1a;总结前文提出对策2.横线在开头&#xff1a;需概括文段的中心内容3.横线在中间&#xff1a;注意与上下文联系把握好主题词&#xff0c;保证文段话题一致实例1和…...

2023年全国最新食品安全管理员精选真题及答案14

百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 131.食品生产企业在一年内&#xff08;&#xff09;次因违反《中华人民共…...

【MySQL】约束

文章目录1. 约束2. 非空约束 NOT NULL3. 唯一性约束 UNIQUE4. 主键约束 PRIMARY KEY5. 自增约束 AUTO_INCREMENT6. 外键约束FOREIGN KEY7. 默认值约束 DEFAULT8. 小结1. 约束 为了保证数据的完整性&#xff0c;SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面…...

C语言学习(三)

#include <stdio.h> int main(void){int a; scanf("%d",&a); printf("%d",a); return 0&#xff1b;} 正在上传…重新上传取消正在上传…重新上传取消&符号作用是把键盘中输入的值给变量a,使用scanf()时输入数值&#xff0c;需要按一下enter…...

TOUGH系列软件建模及在地下水、CO2地质封存、水文地球化学、地热等多相多组分系统多过程耦合

TOUGH2系列软件传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH2系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同EOS模块&#xff0c;软件可以处理各种复杂地质条件下&#xff0c;诸如地热能开发&#xff0c;非饱和带水气运移、油气运移&…...

k8s学习之路 | k8s 工作负载 ReplicaSet

文章目录1. ReplicaSet 基础概念1.1 RS 是什么&#xff1f;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实现半色调技术图像转换

半色调技术 半色调技术是一种将灰度图像转换为黑白图像的技术。它是通过将灰度图像的像素值映射到黑白像素值上来实现的。 比如说&#xff0c;在一块只能显示纯黑或纯白的屏幕上&#xff0c;如何将一张灰度图显示出灰度的效果&#xff0c;这时就可以用半色调技术实现。 如下…...

c++面试技巧-基础篇

1.面试官&#xff1a;简述C语言的优缺点。 应聘者&#xff1a;C语言的优缺点如下。 • C语言的优点&#xff1a;C语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点&#xff0c;又添加了面向对象编程的支持&#xff0c;具有强大的编程功能&#xff0c;可方便地构…...

三八妇女节即将到来,跨境电商如何玩转节日营销?

随着国际妇女节的到来&#xff0c;跨境电商商家们都开始了为自己的店铺进行节日营销的准备。商家做节日营销的目的都是一样的&#xff0c;无非都是增加曝光率&#xff0c;拉动客流&#xff0c;增加营业额。但是每一个节日营销的形式是可以不一样的。今年有什么营销玩法呢&#…...

【Java学习笔记】10.条件语句 - if...else及switch case 语句

前言 本章介绍Java的条件语句 - if…else和switch case 语句。 Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法如下&#xff1a; if(布尔表达式) {//如果布…...

解析STM32启动过程

相对于ARM上一代的主流ARM7/ARM9内核架构&#xff0c;新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后&#xff0c;CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动&#xff0c;即固定了复位后的起始地址为0x…...

微信小程序开发自学笔记 —— 八、小程序基础库的更新迭代

小程序基础库的更新迭代 小程序基础库 小程序的运行环境是分成渲染层和逻辑层的&#xff0c;在渲染层可以用各类组件组建界面的元素&#xff0c;在逻辑层可以用各类API来处理各种逻辑&#xff0c;组件、API其实都是小程序基础库进行包装提供的&#xff0c;基础库的职责还要处…...

Mysql迁移Postgresql

目录原理环境准备操作系统(Centos7)Mysql客户端安装Psql客户端安装数据库用户空字符串处理成null导表脚本dbmysql2pgmysqlcopy测试在mysql中建表导表测试查看pg中的表原理 Mysql抽取&#xff1a;mysql命令重定向到操作系统文件&#xff0c;处理成csv文件&#xff1b; PG装载&a…...

关于信息安全认证CISP、PTE对比分析

CISP 注册信息安全专业人员 CISP-PTE 注册渗透测试工程师&#xff08;以下简称PTE&#xff09; 1 、发证机构 CISP与PTE的发证机构都是中国信息安全测评中心&#xff0c;政府背景给认证做背书&#xff0c;学员信息都在中国政府可控的机构手中&#xff1b; 如果想在政府、国…...

游戏场景编辑器和骨骼动画相关软件

游戏场景编辑器 一.Tiled(2D) Tiled 是帮助你开发游戏内容的 2D 地图编辑器。它的主要功能是可以编辑各种形式的瓦片地图&#xff0c;还支持通过用空图片这种强大的方式来标记额外信息给游戏使用。Tiled 关注的是总体灵活性&#xff0c;同时尽量保持直观性。 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) 创建一个包含响应式数据的引用对象&#xff08;reference对象&#xff…...

Python AI用例生成效率实战手册(企业级自动化工作流全拆解)

第一章&#xff1a;Python AI用例生成效率的核心价值与企业级定位在AI工程化落地加速的当下&#xff0c;Python凭借其丰富的生态&#xff08;如LangChain、LlamaIndex、transformers、scikit-learn&#xff09;和低门槛的可编程性&#xff0c;已成为企业构建AI用例生成流水线的…...

取水泵站远程监控物联网系统方案

某取水泵站具备河流/水库双水源取水设计&#xff0c;配置调节池实现水量缓冲&#xff0c;同时包括取水泵、电动蝶阀、潜污泵、送/排风机、原水水质检测仪等设备&#xff0c;实现对泵站设备工况的全面监控与智能控制&#xff0c;保障各个子水厂的供水安全与稳定。通过将现场PLC控…...

【Python工业视觉部署黄金法则】:20年实战总结的5大避坑指南与实时推理加速秘籍

第一章&#xff1a;Python工业视觉部署的工程化本质与挑战全景工业视觉系统在产线落地时&#xff0c;远非“模型训练完成 → 用OpenCV加载推理”这般线性。其核心矛盾在于&#xff1a;算法原型追求精度与泛化&#xff0c;而工程部署必须兼顾实时性、鲁棒性、可维护性与硬件约束…...

OpenClaw配置文件详解:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF性能调优全参数解析

OpenClaw配置文件详解&#xff1a;Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF性能调优全参数解析 1. 为什么需要手动调优OpenClaw配置 第一次看到OpenClaw的配置文件时&#xff0c;我和大多数开发者一样&#xff0c;直接选择了默认的QuickStart模式。直到某个深夜…...

使用LaTeX自动生成伏羲模型气象分析报告

使用LaTeX自动生成伏羲模型气象分析报告 每次跑完伏羲模型&#xff0c;看着那一大堆NetCDF或GRIB格式的预报数据&#xff0c;你是不是也头疼过&#xff1f;数据有了&#xff0c;漂亮的图也画好了&#xff0c;但要把它们整理成一份格式规范、图表清晰、文字描述专业的正式报告&…...

解决MathType在Word中加载失败的终极指南:从运行时错误53到MathPage.WLL缺失

1. 遇到MathType加载失败时先别慌 最近有不少朋友在系统升级后遇到了MathType无法正常加载的问题。作为一个经常和公式打交道的科研狗&#xff0c;我完全理解这种崩溃感——论文deadline近在眼前&#xff0c;公式编辑器却罢工了。最常见的两种报错是&#xff1a;"Please r…...

深度解析:SillyTavern如何通过五大革新打造终极AI对话体验?

深度解析&#xff1a;SillyTavern如何通过五大革新打造终极AI对话体验&#xff1f; 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 你是否曾想过&#xff0c;一个AI对话前端能如何超越简单…...

如何选择性价比高的宁波小程序开发服务公司?

在选择宁波小程序开发服务公司的过程中&#xff0c;内容概要的作用不可忽视。首先&#xff0c;应该明确找到一家能够提供专业服务的公司&#xff0c;同时懂得满足特定行业需求。此类公司通常拥有多样化的项目经验&#xff0c;可以展现出他们在不同领域的实际操作能力。有时候&a…...

Chatbot、Composer与Agent架构深度解析:如何选择最优对话系统方案

Chatbot、Composer与Agent架构深度解析&#xff1a;如何选择最优对话系统方案 想象一下&#xff0c;你正在为一个电商平台设计智能客服。老板要求&#xff1a;既要能秒回“我的订单到哪了”这种简单问题&#xff0c;又要能处理“帮我推荐几款适合周末露营的装备&#xff0c;预…...

俄罗斯莫斯科电子烟展:跟团公司高性价比选择策略拆解

对于想开拓俄罗斯市场的电子烟企业来说&#xff0c;俄罗斯莫斯科电子烟展是不可错过的出海窗口&#xff0c;但行业信息杂乱、代理鱼龙混杂的现状&#xff0c;让很多企业陷入“选便宜还是选靠谱”的两难。选对跟团公司&#xff0c;不仅能节省成本&#xff0c;更能直接决定参展效…...