JavaSE入门级-第十六课-输入输出流IO
前言
输入输出流(stream),就是读入数据,和输出数据,数据往往用文件的方式保存,所以输入和输出和文件有直接关系,文件因为 数据内容 和 使用方向 还有类型的区分,表现在后缀名不同
java.io.File 文件
l java对于文件的操作,封装在类File中
File类可以操作文件或者目录,也就是可以访问磁盘,管理文件或文件夹,但是特别注意File不能访问文件的内容本身
l 代码实例:

知识补充 分隔符
在windows平台中,文件的目录有盘符 C:\\ 有 目录分符号 \,而在Linux平台中使用 /
l 注意:在java中 左右斜线都应该用转译字符表示 \\ , /
l File类常用方法

l 代码实例:

练习:
l 使用File类创建一个文件,探究试用File类的其他方法(可查阅文档)
文件属性及结构
l 打印工作空间下的文件结构

l 递归调用输出文件名

练习:
l 将一个目录中的结构所有文件,按大小从小到大输出
提示:使用map,key表示文件内容长度,value表示文件名列表

流
文件File可以控制文件的属性和行为,如果需要操作文件内容需要使用 流 Stream
l 下图所示:

l 提醒:数据需要编程 电信号,也就是0 和 1传递
l 输入流 与 输出流

l 输入流:从文件 → 内存
l 输出流:从内存 → 文件
java中的流
java提供了一组抽象类,InputStream,OutputStream
l 使用IO一般会有IOException,需要显示 try-catch
l InputStream 常用方法

l OutputStream 常用方法

l 抽象类表示一种标准,根据多态性子类会有不同实现,但是操作的方法是一样滴
FileInputStream与FileOutputStream
l 是InputStream 和OutputStream 的对应实现类


l 代码示例:

l 注意:使用完输出流需要close,首先GC不会扫描这个对象,其次数据安全考虑
练习:
l 使用文件输入输出流,完成文件内容复制
提示:
- 使用FileInputStream入读文件内容保存在内存中
- 使用FileOutputStream输出内容到文件中
- 使用File创建文件或文件夹
- 注意:资源关闭 清空缓冲区
FileWriter与FileReader
l java中按照字节去操作数据读写是一个不稳定的过程,因为一个汉字 2个字节,如果在按照1个字节的单位传输,可能出现中断情况导致乱码,我们应该按照char为单位
l 代码示例如下:

ü 代码解析:上图代码中我们可以看到把字符作为操作单位,而且还提供了String的参数,使用起来更方便
ü 注意:上图中的类 Reader 已经不是属于 Stream的类,是和Stream一样的另外两个抽象类,他们是以char作为基本操作单位
练习:
l 写一篇《墓志铭》到文件中
l 在java控制台写一篇日记,然后保存在文件中,使用FileWriter 或 FileReader
提示:
- 使用日期API记录时间,姓名,内容等,生成文件名也需要注意包含日期
BufferWriter 与 BufferReader
l 使用字符操作能够提升用户体验,但是对于硬件是一个考验,可能我们需要寻求一个更好的方式,而不是每次都是一直占用输入输出流,这样在高并发下容易出问题
l 缓冲,就是缓缓的冲(缓冲是先积累数据,一次性写入,集能量放大招)
l 代码实例:

文本读写中容易出现的乱码问题
l 设置成为UTF-8编码,或者字符串重构成为UTF-8编码

练习:
l 有模版文件 resume.txt 中,有固定内容如下:
- 从前有座山,叫{moutian},山里有座庙,叫{temple},庙里有和老和尚叫{name}
- 去读这个文件的信息,要求用户输入三个变量迅速替换内容
- 使用String.relace(oldChar,newChar);
项目应用
l 配置mysql.txt文件,在项目中通过IO加载文件读取数据库连接信息

对象序列化
l 数据传输的单位可以使用byte,因为字符才是文本的最小单位所以使用char,但是在面向对象编程中,对象是编程的基本单位,序列化只的是,把对象转变成为流的形式,能够整体传输
ü 序列化:对象 → 流
ü 反序列化:流 → 对象
Serializable 序列化接口
一个对象如果需要序列化,那么它的类必须实现Serializable(Externalizable)接口,实现此接口没有需要实现的抽象方法,它会给定一个版本标识
l 代码示例:

ObjectOutputStream 与 ObjectInputStream
l 对象序列化,将内存对象流话并且保存在对应文件中
l 代码示例:

l 反序列化,将文件中的内容读取,在内存中恢复成为对象
l 代码实例:

练习:
l 不使用数据库,完成系统的注册功能
提示:讲数据对象保存在文件中,序列化与反序列化,再读取校验
java.util.Properties 属性文件
l Properties表示持久属性,可以配合IO载入文件使用,载入文件名后缀必须为.properties,且配置方式必须为key = value 形式
l 代码示例:

l 文件内容如下:

l 加载成功后 Properties 有常用方法:
|
方法名 |
方法功能 |
|
getProperty(key) |
使用此属性列表中指定的键搜索属性 |
|
getProperty |
使用此属性列表中指定的键搜索属性 |
|
从输入字节流读取属性列表键和元素 |
|
|
简单的线性格式从输入字符流读取属性列表 |
|
|
将指定输入流中的XML文档表示的所有属性加载到此属性表中 |
|
|
setProperty |
设置 Hashtable方法 |
ü 注意:先加载文件,自动封装成为 Map格式
l 代码实例:

Excel导出
l 在业务系统研发中,一个标准的业务视图功能,一定有 CRUD,download,onload
l apache提供了支持Excel导出的专用包poi
常用类解析:
- HSSFWorkbook:对应一个工作簿
- HSSFSheet:对应一个Excel表格Sheet
- HSSFRow:对应一个Excel行
- HSSFCell:对应一个Excel列
- HSSFFont:对应单元格字体
- HSSFDataFormat :对应单元格日期格式
- HSSFHeade:Excel文档Sheet的页眉
- HSSFFooter :Excel文档Sheet的页脚
- HSSFCellStyle:格子单元样式
ü 注意:先有工作部在创建表格,先有行,在创建对应列,操作顺序从 0 开始
文件写入,和导出操作
代码示例:

代码解析:
操作Excel数据与格式之后,可以使用FileOutputStream写出到目录中
添加摘要信息

创建批注

创建页眉页脚

合并单元格

组合行或列
l 组合指的是数据有一个 + 效果可以展开或关闭

锁定列

设置密码

下拉菜单

练习:
l 实现员工管理系统的功能页面,包括新增,修改,删除,查询,导出

浙公网安备 33010602011771号