IO流、转换、缓冲流、对象流

本文详细介绍了Java中的File类,用于文件操作的基础。接着阐述了I/O流的概念,包括输入流、输出流、字节流与字符流的分类及其用途。针对每种流类型,提供了相关的构造方法和使用案例,如FileInputStream和FileOutputStream。此外,还讨论了缓冲流、对象流以及Properties类在文件操作中的应用,强调了它们在提高效率和处理对象序列化方面的作用。
摘要由CSDN通过智能技术生成

File类

文件(File)
在Java程序中,对磁盘文件进行描述的类,文件和目录路径名的抽象表示形式。
如何对数据进行持久化?
1.面对对象的思想:
a.找到一个对象来表示我们的文件(File)
b.找一个对象来将内容写到文件中
c.找一个对象将文件中的内容读取出来

读写文件需要弄清楚什么是参照物?
参照物是java代码
读:读是java代码将文件中的内容输入进来(输入流)
写:写是java代码将字节的内容输入到文件中(输出流)

在对File的读写过程中,我们需要一个连接管道来进行处理读写过程,而按照管道能处理的内容我们分为:
1.处理字节文件我们用字节流
2.处理字符文件我们用字符流(拥有汉字的文件)

File类的构造方法

在这里插入图片描述
案例:
在这里插入图片描述

I/O流

1.定义:
	在工作中,经常会操作硬盘上的资源,这个过程实现了数据的输入和输出操作(以java代码为参照物),硬盘上的文件和内存之间进行交互,数据的交互需要有一个媒介或者管道,把这个媒介或者管道就称为IO流,也被成为输入输出流[I:Input     O:Output]
	输入:从外部存储设备到内存交输入/读取
	输出:从内存到外部存储设备交输出/写入

2.流的作用和原理
流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在俩设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

3.流的种类
按照流的方向分为:输入流和输出流
输入流:表示将数据读取到java程序(内存)中使用的流。
输出流:表示从java程序(内存)向外传输使用的流。
按照数据单位分:字节流,字符流
字节流:一次性传输一个字节数据,将数据以字节的形式传输。
字符流:一次性传输一个字符(utf-8编码1、2或3个字节)数据,将数据以字符的形式传输。

所以分为IO流分为:
字节输出流(InputStream)
字节输入流(OutputStream)
字符输出流(Writer)
字符输入流(Reader)
字节输入流(InputStream)

InputStream是一个抽象类,不能实例化对象。
方法有:
在这里插入图片描述
案例:文件输入流FileInoputStream
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

字节输出流(OutputStream)

OutputStream类也是抽象类,不能实例化对象。
方法:
在这里插入图片描述
案例: 文件输出流FileOutputStream
在这里插入图片描述
在这里插入图片描述

字符输入流(Reader)

Reader:是所有字符输入流的父类,为一个抽象类,不能实例化对象,使用它的子类FileReader类
在这里插入图片描述

字符输出流(Writer)

Writer:是所有字符输出流的父类,为一个抽象类,不能实例化对象,使用它的子类FileWriter类
在这里插入图片描述
字符流和字节流的区别
1.字节流可以处理任意类型的文件,包含字符文件,而字符流只能处理字符文件
2.字符流默认使用缓冲区,而字节流没有
缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高

转换流

InputStreamReader

InputStreamReader:字节字符转换输入流,将字节输入流转换为字符输入流
在这里插入图片描述

OutputStreamWriter

OutputStreamWriter:字符转换输出流,将内存中的字符转成字节保存到硬盘中。
在这里插入图片描述

缓冲流

作用:主要是为了增强基础流的功能而存在的,提高了流的工作效率【读写效率】
BufferedInputStream类:
在这里插入图片描述
在这里插入图片描述
BufferedOutputStream类
在这里插入图片描述
BufferedReader类
在这里插入图片描述
在这里插入图片描述
BufferedWriter类
在这里插入图片描述
在这里插入图片描述

对象流

序列化(持久化)
序列化时自己不考虑持久化的格式,以默认的方式生成数据文件
反序列化,以默认的方式将序列化的文件重写读成对象

流中流动的数据是对象
将一个对象写入到本地文件中,被称为对象的序列化
将一个本地文件中的对象读取出来,被称为对象的反序列化
使用对象流
ObjectInputStream: 对象输出流
ObjectOutputStream:对象输入流
注意:
如果向将多个对象序列化到本地,可以借助于集合,【思路:将多个对象添加到集合中,将集合的对象写入到本地文件中,再次读出来,获取到的仍然是集合对象,遍历集合】。	
对象中那些字段可以不序列化:
1 transient 修饰的字段
2 静态的字段
在要序列化类中添加字段,保证序列化和反序列化是同一个类	
private stati c final long serialVersionUID = 100L;
案例:

在这里插入图片描述
在这里插入图片描述

Properties类

是Map接口的一个实现类,并且是Hashtable的子类
Properties集合中元素也是以键值对的形式存在的
Properties特点:
1 存储属性名和属性值
2 属性名和属性值都是字符串
3 和流有关系
4 没有泛型
  • 硬编码问题:
  • 我们以后是将变异之后的字节码文件放到服务器中运行的
  • 需求:如果有一天密码被泄露了,需要修改密码,把服务器中的class文件拿出修改密码
  • 我们无法修改二进制的字节码文件,我们需要找回源码,在源码的基础上修改密码,重新编译
  • 重新部署,这样的过程很是繁杂,这样的代码就称之为硬编码
  • 解决方案,引入外部配置文件,进行配置,所有的硬编码数据在配置文件中读取(配置文件不编译)
  • 传统的io流书写麻烦
  • 新的解决方案
  • 引入properties配置文件,使用Properties类去自动读取
  • Properties继承自Hashtable===>键值对
  • 在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值