Java(IO流)

IO流

  • 用于读写文件中的数据(可以读写文件或网络中的数据)
  • I:input
  • O:output

1.IO流的分类

1 流的方向

  • 输入流(读取:程序 -> 文件)
  • 输出流(写出:文件 -> 程序)

2操作文件类型

  • 字节流(所有类型的文件)
  • 字符流(纯文本文件)

纯文本文件:Windows系统自带的记事本可打开并读懂的文件;txt、md、xml、lrc文件等

一、普通流

1、FileOutputStream

  • 操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
  • 书写步骤

1、创建字符流对像

  • 细节1:参数是字符串表示的路径或者File对象都是可以的
  • 细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
  • 细节3:如果文件已经存在,则会清空文件

2、写数据

  • 细节: write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

3、释放资源

  • 细节:每次使用完流之后都要释放资源
  •  FileOutputStream写数据的三种方式

 

 


2、FileIntputStream

  • 操作本地文件的字节输出流,可以把本地文件中的数据写到程序中
  • 书写步骤

1、创建字节输入流对象

  • 细节1:如果文件不存在,就直接报错

2、读取数据

  • 细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字
  • 细节2:读到文件末尾了,read方法返回-1

3、 释放资源

  • 细节1:每次使用完流必须要释放资源

 

  •  FileIntputStream的循环读取
package org.example;
import java.io.FileInputStream;
import java.io.IOException;public class Outer {public static void main(String[] args) throws IOException {FileInputStream fi = new FileInputStream("a.txt");int b;while((b = fi.read()) != -1){System.out.println((char)b);}fi.close();}
}

 

  •  FileIntputStream一次读取多个字节

注:一次读一个字节数组的数据,每次读取会尽可能把数组装满

 


 3、FileWriter

  • 构造方法

  • 成员方法

  •  书写细节

 1、创建字符输出流对象

  • 细节1:参数是字符串表示的路径或者File对象都是可以的
  • 细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
  • 细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

2、写数据

  • 细节: 如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

3、释放资源

  • 细节:每次使用完流之后都要释放资源
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class WriteFileExample {public static void main(String[] args) {String content = "这是要写入文件的内容";try (Writer writer = new FileWriter("example.txt")) {writer.write(content);} catch (IOException e) {e.printStackTrace();}}

 

 


二、缓冲流

1、字节缓冲流

  • 底层远离:建缓冲区(长度为8192的字节数组)
  • 方法名称

package org.example;
import java.io.*;public class Outer {public static void main(String[] args) throws IOException {//1.创建缓冲流的对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));//2.循环读取并写到目的地int b;while ((b = bis.read()) != -1) {bos.write(b);//3.释放资源bos.close();bis.close();}}
}

2.字符缓冲流

  •  原理解析

1、创建字符输入流对象

  • 底层:关联文件,并创建缓冲区(长度为8192的字节数组)

2、读取数据

  • 底层:1.判断缓冲区中是否有数据可以读取
  • 2.缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区,如果文件中也没有数据了,返回-1
  • 3.缓冲区有数据:就从缓冲区中读取。


空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中

  • 构造方法

 

  • 字符缓冲流的特有方法 

 

package org.example;
import java.io.*;public class Outer {public static void main(String[] args) throws IOException {//1.创建字符缓冲输入流的对象BufferedReader br = new BufferedReader(new FileReader("a.txt"));//2.读取数据//细节://readLine方法在读取的时候,一次读一整行,遇到回车换行结束//但是他不会把回车换行读到内存当中String line1 = br.readLine();System.out.println(line1);String line2 = br.readLine();System.out.println(line2);//3.释放资源br.close();}
}

循环获取:

 

 

三、 转换流(字符流和字节流之间的桥梁)

  • 字符转换输入流:InputStreamReader
  • 字符转换输出流:0utputStreamWriter
  • 作用:
  1. 指定字符集读写数据(JDK11之后已淘汰)
  2. 字节流想要使用字符流中的方法了
package org.example;
import java.io.*;public class Outer {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("a.txt");InputStreamReader isr =new InputStreamReader(fis);BufferedReader br = new BufferedReader(isr);String str = br.readLine();System.out.println(str);br.close();}
}

 


四、序列化/对象操作输出流

  • 可以把Java的对象写到本地文件中

 

package org.example;
import java.io.*;public class Outer {public static void main(String[] args) throws IOException {//1.创建对象Student stu = new Student("zhangsan", 23);//2.创建序列化流的对象/对象操作输出流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));//3.写出数据oos.writeObject(stu);//4.释放资源oos.close();}
}

反序列化/对象操作输入流

  • 可以把序列化到本地文件中的对象,读取到程序中来

 

 

序列化流/反序列化流的细节汇总

  • ① 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常
  • ②序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
  • 序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?会出问题,会抛出InvalidclassException异常;解决方案:给lavabean类添加serialVersionUID(列号、版本号)
  • 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?解决方案:给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程 

 


五、打印流

  • 分类:打印流一般是指:PrintStream,PrintWriter两个类
  • 特点1:打印流只操作文件目的地,不操作数据源
  • 特点2:特有的写出方法可以实现,数据原样写出

例如:

打印:97   文件中:97

打印:true  文件中:true

  •  特点3:特有的写出方法,可以实现自动刷新,自动换行(打印一次数据 =写出+换行+刷新) 

 1、字节打印流

字节流低层没有缓冲区,开不开自动刷新都一样 

package cn.test;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;public class PrintStreamtDemo1 {public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {PrintStream ps = new PrintStream(new FileOutputStream("a.txt"),true,Charset.forName("UTF-8").name());ps.println(97);ps.print(true);ps.printf("%s吃%s","小明","范");ps.close();}
}

 

2、字符打印流

 字符流低层有缓冲区,需要自动刷新可开启 

 打印流有几种?各有什么特点?

  • 有字节打印流和字符打印流两种
  • 打印流不操作数据源,只能操作目的地
  • 字节打印流:默认自动刷新,特有的println自动换行
  • 字符打印流:自动刷新需要开启,特有的println自动换行 

 


六、解压缩流/压缩流 

1、解压缩流

 

2、压缩流

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hello 算法10:搜索

https://www.hello-algo.com/chapter_searching/binary_search/ 二分查找法 给定一个长度为 n的数组 nums ,元素按从小到大的顺序排列,数组不包含重复元素。请查找并返回元素 target 在该数组中的索引。若数组不包含该元素,则返回 -1 。 # 首…

海外博士后政策,这些重点你不能错过!

​ ​海外高层次人才博士后专项申报政策是针对具有较高学术造诣和研究潜力的海外学者、研究人员,旨在吸引他们回国从事科研工作,推动国内科技创新发展。该政策不仅为海外人才提供了良好的职业发展平台,还为他们提供了丰富的科研资源和优厚…

20240408在线给加密的PDF文件解密【打印限制】

20240408在线给加密的PDF文件解密 百度:PDF解密 https://smallpdf.com/cn/unlock-pdf PDF解密 未选择任何文件 或拖放PDF至此处 无文件大小限制,无广告水印 - 这款易于使用且免费的在线密码移除工具可为您移除恼人的PDF密码。 无需注册 数秒内解锁 PDF …

【GitHub技术全面解析及游戏开发者的应用】

GitHub技术全面解析及游戏开发者的应用 GitHub作为全球最大的开源代码托管平台,不仅为软件开发者提供了一个强大的工具,也为游戏开发者带来了前所未有的便利。在游戏开发领域,GitHub的技术可以帮助开发者更高效地管理代码、协作开发、分享资…

python基础语法--输入和输出

一、 输入 input() python使用input输入变量,input输入的变量为字符串形式,可以通过其他方式转换为整型或其他类型。 (1)单行读入已知个数的字符串或数字 读入字符串 # 单行读入字符串a,并给出一句输入提示 a input("请…

【随笔】Git 高级篇 -- 提交的技巧(下) cherry-pick commit --amend(十九)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

pose_iter_116000.caffemodel 下载地址(github)

没有百度云会员,github上几秒就下完了 face:pose_iter_116000.caffemodelhttps://github.com/ihp-lab/OpenSense/blob/fefe13ccf250e4811f4f61edf0b212e4ded78d19/Interoperations/OpenPose.PInvoke/OpenPoseLib/models/face/pose_iter_116000.caffemode…

搭建网站的步骤

搭建网站的步骤 我们选择了白嫖雨云的二级域名 浏览器输入https://www.rainyun.com/z22_ 创建账号然后选择一个你喜欢的子域名我建议后缀选择ates.top的 选择自定义地址,类型选择cname 现在要选择记录值了,有a,aa,txt等 根据实际…

加速度JUSDO | 电子元器件商城行业调研及运营方案

一、行业背景与竞品分析 随着电子元器件行业的快速发展,线上元器件商城已成为行业交易的重要渠道。目前市场上存在多个知名的元器件商城,如立创、云汉芯城、贸泽商城等,它们都提供了丰富的元器件产品和便捷的线上交易服务。 立创商城&#x…

1200/天,长期兼职贵么?

今天收到一个客户询盘,问公司长期招聘一个兼职程序员,包月的这种。问我多少钱一个月,在这种需求未明确的情况下,单纯的问价格其实意义不大的,只要报价不在客户心理预期范围内基本没戏的。 关于定价 关于程序员价格的定…

MySQL-----索引

一 概述 索引(index)是帮助MysQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构, 这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法&…

Excel 记录单 快速录入数据

一. 调出记录单 ⏹记录单功能默认是隐藏的,通过如下如图所示的方式,将记录单功能显示出来。 二. 录入数据 ⏹先在表格中录入一行数据,给记录单一个参考 ⏹将光标至于表格右上角,然后点击记录单按钮,调出记录单 然后点…

[目标检测] OCR: 文字检测、文字识别、text spotter

概述 OCR技术存在两个步骤:文字检测和文字识别,而end-to-end完成这两个步骤的方法就是text spotter。 文字检测数据集摘要 daaset语言体量特色MTWI中英文20k源于网络图像,主要由合成图像,产品描述,网络广告(淘宝)MS…

Kali系统开启SSH服务结合内网穿透工具实现无公网IP远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 本文主要介绍如何在Kali系统编辑SSH配置文件并结合cpolar内网穿透软件,实现公网环境ssh远程连接本地kali系统。 1. 启…

Java特性之设计模式【外观模式】

一、外观模式 概述 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性 这种模式涉及到一…

漏洞挖掘 SSRF 一次很菜的SSRF低危小通杀

前言 一转眼貌似很长时间都没更新博客了,甚至连标题的大小和格式都有点忘了,今后应该尽量保持每周更新一次,主要是平常上课太忙了,在学校还总是不定时会刷新一些烂事,就耽误了很多时间。这篇文章用于记载我最近的一次…

PixArt-β:Fast and controllable image generation with latent consistency models

PixArt α to Σ: All about Efficient Diffusion Models - 知乎前言自年初Sora和Stable Diffusion 3推出以来,笔者就开始关注基于Diffusion Transformer的工作。在我的往期文章《 Diffusion Transformer Family:关于Sora和Stable Diffusion 3你需要知道…

原子操作和竞争条件

所有系统调用都是以原子操作方式执行的。之所以这么说,是指内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断。原子性是某些操作得以圆满成功的关键所在。特别是它规避了竞争状态(race condi…

arm内核驱动-中断

先介绍个东西 ctags 这个工具可以像keil一样在工程里查找跳转,帮我们找到我们想要的东西。 安装教程可以找到,这里只讲怎么用。 在工程目录(包含所有你会用到的头文件等)下,先加载这个命令,可能要等待…

repl_backlog原理

2.2.3.repl_backlog原理 master怎么知道slave与自己的数据差异在哪里呢? 这就要说到全量同步时的repl_baklog文件了。 这个文件是一个固定大小的数组,只不过数组是环形,也就是说角标到达数组末尾后,会再次从0开始读写,这样数组…