概述
- public class File
- 文件和目录路径名的抽象表示
- 文件和目录是可以通过File封装成对象的
- 封装的不是文件,而是一个路径(可以存在,也可以不存在);要通过具体的操作将这个路径转化为具体存在
File类创建功能运行代码之前
注意File类判断和获取功能
- 如果同一目录下存在同名的文件夹,createNewFile()创建文件时会失败;要将同名的文件夹删掉才会创建文件成功。
创建多级目录文件
- 在创建文件之前,应该先创建上一级的目录,否则会报错
删除文件夹递归
- 如果要删除的文件夹下有文件,删除操作会不成功,返回false
- 要先删除该文件夹下的文件,之后才能删除该文件夹
方法中调用方法本身
思路:把一个复杂的问题,层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算。
递归解决问题案例:递归求5的阶乘
- 递归出口:否则会出现内存溢出StackOverflowError
- 递归规则:与原问题相似的规模较小的问题
IO流概述
- IO:输入/输出
- 流:数据传输
- IO流就是处理设备之间数据传输问题的(常见:文件复制,文件上传,文件下载)
输入:读数据;硬盘到内存条
输出:写数据;内存条到硬盘
IO流的分类
- 按照数据的流向
- 输入流:读数据
- 输出流:写数据
- 按照数据类型
- 字节流:字节输入流,字节输出流
- 字符流:字符输入流,字符输出流
使用场景字节流写数据
- 用记事本打开,能看懂的内容,使用字符流,否则使用字节流。
- 如果不知道该使用哪种类型的流,就使用字节流。
字节流抽象基类
- public abstract class InputStream:字节输入流的所有类的超类
- public abstract class OutputStream:字节输出流的所有类的超类
- 子类名称特点:子类名称都是以父类名作为子类命的后缀
FileOutputStream:文件输入流,用于将数据写入File
- FileOutputStream(String name):将数据以指定的名称写入文件
使用字节输出流写数据的步骤创建字节输出流对象的三种方式:
- 创建字节输出流对象
- 调用系统功能创建了文件
- 创建字节输出流
- 让字节数流对象指向文件)
- 调用字节输出流对象的写数据方法
- 释放资源:关闭此文件的输出流并释放与此流关联的任何系统资源
- 字节流写数据如何实现换行?
- Windows: \r\n
- Linux: \n (win11用这个也可以)
- Mac: \r
- 字节流写数据如何实现追加写入?
- public FileOutputStream(File file, boolean append)
FileInputStream:从文件系统中的文件获取输入字节
- FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名。
使用字节输入流读数据的步骤:
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
一次读取一个字节 read(),如果返回-1说明到了文件末尾
注意:文件字节流读取文件,一次读一个字节,遇到中文会乱码;一次读取文件的所有内容,中文不会乱码。字节流复制文本文件
思路:
- 根据数据源创建字节输入流对象
- 根据目的地创建字节输出流对象
- 读写数据,复制文本文件
- 释放资源
使用字节输入流读数据的步骤
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
注意:读含有中文的文件时,建议一次读完。字节流复制图片
因为一个汉字占2~3个字节,如果正好读了半个汉字,那就乱码了(如图)。
后面的内容用字符流就更方便了,因为一个汉字一个字母都是一个字符。
思路
- 根据数据源创建字节输入流对象
- 根据目的地创建字节输出流对象
- 读写数据,复制图片
- 释放资源
思路字节缓冲流一次读写一个字节数组
- 根据数据源创建字节输入流对象
- 根据目的地创建字节输出流对象
- 读写数据,复制视频
- 释放资源
速度:为什么出现字符流
- 基本字节流一次读写一个字节 < 基本字节流一次读写一个字节数组 < 字节缓冲流一次读写一个字节 < 字节缓冲流一次读写一个字节数组
案例:
- 字节流操作中文不方便,所以Java提供了字符流
- 字符流 = 字节流 + 编码表
- 用字节流每次读写一个字节复制文本时,底层操作会自动进行字节拼接中文
- 汉字在存储的时候,无论选择哪种编码格式,第一个字节都是负数
- 计算机存储数据是二进制的(0和1)
- 编码和解码
- 按照规则,将字符存储到计算机中,称为编码;反之,将存储到计算机中的二进制内容按照规则解析显示出来,称为解码
- 编码和解码的规则必须一致,否则会出现乱码
- 字符编码
- 就是一套自然语言的字符与二进制数之间的对应关系。如(A,65)
字符集
- 是一个系统支持的所有字符集的集合,包括各国家文字,标点符号,图形符号,数字等
- 计算机要存储和识别各种字符集符号,就要进行字符编码,一套字符集必然至少有一套字符编码规则。常见的字符集有ASCII字符集,GBXXX字符集,Unicode字符集等
字符流抽象基类
- Reader:字符输入流的抽象类
- Writer:字符输出流的抽象类
InputStreamReader:是从字节流到字符流的桥梁
OutputStreamWriter:是从字符流到字节流的桥梁
flush()和close()的区别
- flush()刷新流,刷新之后还可以写数据
- close()关闭流,关闭流之前会自动执行刷新流操作,关闭之后就不能再继续写数据了
思路:
- 根据数据源创建字符输入流对象
- 根据目的地创建字符输出流对象
- 读写数据,复制文件
- 释放资源
思路:
- 根据数据源创建字符输入流对象
- 根据目的地创建字符输出流对象
- 读写数据,复制文件
- 释放资源
构造方法
- BufferedWriter(Writer out)
- BufferedReader(Reader in)
换行字符缓冲流复制Java文件
- /r Mac
- /n Unix/Linux
- /r/n Windows
- 不过我在windows11上测试换行,以上三种都可以。
思路:
- 根据数据源创建字符缓冲输入流对象
- 根据目的地创建字符缓冲输出流对象
- 读写数据,复制文件
- 释放资源
newLine():就是根据系统,自动识别的换行符
readLine():一次读一行数据,如果读到了结尾则返回null;只读每行的内容,不读行尾终止符
思路:
- 根据数据源创建字符缓冲输入流对象
- 根据目的地创建字符缓冲输出流对象
- 读写数据,复制文件(使用字符缓冲流特有功能)
- 释放资源
字节流小结2.字符流
- 字节流可以复制【任意文件】数据,有四种方式,一般采用字节缓冲流一次读写一个字节数组的方式
字符流小结IO练习
- 字符流只能复制【文本数据】,有五种方式,一般采用字符缓冲流的特有功能
单级文件夹:文件夹中只有文件,没有文件夹数据源目录
多级文件夹:文件夹下还有文件夹数据源文件夹:
System类中有两个静态成员变量
- public static final InputStream in:“标准”输入流。此流已经 打开并准备提供输入数据。通常此流 对应于键盘输入或由 指定的其他输入源 主机环境或用户。
- public static final PrintStream out:“标准”输出流。此流已经 打开并准备接受输出数据。通常此流 对应于显示输出或其他输出目标 由主机环境或用户指定。
打印流分类:
- 字节打印流:PrintStream
- 字符打印流:PrintWriter
打印流的特点:
- 只负责输出数据,不负责读取数据
- 有自己的特有方法
字节打印流
- PrintStream(String fileName):使用指定的文件名创建新的打印流
- 使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
思路
- 根据数据源创建字符输入流对象
- 根据目的地创建字符输出流对象
- 读写数据,复制文件
- 释放资源
对象序列化流
- 就是将对象保存到磁盘中,或者在网络中传输对象
- 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型,对象的数据和对象中存储的属性等
- 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
- 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
对象序列化流:ObjectOutputStream
对象反序列化流:ObjectInputStream
Properties概述Properties作为Map集合
- 是一个Map体系的集合类
- Properties可以保存到流中或从流中加载
- Properties不能有泛型;默认是类型
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |