File
1. 概念
- 它是文件和目录路径名的抽象表示
- 文件和目录是可以通过File封装成对象的
- 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
2. 构造方法
- File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
- File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File实例
- File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例
3. 常用方法
① 创建的相关方法
- public boolean createNewFile()当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
- public boolean mkdir()创建由此抽象路径名命名的目录
- public boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
public class FileDemo02 {
public static void main(String[] args) throws IOException {
//需求1:我要在E:\\file目录下创建一个文件java.txt
File f1 = new File("E:\\file\\java.txt");
System.out.println(f1.createNewFile());
System.out.println("--------");
//需求2:我要在E:\\file目录下创建一个目录JavaSE
File f2 = new File("E:\\file\\JavaSE");
System.out.println(f2.mkdir());
System.out.println("--------");
//需求3:我要在E:\\file目录下创建一个多级目录JavaWEB\\HTML
File f3 = new File("E:\\file\\JavaWEB\\HTML");
// System.out.println(f3.mkdir()); 错误
System.out.println(f3.mkdirs());
System.out.println("--------");
//需求4:我要在E:\\file目录下创建一个文件javase.txt
File f4 = new File("E:\\file\\javase.txt");
// System.out.println(f4.mkdir()); 错误
System.out.println(f4.createNewFile());
}
}
② 判断的相关方法
- public boolean isDirectory()测试此抽象路径名表示的File是否为目录
- public boolean isFile()测试此抽象路径名表示的File是否为文件
- public boolean exists()测试此抽象路径名表示的File是否存在
③ 获取的相关方法
- public String getAbsolutePath()返回此抽象路径名的绝对路径名字符串
- public String getPath()将此抽象路径名转换为路径名字符串
- public String getName()返回由此抽象路径名表示的文件或目录的名称
- public String[] list()返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
- public File[] listFiles()返回此抽象路径名表示的目录中的文件和目录的File对象数组
public class FileDemo04 {
public static void main(String[] args) {
//创建一个File对象
File f = new File("myFile\\java.txt");
// public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
// public String getPath():将此抽象路径名转换为路径名字符串
// public String getName():返回由此抽象路径名表示的文件或目录的名称
System.out.println(f.getAbsolutePath());
System.out.println(f.getPath());
System.out.println(f.getName());
System.out.println("--------");
// public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
// public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
File f2 = new File("E:\\itcast");
String[] strArray = f2.list();
for(String str : strArray) {
System.out.println(str);
}
System.out.println("--------");
File[] fileArray = f2.listFiles();
for(File file : fileArray) {
// System.out.println(file);
// System.out.println(file.getName());
if(file.isFile()) {
System.out.println(file.getName());
}
}
}
}
④ 删除的相关方法
- public boolean delete()删除由此抽象路径名表示的文件或目录
递归
1. 概念
- 递归指的是方法定义中调用方法本身的现象
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
- 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
2. 基本使用
- 求斐波那契数列第二十位的数值
- 斐波那契数列: 1,1,2,3,5,8,13…
public class Test01 {
public static void main(String[] args) {
int fbnq = getFBNQ(7);
System.out.println(fbnq); // 13
}
public static int getFBNQ(int index) {
if (index <= 2) {
return 1;
}
return getFBNQ(index - 1) + getFBNQ(index - 2);
}
}
3. 注意事项
- 递归一定要有出口。否则内存溢出
- 递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出
4. 递归应用- 遍历文件目录
- 给定一个路径(E:\itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台
public class Test02 {
public static void main(String[] args) {
File day01 = new File("day01/myFile");
getFilePath(day01);
}
// 遍历文件目录的方法
public static void getFilePath(File file) {
if (!file.isDirectory()) {// 判断给file是不是目录
// 如果不是, 给出提示
System.out.println("你给的目标不是一个目录!");
return;
}
// 获取到目录下的子文件
File[] files = file.listFiles();
// 如果目录不为空
if (files != null) {
// 遍历目录结构
for (File f : files) {
if (f.isFile()) { // 如果是文件, 直接获取文件的绝对路径
String path = f.getAbsolutePath();
System.out.println(path);
} else { // 如果是目录, 递归
getFilePath(f);
}
}
}
}
}
IO流
1. 介绍
- IO:输入/输出(Input/Output)
- 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
- IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载
2. 分类
① 按照数据的流向
- 输入流:读数据
- 输出流:写数据
② 按照数据类型来分
- 字节流
- 字节输入流
- 字节输出流
- 字符流
- 字符输入流
- 字符输出流
3. 应用场景
- 如果操作的是纯文本文件,优先使用字符流
- 如果操作的是图片、视频、音频等二进制文件。优先使用字节流
- 如果不确定文件类型,优先使用字节流。字节流是万能的流
字节流
1. 字节流抽象基类
- InputStream:这个抽象类是表示字节输入流的所有类的超类
- OutputStream:这个抽象类是表示字节输出流的所有类的超类
- 子类名特点:子类名称都是以其父类名作为子类名的后缀
2. 字节输出流-FileOutputStream
① 使用字节输出流写数据的步骤
- 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
- 调用字节输出流对象的写数据方法
- 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
② 写数据的方法分类
- void write(int b)将指定的字节写入此文件输出流 一次写一个字节数据
- void write(byte[] b)将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据
- void write(byte[] b, int off, int len)将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据
③ 示例代码
public class MyOutputStream {
public static void main(String[] args) throws IOException {
// 创建字节输出流对象
FileOutputStream fs = new FileOutputStream("day01/text.txt");
// 一次写一个字节数据
fs.write(97);
// 一次写一个字节数组数据
fs.write("hello".getBytes());
// 一次写一个字节数组的部分数据
fs.write("java".getBytes(),0,2);
// 释放资源
fs.close();
}
}
3. 字节输入流-FileInputStream
① 概念
- FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文件系统中的路径名name命名
② 字节输入流读取数据的步骤
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源
③ 方法分类
- int read() 从此输入流中读取一个数据字节
- int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
- int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中
③ 示例代码
- 字节流复制图片
public class MyInputStream {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象, 指向要复制的图片
FileInputStream fis = new FileInputStream("day01/myFile/car.jpg");
// 创建字节输出流对象, 指向目标目录
FileOutputStream fos = new FileOutputStream("day01/copy.jpg");
// 读取文件
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
// 将读取到的字节数组写入copy文件
fos.write(bytes, 0, len);
}
// 释放资源
fos.close();
fis.close();
}
}