十三、File、方法递归、IO流
File类概述
-
File类在包java.io.File下、代表操作系统的文件对象(文件、文件夹)
-
-
File类创建对象
-
方法名称 说明 public File(String pathname) 根据文件路径创建文件对象 public File(String parent,String child) 从父路径名字符串和子路径名字符串创建文件对象 public File(File parent,String child) 根据父路径对应文件对象和子路径名字符串创建文件对象 -
File对象可以定位文件和文件夹
-
File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的
-
-
绝对路径和相对路径
-
绝对路径是带盘符的,依赖当前系统
-
相对路径是不带盘符的,默认相对到工程下开始寻找文件
-
File类的常用API
-
判断文件类型、获取文件信息
-
方法名称 说明 public boolean isDirectory() 测试此抽象路径名表示的File是否为文件夹 public boolean isFile() 测试此抽象路径名表示的File是否为文件 public boolean exists() 测试此抽象路径名表示的File是否存在 public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 public String getPath() 将此抽象路径名转换为路径名字符串 public String getName() 返回由此抽象路径名表示的文件或文件夹的名称 public long lastModified() 返回文件最后修改的时间毫秒值
-
-
创建文件、删除文件功能
-
创建文件的功能
-
方法名称 说明 public boolean createNewFile() 创建一个新的空的文件夹 public boolean mkdir() 只能创建一级文件夹 public boolean mkdirs() 可以创建多级文件夹
-
-
删除文件功能
-
delete方法直接删除不走回收站;如果删除的是一个文件,且文件没有被占用则直接删除
-
delete默认只能删除空文件夹
-
方法名称 说明 public boolean delete() 删除由此抽象路径名表示的文件或空文件夹
-
-
-
遍历文件夹
-
方法名称 说明 public String[] list() 获取当前目录下所有的“一级文件名称”到一个字符串数组中去返回 public File[] listFiles()(常用) 获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点) -
listFiles方法注意事项:
-
当调用者不存在时,返回null
-
当调用者是一个文件时,返回null
-
当调用者是一个空文件夹时,返回一个长度为0的数组
-
当调用者是一个由内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
-
当调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏内容
-
-
方法递归
-
递归的形式和特点
-
方法直接调用自己或者间接调用自己的形式,称为方法递归(recursion)
-
递归作为一种算法在程序设计语言中广泛应用
-
递归的形式
-
直接递归:方法自己调用自己
-
间接递归:方法调用其他方法,其他方法又回调方法自己
-
-
方法递归存在的问题?
-
递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出现象
-
-
-
递归的算法流程、核心要素
-
递归解决问题的思路:
-
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来解决
-
-
递归算法三要素大体可以总结为:
-
递归的公式:f(n) = f(n-1)*n;
-
递归的终结点:f(1);
-
递归的方向必须走向终结点;
-
-
-
递归常见案例
-
com.itheima.d1_file.d2_recusion.RecusionDemo2
-
com.itheima.d1_file.d2_recusion.RecusionDemo3
-
-
递归的经典问题
-
com.itheima.d1_file.d2_recusion.RecusionDemo4
-
-
非规律化递归案例-文件搜索
-
com.itheima.d1_file.d2_recusion.RecusionDemo5
-
-
非规律化递归案例-啤酒问题
-
com.itheima.d1_file.d2_recusion.RecusionDemo6
-
字符集
-
常见字符集介绍
-
字符集基础知识:
-
计算机底层不可以直接存储字符的,计算机中底层只能储存二进制(0、1)
-
二进制是可以转换成十进制的
-
-
结论:计算机底层可以表示十进制编号。计算机可以给人类字符进行编号存储,这套编号规则就是字符集。
-
ASCII字符集:
-
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):包括了数字、英文、符号。
-
ASCII使用1个字节存储一个字符,一个字节是8位,总共可以表示128个字符信息,对于英文、数字来说是够用的。
-
-
GBK:
-
window系统默认的码表。兼容ASCII码表,也包含了几万个汉字,并支持繁体汉字以及部分日韩文字。
-
注意:GBK是中国的码表,一个中文以两个字节的形式存储。但不包含世界上所有国家的文字。
-
-
Unicode码表:
-
unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界字符编码标准。
-
容纳世界上大多数国家的所有常见文字和符号。
-
由于Unicode会先通过UTF-8,UTF-16,以及UTF-32的编码成二进制后再存储到计算机,其中最为常见的就是UTF-8.
-
注意:
-
Unicode是万国码,以UTF-8编码后一个中文一般以三个字节的形式存储
-
UTF-8也要兼容ASCII编码表
-
技术人员都应该使用UTF-8大的字符集编码
-
编码前和编码后的字符集需要一致,否则会出现中文乱码。
-
-
-
-
字符集的编码、解码操作
-
String编码
-
方法名称 说明 byte[] getBytes() 使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中 byte[] getBytes(String charsetName) 使用指定的字符集将该String编码为一系列的字节,将结果存储到新的字节数组中去
-
-
String解码
-
构造器 说明 String(byte[] bytes) 通过使用平台的默认字符集解码指定字节数组来构造新的String String(byte[] bytes,String charsetName) 通过指定的字符集解码指定的字节数组来构造新的String
-
-
IO流概述
-
IO流也成为输入、输出流,就是用来做读写数据的
-
I表示input,是数据从硬盘文件读入到内存的过程,称之输入,负责读
-
O表示output,是内存程序的数据从内存写出到硬盘文件的过程,称之输出,负责写。
-
-
IO流的分类
-
按流的方向分
-
IO流
-
输入流
-
输出流
-
-
-
按流中的数据最小单位分为
-
IO流
-
字节流
-
操作所有类型的文件:包括音频视频图片等
-
-
字符流
-
只能操作纯文本文件:包括java文件、txt文件等
-
-
-
-
-
总结流的四大类:
-
字节输入流(InputStream):以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流
-
字节输出流(OutputStream):以内存为基准,吧内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流
-
字符输入流(Reader):以内存为基准,来自磁盘文件/网络中的数据以字符形式读入到内存中的流称为字符输入流
-
字符输出流(Writer):以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流
-
字节流的使用
-
文件字节输入流(FileInputStream):每次读取一个字节
-
作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
-
构造器 说明 public FileInputStream(File file) 创建字节输入流管道与源文件对象接通 public FileInputStream(String pathname) 创建字节输入流管道与源文件路径接通 -
方法名称 说明 public int read() 每次读取一个字节,如果字节已经没有可读的返回-1 public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1
-
-
文件字节输入流(FileInputStream):每次读取一个数组
-
com.itheima.d1_file.d4_byte_stream.FileInputStreamDemo2
-
-
文件字节输入流(FileInputStream):一次读完全部字节
-
jdk9开始可以使用is.readAllBytes();读取全部字节数组
-
-
文件字节输出流:写字节数据到文件
-
file-io-app.src.com.itheima.d4_byte_stream.OutputStreamDemo4
-
文件字节输出流(FileOutputStream)写数据出去的API
-
方法名称 说明 public void write(int a) 写一个字节出去 public void write(byte[] buffer) 写一个字节数组出去 public viod write(byte[] buffer,int pos,int len) 写一个字节数组的一部分出去
-
-
流的关闭与刷新
-
方法 说明 flush() 刷新流,还可以继续写数据 close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能在写数据了
-
-
-
文件拷贝
-
file-io-app.src.com.itheima.d4_byte_stream.CopyDemo5
-
资源释放的方式
-
try-catch-finally
-
file-io-app.src.com.itheima.d5_resource.TryCatchFinallyDemo1
-
finally:在异常处理时提供finally块来执行所有清除操作,比如说IO流中的释放资源
-
特点:被finally控制的语句最终一定会执行,除非JVM退出
-
异常处理标准格式:try……catch……finally
-
-
try-with-resource
-
file-io-app.src.com.itheima.d5_resource.TryCatchResourceDemo2
-
字符流的使用
-
文件字符输入流-一次读取一个字符
-
file-io-app.src.com.itheima.d6_char_stream.FileReaderDemo1
-
文件字符输入流:Reader
-
作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去
-
构造器 说明 public FileReader(File file) 创建字符输入流管道与源文件对象接通 public FileReader(String pathname) 创建字符输入流管道与源文件路径接通 -
方法
-
方法名称 说明 public int read() 每次读取一个字符返回,如果字符已经没有可读的返回-1 public int read(char[] buffer) 每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1
-
-
-
-
-
文件字符输入流-一次读取一个字符数组
-
file-io-app.src.com.itheima.d6_char_stream.FileReaderDemo2
-
文件字符输入流:FileReader
-
作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去
-
-
-
文件字符输出流
-
文件字符输出流:FileWriter
-
作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流
-
构造器 说明 public FileWriter(File file) 创建字符输出流管道与源文件对象接通 public FileWriter(File file ,boolean append) 创建字符输出流管道与源文件对象接通,可追加数据 public FileWriter(String filepath) 创建字符输出流管道与源文件路径接通 public FileWriter(String filepath,boolean append) 创建字符输出流管道与源文件路径接通,可追加数据
-
-
文件字符输出流(FileWriter)写数据出去的API
-
方法名称 说明 void write(int c) 写一个字符 void write(char[] cbuf) 写入一个字符数组 void write(char[] cbuf,int off,int len) 写入字符数组的一部分 void write(String str) 写一个字符串 void write(String str,int off,int len) 写一个字符串的一部分 void write(int c) 写一个字符
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性