IO流
1.File
-
File类概述和构造方法
File:它是文件和目录路径名的抽象表示
-
文件和目录是可以通过File封装成对象的
-
对于File而言,其封装的并不是一个真正的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。
将来是要通过具体的操作把这个路径的内容转换为具体存在的。、
方法名 说明 File(String parent,String child) 从父路径名字符串和字路径名字符串创建新的File实例 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例 File(File parent,String child) 从父抽象路径名和子路径名字符创建新的File实例
package itheima01; import java.io.File; public class FileDemo01 { public static void main(String[] args) { //1.File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的File实例 File f1 = new File("D:\\heima-project\\java.txt");//把java.txt封装成了对象 System.out.println(f1);//1.只是抽象路径的表示形式,不一定存在 2.输出了路径名的内容,File类重写了toString()方法 //2.File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的File实例 File f2 = new File("D:\\heima-project", "java.txt"); System.out.println(f2); //3.File(File parent,String child)从父抽象路径名和子路径名字符创建新的File实例 File f3 = new File("D:\\heima-project"); File f4 = new File(f3, "java.txt"); System.out.println(f4); //以上三种方法做的是同一件事 } }
-
-
File类创建功能
方法名 说明 public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 public boolean mkdir() 创建由此抽象路径名命名的目录 public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必须但不存在的父母目录 package itheima01; /* File类创建功能: public boolean createNewFile():当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 如果文件不存在,就创建文件,并返回true 如果文件存在,就不创建文件,并返回false public boolean mkdir():创建由此抽象路径名命名的目录 同上,如果目录不存在,则创建目录并返回true 否则返回false public boolean mkdirs():创建由此抽象路径名命名的目录,包括任何必须但不存在的父母目录 创建多级目录,原则同上 */ import java.io.File; import java.io.IOException; public class FileDemo02 { public static void main(String[] args) throws IOException { //需求1:在D:\\heima-project目录下创建一个文件Java.txt File f1 = new File("D:\\heima-project\\java.txt"); System.out.println(f1.createNewFile()); System.out.println("------------------------"); //需求2:在D:\\heima-project目录下创建一个目录JavaSE File f2 = new File("D:\\heima-project\\JavaSE"); System.out.println(f2.mkdir()); //需求3:在D:\\heima-project目录下创建一个多级目录JavaWEB\\HTML File f3 = new File("D:\\heima-project\\JavaWEB\\HRML"); // System.out.println(f3.mkdir()); System.out.println(f3.mkdirs()); System.out.println("-------------------------"); //需求4:在D:\\heima-project目录下创建一个文件Javase.txt File f4 = new File("D:\\heima-project\\javase.txt"); // System.out.println(f4.mkdir());//不能根据文件名判断创建的是文件还是目录,要看调用的方法,此处调用mkdir()方法,创建的是一个名为javase.txt的目录 System.out.println(f4.createNewFile()); } }
-
File类判断和获取功能
方法名 说明 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[] listFile() 返回此抽象路径名表示的目录中的文件和目录的File对象数组 package itheima01; import java.io.File; public class FileDemo03 { public static void main(String[] args) { //创建一个File对象 File f = new File("myFiel\\java.txt"); System.out.println(f.isDirectory());//false System.out.println(f.isFile());//true System.out.println(f.exists());//true System.out.println(f.getAbsolutePath());//绝对路径 System.out.println(f.getPath());//封装路径 System.out.println(f.getName());//名称 File f2 = new File("D:\\developer\\Java\\heima-project\\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()); } } } }
-
File类删除功能
方法名 说明 public boolean delete() 删除由此抽象路径名表示的文件或目录 绝对路径和相对路径的区别
- 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:D:\develop\java.txt
- 相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\java.txt
删除目录时的注意事项:
- 如果一个目录中有内容(目录,文件),不能直接删除。应该先删除目录中的内容,最后才能删除目录。
package itheima01; import java.io.File; import java.io.IOException; public class FileDemo03 { public static void main(String[] args) throws IOException { //需求1.在当前模块目录下创建jsva.txt文件 // File f1=new File("D:\\developer\\Java\\heima-project\\java.txt"); File f1 = new File("java/txt");//当没有写全路径名称时,文件自动创建在模块所在的项目目录下(与模块同级),若想让文件创建在模块所在的目录下,则需要在前面加上模块的名称 System.out.println(f1.createNewFile()); //需求2.删除当前模块努力下的java.txt文件 System.out.println(f1.delete()); System.out.println("-------------------"); //需求3.在当前模块目录爱创建itcast目录 File f2 = new File("myFile\\itcast"); System.out.println(f2.mkdir()); //需求4.删除当前模块目录下的itcast目录 System.out.println(f2.delete()); //需求5.在当前模块下创建一个目录itcast,然后在该目录下创建一个文件java.txt File f3 = new File("myFile\\itcast"); System.out.println(f3.mkdir()); File f4 = new File("myFile\\itcast\\java.txt");//创建该文件之前要求该目录存在或要创建该目录,否则抛出异常 System.out.println(f4.createNewFile()); //需求6.删除当前模块下的目录itcast System.out.println(f4.delete()); System.out.println(f3.delete());//如果要删除的目录下面由内容,则无法删除 } }
-
递归
递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象
递归解决问题的思路:
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
递归策略只需少量的程序就可以描述出解题过程所需的多次重复计算
递归解决问题要找到两个内容:
- 递归出口:否则会出现内存移除
- 递归规则: 与原问题相似的规模较小的问题
案例:递归求阶乘
需求:用递归求5的结成,并把结果在控制台输出
分析:
-
阶乘:一个正整数的阶乘时所有小于及等于该数的正整数的积,自然数n的阶乘写作n!
5!=5 * 4 * 3 * 2 * 1
-
递归出口:1!=1
-
递归规则:n!=n * (n-1)!
5!=5 * 4!
思路:
-
定义一个方法,用于递归求阶乘,参数为一个int类型的变量
-
在方法内部判断该变量的值是否是1
是:返回1
不是:返回n * (n-1)!
-
调用方法
-
输出结果
package itheima02; public class DiguiDemo { public static void main(String[] args) { int result = jc(5); System.out.println("5的阶乘是:" + result); } public static int jc(int n) { if (n == 1) { return 1; } else { return n * jc(n - 1); } } }
案例:遍历目录
需求:给定一个路径(D:\developer\Java\heima-project),请通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台
思路:
-
根据给定的路径创建一个File对象
-
定义一个方法,用于获取给定目录下的所有内容,参数为第一部创建的File对象
-
获取给定的File目录下所有的文件或者目录的File数组
-
遍历该File数组,得到每一个File对象
-
判断该File对象是否是目录
是:递归调用
不是:获取绝对路径输出在控制台
-
调用方法
package itheima02; import java.io.File; public class DiguiDemo { public static void main(String[] args) { File srcFile = new File("D:\\developer\\Java\\heima-project"); //调用方法 getAllFilePath(srcFile); } public static void getAllFilePath(File srcFile) { //定义一个方法,用于获取给定目录下的所有内容,参数为第一部创建的File对象 File[] fileArray = srcFile.listFiles(); //获取给定的File目录下所有的文件或者目录的File数组 if (fileArray != null) { for (File file : fileArray) { //判断该File对象是否是目录 if (file.isFile()) { //是:递归调用 getAllFilePath(file); } else { // 不是:获取绝对路径输出在控制台 System.out.println(file.getAbsolutePath()); } } } } }
2. 字节流
- IO流概述:
-
IO:输入\输出(Input/Output)
-
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
-
IO流就是用来处理设备间数据传输问题的
常见的应用:文件复制;文件上传;文件下载
IO流分类:
-
按照数据的流向
输入流:读数据
输出流:写数据
-
按照数据类型来分
字节流
字节输入流;字节输出流
字符流
字符输入流;字符输出流
一般来说,我们说IO流的分类是按照数据类型来分的
- 如果数据通过Windows自带的记事本打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果你不知道使用哪种类型的流,就使用字节流。
-
字节流写数据
字节流抽象基类
- InputStream:这个抽象类是表示字节输入流的所有类的超类
- OutputStream:这个抽象类是表示字节输出流的所有类的超类
- 子类名特点:子类名称都是以其父类名作为子类名的后缀
FileOutputStream:文件输出流用于将数据写入File
- FileOutputStream(String name):创建文件输出流以指定的名称写入文件
使用字节输出流写数据的步骤:
- 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流 对象指向文件)
- 调用字节输出流对象的写数据方法
- 释放资源(关闭文件输出流并释放与此相关联的任何系统资源)
字节流写数据的3种方式
方法名 说明 void write(int b) 将指定的字节写入文件输出流,一次写一个字节数据 void write(byte[] b) 将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据 void write(byte[] b,int off,int len) 将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据 package itheima03; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamDemo02 { public static void main(String[] args) throws IOException { //1. FileOutputStream(String name):创建文件输出流以指定的名称写入文件 FileOutputStream fos = new FileOutputStream("D:\\developer\\Java\\heima-project\\fos.txt"); //new File(name) 底层相当于做了这样一个动作: // FileOutputStream fos=new FileOutputStream(new File("D:\\developer\\Java\\heima-project\\fos.txt")); //2. FileOutputStream(File file),创建文件输出流以写入由指定的File对象表示的文件 File file = new File("heima-project\\\\fos.txt"); FileOutputStream fos2 = new FileOutputStream(file); //简化一下就是: // FileOutputStream fos=new FileOutputStream(new File("D:\\developer\\Java\\heima-project\\fos.txt")); //写数据的三种方式 /