IO流

流的分类

  • 按操作数据不同,分为字节流和字符流。
  • 按数据流的流向分为输出流和输入流。
  • 按流的角色分为节点流和包装流。

抽象基类 字节流 字符流 输入流 InputStreanm Reader 输出流 OutputStreanm Writer

Java中跟io有关的类非常多,但是类的命名非常规则,所有的派生子类都是以上述四个基类作为后缀名来命名的。

文件流

FileInputStream 用于从文件中按字节读取,一般针对视频,音频,图像等文件进行读取,使用read()方法,返回类型是int,如果读到文件末尾则放回-1。

read() //读取一个字节数据
read(Byte b[]) //最多读取b.length个字节数据
read(Byte b[], int off, int len) //最多读取len个字节数据到数组的off偏移位置

有时我们按照字节读取数据输出到控制台, 当最后一次读取时,字节数组不会被全部覆盖,如果这时候直接用字节数组初始化一个字符串输出,那么 输出的内容会和期望的不一致,所以采用读取多长就输出多长的方式。

while((readLen = stream.read(data)) != -1) {
    System.out.print(new String(data, 0, readlen));
}

write()方法和前面的read()参数一致,同时也要注意一个问题,按照读取的长度来向文件写入数据。字符串转字节数组使用getBytes()方法

注意:当完成数据的读写时,一定要关闭流,释放资源

FileReaderInputStramReader(转换流) 的子类用于按字符读取文件内容,一般用于文本文件的处理。同样也使用read()方法读取。FileReader内没有read()方法,而是在父类中定义的。

read();//读取一个字符
read(char[] cbuf);//读取cbuf.length长度的字符
readn(char[] cbuf, int offset, int length)//从offset偏移的位置开始读取最多length长度的字符到数组中

可以将字符数组转为字符串类型

new String(char[]);
new String(char[], int, int);

FileWriterInputStramWriter(转换流) 的子类用于按字符写入文件,FileWriter内也没有write()方法,而是在父类中定义的。

new FileReader(filepath, true);//追加写
new FileWriter(filepath);//覆盖写
write(int);//写入一个字符
write(char[])
write(char[], int, int)
write(String);//写入字符串
write(String, int, int);//写入字符串的指定长度

注意:必须关闭流或者调用flush()方法才能将数据真正写入文件中

节点流和处理流

节点流指从特定的数据来源中读取数据,比如上述的四个文件流,还有访问管道和数组的流等,处理流也称为包装流,它连接一个节点流或者处理流来提供更强大的读写功能。

BufferedReader内有一个 Reader in,可以通过构造器用一个任意的Reader来初始化。

BufferedReader bf = new BufferedReader(new FileReader(filePath)) // 关联一个文件流

BufferdReader提供readLine()按行读取可以方便的读取文件内容。

同理在BufferedWriter中也有一个 Writer out。

BufferedWriter bf = new BufferedWriter(new FileWriter(filePath)) // 关联一个文件流

向文件中吸入数据是需要换行可以使用Writer提供的 newLine();

  • 对于包装流只需要关闭外部流,即关闭BufferedReader即可,在底层会关闭节点流。
  • BufferedInputStreamBufferedOutputStream是字节流对应的缓冲流,用法不再做具体的说明

有时我们保存一个数据,除了它的数值外还想保存它的类型,比如对于100,它可能是一个int类型,也有可能是字符串类型。再比如说,我们想要保存一个对象,它有多个对象,我们想要 保存这个对象的完整内容,并且可以从文件中恢复。针对这个问题,Java提供了 对象流

  • 保存数据时保存它的数据类型和值,称为 序列化
  • 通过文件恢复数据的类型和值称为 反序列化
  • 如果需要某个对象支持序列化,它的类必须实现 Serializabel,这个接口是一个标记接口,没有实现方法。

对象流也是包装流,创建对象时,也需要提供一个字节输出流初始化。

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));

通过对象流可以向文件中写入基本数据类型的数据,字符串类型或者对象等

oos.writeInt(100);// int -> Integer (实现了 Serializable)
oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
oos.writeChar('a');// char -> Character (实现了 Serializable)
oos.writeDouble(9.5);// double -> Double (实现了 Serializable)
oos.writeUTF("yjh学java");//String
oos.writeObject(new Person("junhao", 21, "杭州"));

使用对象输入流可以从文件中 按照顺序读取对象,这里读出的顺序必须和保存顺序是一致的。

System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
System.out.println(ois.readObject());
  • 序列化对象时,用关键字static和transient修饰的成员不会被序列化。
  • 序列化对象的属性也必须实现了了Serializable。
  • 序列化的类中条件SerialVersion可以提高版本兼容性。

标准输入输出流 类型 设备 System.out OutputStream 显示器 System.in InputStream 键盘

转换流是为了解决乱码的问题,通关转换流可以将字节流转换成字符流,将字符流转换成字符流。

InputStreamReader 将字节输入流转换为字符输入流,并且可以指定编码方式,比如指定gbk编码这样就很好解决了读取数据输出后中文乱码问题。

//将文件字节输入流转为字符流,指定编码方式gbk
InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");
//可以继续包装为BufferedReader
BufferedReader br = new BufferedReader(isr);
//可以直接写成这样
BufferedReader br = new BufferedReader(new InputStreamReader(
                                            new FileInputStream(filePath), "gbk"));

OutputStreamWriter 将字节输出流转为字符输出流。

BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(
                                            new FileOutputStream(filePath), "gbk"));

默认情况下我们使用print函数,会输出内容到控制台上,而如果想要重定向输出,即想要输出内容到文件中,可以使用 System.setOut(PrintStream out) 方法。

//打印内容到指定文件中
System.setOut(new PrintStream("filePath"));

Properties

在集合中介绍过这是专门用来读取配置文件的集合类,先看看配置文件的格式: 键=值 中间不能有空格。用Properties类的load方法来加载文件信息。

//1. 创建 Properties 对象
Properties properties = new Properties();
//2. 加载指定配置文件
properties.load(new FileReader("src\\mysql.properties"));

方法 说明 list() 显示数据到指定的设备(控制台System.out) getProperty() 根据键获取值 setProperty() 设置键值对 store() 保存文件到配置文件中,中文存储为unicode码

Original: https://www.cnblogs.com/yjh1024/p/16614640.html
Author: Nights_Watch
Title: IO流

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620247/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 盘点 | 常用 PG 数据恢复方案概览【建议收藏】

    作者:张连壮 PostgreSQL 研发负责人从事多年 PostgreSQL 数据库内核开发,对 Citus 有非常深入的研究。 PostgreSQL 本身不具备数据闪回和数据误删…

    数据库 2023年5月24日
    0125
  • 域名SSL认

    阿里云:域名SSL认证-视频 Hole yor life get everything if you never give up. Original: https://www.cn…

    数据库 2023年6月9日
    0105
  • 2022-8-19 第六组 JDBC(2)

    PreparedStatement:执行sql的对象 1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题 1. &#x8F93…

    数据库 2023年6月14日
    076
  • [Mysql]Ubuntu如何安装Mysql+启用远程连接[完整版]

    唉。下面是我花了不知道多少个小时踩过的所有坑总结出来的血泪史,希望能帮你们少踩一些坑吧,正常来讲一步一步下来就不会出现任何问题了。 背景 用的是百度云的云服务器(其他云服务器同理)…

    数据库 2023年6月16日
    073
  • [SWPU2019] Android3

    先反编译出java代码查看,发现没有坑,直接调用了库文件里的check 把so文件直接丢到ida中查找check函数,看到 这是说明flag是11位,刚好发现11个ascii码 &…

    数据库 2023年6月11日
    091
  • MySql数据库备份与还原

    备份(mysqldump) 实现功能: 1、备份指定的数据库 2、删除指定天数前的备份文件,默认设定了1天 脚本示例(mysql_bak.sh) 数&…

    数据库 2023年6月16日
    086
  • Golang并发编程——goroutine、channel、sync

    并发与并行 并发和并行是有区别的,并发不等于并行。 两个或多个事件在同一时间不同时间间隔发生。对应在Go中,就是指多个 goroutine 在单个CPU上的交替运行。 两个或者多个…

    数据库 2023年6月16日
    052
  • 一文说透 MySQL JSON 数据类型(收藏)

    JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档。 相对字符类型,原生的 JS…

    数据库 2023年5月24日
    067
  • Qingcloud_MySQL Plus(Xenon) 高可用搭建实验

    实验:Xenon on 5.7.30 Xenon (MySQL Plus) 是青云Qingcloud的一个开源项目,号称金融级别强一致性的高可用解决方案,项目地址为 https:/…

    数据库 2023年6月16日
    0112
  • 线程池系列二:一张动图,彻底懂了execute和submit

    ​我们知道线程池通过execute方法执行提交的Runnable任务,但Runnable只是执行任务,没有返回任何信息。 【线程池原理:线程池原来是个外包公司,打工人我悟了】 若是…

    数据库 2023年6月6日
    0102
  • Failed to write to mysql.slow_log

    最近将一MySQL数据库的系统变量log_output从file调整为table后,偶尔会收到告警邮件,告警邮件内容为: Failed to write to mysql.slow…

    数据库 2023年5月24日
    079
  • JDK卸载

    win+r,进入cmd,输入java -version显示命令不存在即删除成功 Original: https://www.cnblogs.com/Icy01/p/16298149…

    数据库 2023年6月11日
    070
  • 在windows上用docker desktop安装StoneDB

    自6月底开源以来,许多热心的社区用户都对StoneDB进行了编译和测试,也有一些用户询问StoneDB是否会支持Windows。虽然适配Windows版本的StoneDB尚未进入研…

    数据库 2023年5月24日
    098
  • springboot~手动加载thymeleaf模版

    thymeleaf在spring-mvc时代很是盛行,与freemaker组成了两大模版引擎,而进行springboot之后,很多项目都采用前后分离的模式,这使得模板引擎关注度少了…

    数据库 2023年6月6日
    0105
  • FastDFS分布式文件系统简介

    1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高…

    数据库 2023年6月14日
    085
  • Secret加密以及Configmapd配置介绍

    今天我们来了解有关Secret加密以及Configmapd配置介绍 一、Configmapd配置介绍 ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程…

    数据库 2023年6月14日
    055
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球