03-File类、递归、IO流、字节流、字符流
1、File类
1.1、File类的作用
- File对象可以用来定位文件或者文件夹
1.2、File类构造器
1.2.1、概念
- java.io.File类是通过路径定位文件和文件夹,主要用于文件和目录的查找和删除等操作
1.2.2、方法
- File(String pathname)
- 通过路径名字字符串创建File对象
- File(String parent, String child)
- 从父路径名字符串和子路径名字符串创建File对象
- File(File parent, String child)
- 从父抽象路径名和子路径名字符串创建File对象
1.2.3、斜杠问题
- \在字符串中要写2个\
- Windows系统中路径支持\和/
- /在字符串中可以写1个
1.2.4、注意事项
- File封装的独享仅仅是一个路径名。这个路径可以是存在的,也可以是不存在的
1.3、File类创建功能
- 概念
- File类可以创建文件和文件夹
- 方法
- public boolean createNewFile()
- 创建一个新的文件
- public boolean mkdir()
- 创建一个单级目录
- public boolean mkdis()
- 创建一个多级目录
- public boolean createNewFile()
1.4、File类删除功能
- 概念
- File类可以删除文件和文件夹,并且不走回收站
- 方法
- public boolean delete()
- 删除文件或者文件夹
- public boolean delete()
- 注意事项
- delete方法是直接删除,不走回收站的
- 如果删除的是一个文件,那么就直接删除
- 如果删除的是一个文件夹,需要先删除文件夹中的内容,最后才能删除文件夹
1.5、绝对路径和相对路径
-
绝对路径
-
从盘符开始
-
demo
-
File file1 = new File("D:\\MyFileTest\\aaa\\bbb.flv");
-
-
-
相对路径
-
不带盘符,默认从当前项目下的开始寻找
-
demo
-
File file1 = new File(“模块名\\xxx.png");
-
-
1.6、File类判断和获取功能
- 方法
- public boolean isDirectory()
- 判断是否是文件夹
- public boolean isFile()
- 判断是否是文件
- public boolean exists()
- 判断是否存在
- public getAbsolutePath()
- 返回File对象的绝对路径
- public String getName()
- 获取名字
- public String getParent()
- 获取父路径
- public long length()
- 获取文件大小
- public boolean isDirectory()
1.7、File类遍历功能
- 概述
- File类的listFiles()可以显示文件夹中的所有内容(相当于双击文件夹)
- 方法
- String list()
- 获取文件夹里面的内容,以字符串的形式返回
- public File[] listFiles()
- 获取文件夹里面的内容,以File对象的形式返回
- 注意事项
- 只有文件夹才能调用listFiles()
- String list()
2、递归
2.1、递归概述
- 方法自己调用自己
2.2、格式
-
public class Demo08 { public static void main(String[] args) { diGui(); } public static void diGui() { System.out.println("num = " + num); diGui(); }}
2.3、递归注意事项
- 递归要有出口(即递归要有结束条件)
- 递归次数不能太多
2.4、递归求start-end的和
-
package Day10.demo09递归求和练习; /* 目标:使用递归求1-5的和 递归思想 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算 1-5的和:1+2+3+4+5以前使用for循环 使用递归求1-5的和 递归解决问题要找到两个内容 递归规则:与原问题相似的规模较小的问题 递归出口:否则会出现内存溢出 经验: 在以后工作中能使用循环的不要使用递归 只有遇到文件夹中还要处理文件夹,使用递归 递归内存溢出的原因: 递归是方法不断调用自己,方法不断进入栈中,栈的空间不够了,就溢出了 */ public class Demo09 { public static void main(String[] args) { int result1 = recursiveSum(1, 5); // 1 + 2 + 3 + 4 + 5 = 15 System.out.println("result1 = " + result1); int result2 = recursiveSum(2, 5); // 2 + 3 + 4 + 5 = 14 System.out.println("result2 = " + result2); } // 计算从start到end之间的求和 private static int recursiveSum(int start, int end) { if (start < end) { return start + recursiveSum(start + 1, end); }else { return end; } } }
2.5、使用递归进行文件搜索
-
package Day10.demo10列出文件夹中的所有java文件_重点; import java.io.File; import java.io.IOException; /* 目标:列出文件夹中的所有java文件,如果文件夹中有文件夹也要找出来 // 1.创建一个File对象定位aaa文件夹 // 2.定义一个方法listJava(File dir), 列出某个文件夹中的所有java文件 // 2.1.调用listFiles()显示文件夹中的所有内容 // 2.2.遍历获取每个内容 // 2.3.判断如果是文件,并且是.java文件,打印这个文件 // 2.4.如果是文件夹,再次调用listJava */ public class Demo10 { public static void main(String[] args) throws IOException { File file = new File("DarkHorseEmployment/src/Day10/demo10列出文件夹中的所有java文件_重点"); if (file.exists()) { seekJavaFile(file); }else { System.out.println("该文件或者文件夹不存在!"); } } // 递归查询所有.java文件 private static void seekJavaFile(File path) { // 获取File数组对象 File[] files = path.listFiles(); // 遍历path下的第一层目录 for (File file : files) { // 如果是文件 if (file.isFile()) { // 并且以.java为后缀 if (file.getName().endsWith(".java")) { System.out.println(file); } }else { // 否则是文件夹 seekJavaFile(file); } } } }
3、IO流
3.1、数据存在于内存中的问题
- 不能持久化存储,只要代码运行结束,所有数据都会丢失
- 如果想要实现持久化存储
- 可以存在文件中
3.2、IO流的概念
- I表示input,输入
- O表示output,输出
3.3、IO流体系
3.4、IO流的作用
- 将数据写道文件中,实现数据持久化存储
- 读取文件中的数据到程序
3.5、按流向分(站在程序的角度)
- 输入流
- 输出流
3.6、按操作数据类型分
- 字节流
- 字符流
4、字节流
4.1、字节流写
- 字节流写一个字节数据
- 概念
- 字节输出流的顶级父类OutputStream是抽象的, 一般都是使用其子类FileOutputStream操作文件
- 方法
- void write(int b)
- 一次写一个字节数据
- void write(byte[] b)
- 一次写一个字节数组数据
- void write(byte[] b, int off, int len)
- 一次写一个字节数组的部分数据
- void write(int b)
- 概念
- 字节流写多个字节数据
- void write(byte[] b)
- 一次写一个字节数组的数据
- void write(byte[] b, int off, int len)
- 一次写一个字节数组的部分数据
- void write(byte[] b)
- 字节流写数据的步骤
- 创建字节输出流对象
- 写数据
- 关闭流
4.2、字节流读
- 读一个字节数据
- 概念
- 字节输入流的顶级父类InputStream是抽象的,我们可以使用它的子类FileInputStream操作文件
- 方法
- ...
- 概念
- 读多个字节数据
- int read(byte[] b)
- 从流中读取多个字节保存到参数的数组中
- 好处
- 效率高
- int read(byte[] b)
- 字节流读数据的步骤
- 创建字节输入流对象
- 读取数据
- 释放资源
4.3、案例(文件复制)
-
文件复制的前提
- 两个文件的字节数据一样
-
实现步骤
- 创建输入流
- 创建输出流
- 循环读写数据
- 关闭流
-
// 1.创建文件字节输入流 FileInputStream fis = new FileInputStream("study_day10_2\\abc\\xyz.png"); // 2.创建文件字节输出流 FileOutputStream fos = new FileOutputStream("study_day10_2\\xyz.png"); // 3.循环读写 byte [] buf = new byte [1024 * 8]; int len; while ((len = fis.read(buf)) != -1){ fos.write(buf , 0 ,len); } // 4.关闭资源 fos.close(); fis.close();
5、字符流
5.1、字符流读
- 读一个字符
- 概念
- 字符输入流的顶级父类Reader是抽象的,一般使用FileReader操作文件
- 方法
- int read()
- 从流中读取一个字符
- int read()
- 概念
- 读多个字符
- 方法
- int read(char[] b)
- 从流中读取多个字符保存到参数的数组中
- int read(char[] b)
- 方法
5.2、字符流写
- 方法
- 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)
5.3、数据追加续写和换行
- 方法
- public FileWriter(String name,boolean append)
- append为true, 以追加的形式写数据到文件, 不会删除文件
- public FileWriter(String name,boolean append)