Day25-IO流一
IO流一
File和IO流简介
File
File是java.io.包下的类, File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。
注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据。(获取文件属性、创建、删除文件)
IO流
- 用于读写数据的。(可以读写文件,或网络中的数据……)
File
创建对象

1 | //创建一个File对象,指代某个具体的文件。 |
绝对路径、相对路径
绝对路径:从盘符开始
相对路径:不带盘符,默认直接到当前工程下的目录寻找文件
常用方法1:判断文件类型、获取文件信息
- File提供的判断文件类型、获取文件信息功能

常见方法2:创建文件、删除文件
- File创建文件功能

- File删除文件功能

- 注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站。
- 括号里填写要(创建/删除)的(文件/文件夹)的(相对路径/绝对路径)。
常见方法3:遍历文件夹
- File类提供的遍历文件夹功能

- 使用listFiles方法时的注意事项:
- 只能遍历该文件夹下的所有一级文件
- 当主调是文件,或者路径不存在时,返回null
- 当主调是空文件夹时,返回一个长度为0的数组
- 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
- 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
- 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null
前置知识:方法递归
- 递归三要素
- 递归的公式
- 递归的终结点
- 递归的方向必须走向终结点
- 应用:文件搜素
- 需求:从D:盘中,搜索“.exe”这个文件,找到后直接输出其位置。
- 分析:
- 先找出D:盘下的所有一级文件对象。
- 遍历全部一级文件对象,判断是否是文件如果是文件,判断是否是自己想要的。
- 如果是文件夹,需要继续进入到该文件夹,重复上述过程。
前置知识:字符集
常见字符集介绍
标准ASCII字符集
- ASCIl(American Standard Code for Information Interchange):美国信息交换标准代码,包括了英文、符号等。
- 标准ASCII使用1个字节存储一个字符,首位是0,总共可表示128个字符,对美国佬来说完全够用。
GBK(汉字内码扩展规范,国标)
- 汉字编码字符集,包含了2万多个汉字等字符,GBK中一个中文字符编码成两个字节(16bit)的形式存储。
- 注意:GBK兼容了ASCII字符集(8bit)。
- GBK规定:汉字的第一个字节的第一位必须是1。)为了区分汉字和ASCII码。
Unicode字符集(统一码,也叫万国码)
Unicode是国际组织制定的,可以容纳世界上所有文字、符号的字符集。
UTF-32,4个字节表示一个字符。(浪费资源)
UTF-8
是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节
英文字符、数字等只占1个字节(兼容标准ASCII编码),汉字字符占用3个字节。

注意:技术人员在开发时都应该使用UTF-8编码!
小结

字符集的编码、解码操作
- Java代码字符编码

- Java代码字符解码

- 注意:
- 默认使用平台字符集进行编码/解码
- 若要指定字符集 需要抛出异常
- 常用字符集:”ASCII”、”GBK”、”UTF-8”
IO流
IO流概述
IO流分类

流的四大类:
- 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流。
- 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流。
- 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流。
- 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流。
IO流体系

IO流-字节流
文件字节输入流:每次读取一个字节、每次读取多个字节
FileInputStream(文件字节输入流)
作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。

使用FilelnputStream每次读取一个字节,读取性能较差,并且读取汉字输出会乱码。
使用Filelnputstream每次读取多个字节,读取性能得到了提升,但读取汉字输出还是会乱码。
文件字节输入流:每次读取完全部字节
方式一:自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节。

方式二:Java官方为InputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。

小结
- 直接把文件数据全部读取到一个字节数组可以避免乱码。
- 但是如果文件过大,创建的字节数组也会过大,可能引起内存溢出。
- 因此读写文本更适合用:字符流。
- 字节流适合做数据的转移,如:文件复制等。
文件字节输出流:写字节出去
FileOutputStream(文件字节输出流)
作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。

案例:文件复制
- 字节流非常适合做一切文件的复制操作
- 任何文件的底层都是字节,字节流做复制,是一字不漏的转移完全部字节,只要复制后的文件格式一致就没问题!
IO流-资源释放的方式
- .close()的资源释放方式 一旦代码出现异常 会占用系统资源不释放
try-catch-finally

- finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。
- 注意:千万不要在finally里return,会导致固定返回该内容。(程序return前会先执行finally)
- 作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)
try-with-resource

- 该资源使用完毕后,会自动调用其close()方法,完成对资源的释放!
- ()中只能放置资源,否则会报错。
- 资源一般指的是最终实现了AutoCloseable接口。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 宫本贩剑的博客!