目录
第一章 File类
1.1 IO概述
当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。
当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
因此我们把这种输入和输出动作称为IO操作。
1.2 File类的出现
File文件和目录路径名的抽象表示形式。即Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到这个File类即可。
import java.io.File;
/*
* java.io.File
* 将操作系统中的,文件,目录(文件夹),路径,封装成File对象
* 提供方法,操作系统中的内容
* File与系统无关的类
* 文件 file
* 目录 directory
* 路径 path
*/
public class FileDemo {
public static void main(String[] args) {
//File类静态成员变量
//与系统有关的路径分隔符
String separator = File.pathSeparator;
System.out.println(separator);// 是一个分号,目录的分割 Linux :
//与系统有关的默认名称分隔符
separator = File.separator;
System.out.println(separator);// 向右 \ 目录名称分割 Linux /
}
}
静态成员,使用类名直接调用(File.pathSeparator)
1.3 File类的构造函数
File类有4个构造函数,但是只需要掌握以下三个:
1. File(String pathname)
传递路径名: 可以写到文件夹,可以写到一个文件 (c:\\abc c:\\abc\\Demo.java)
功能:将路径封装File类型对象
/*
* File(String pathname)
* 传递路径名: 可以写到文件夹,可以写到一个文件
* c:\\abc c:\\abc\\Demo.java
* 将路径封装File类型对象
*/
public static void function(){
File file = new File("d:\\eclipse");
System.out.println(file); //d:\eclipse
}
}
2. File(String parent,String child)
传递路径,传递字符串父路径,字符串子路径
好处: 单独操作父路径和子路径 ,以后可以使用函数传入参数来执行。
/*
* File(String parent,String child)
* 传递路径,传递字符串父路径,字符串子路径
* 好处: 单独操作父路径和子路径
*/
public static void function_1(){
File file = new File("d:","eclipse");
System.out.println(file);//d:\eclipse
}
3. File(File parent,String child)
传递路径,传递File类型父路径,字符串子路径
好处: 父路径是File类型,父路径可以直接调用File类方法
/*
* File(File parent,String child)
* 传递路径,传递File类型父路径,字符串子路径
* 好处: 父路径是File类型,父路径可以直接调用File类方法
*/
public static void function_2(){
File parent = new File("d:");
File file = new File(parent,"eclipse");
System.out.println(file);//d:\eclipse
}
注意:Window下的目录,文件名不区分大小写。
Linux区分大小写。
Window下写一个反斜线,Java中写两个反斜线(因为Java中有转义)
代码总和:
package day22.demo1;
import java.io.File;
/*
* File类的构造方法
* 三种重载形式
*/
public class FileDemo1 {
public static void main(String[] args) {
function_2();
}
/*
* File(File parent,String child)
* 传递路径,传递File类型父路径,字符串子路径
* 好处: 父路径是File类型,父路径可以直接调用File类方法
*/
public static void function_2(){
File parent = new File("d:");
File file = new File(parent,"eclipse");
System.out.println(file);//d:\eclipse
}
/*
* File(String parent,String child)
* 传递路径,传递字符串父路径,字符串子路径
* 好处: 单独操作父路径和子路径
*/
public static void function_1(){
File file = new File("d:","eclipse");
System.out.println(file);//d:\eclipse
}
/*
* File(String pathname)
* 传递路径名: 可以写到文件夹,可以写到一个文件
* c:\\abc c:\\abc\\Demo.java
* 将路径封装File类型对象
*/
public static void function(){
File file = new File("d:\\eclipse");
System.out.println(file); //d:\eclipse
}
}
1.4 文件和文件夹的创建删除等
package day22.demo1;
import java.io.File;
import java.io.IOException;
/*
* File类的创建和删除功能
* 文件或者是目录
*/
public class FileDemo2 {
public static void main(String[] args)throws IOException {
function();
}
/*
* File类的删除功能
* boolean delete()
* 删除的文件或者是文件夹,在File构造方法中给出
* 删除成功返回true,删除失败返回false
* 删除方法,不走回收站,直接从硬盘中删除
* 删除有风险,运行需谨慎
*/
public static void function_2(){
File file = new File("d:\\a.txt");
boolean b = file.delete();
System.out.println(b);
}
/*
* File创建文件夹功能
* mkdir()只能创建单层文件夹,不推荐使用
* boolean mkdirs() 创建多层文件夹
* 创建的路径也在File构造方法中给出
* 文件夹已经存在了,不在创建
*/
public static void function_1(){
//File file = new File("d:\\abc");
File file = new File("d:\\abc\\b");
boolean b = file.mkdirs();//多层,单层均可创建
System.out.println(b);
}
/*
* File创建文件的功能
* boolean createNewFile()
* 创建的文件路径和文件名,在File构造方法中给出
* 文件已经存在了,不在创建
*/
public static void function()throws IOException{
//File file = new File("d:\\a.txt");
File file = new File("d:\\a"); //创建文件,无后缀默认为记事本文件
boolean b = file.createNewFile();
System.out.println(b);
}
}
package day22.demo1;
import java.io.File;
/*
* File类的判断功能
*/
public class FileDemo4 {
public static void main(String[] args) {
function_1();
}
/*
* File判断功能
* boolean isDirectory()
* 判断File构造方法中封装的路径是不是文件夹
* 如果是文件夹,返回true,不是文件返回false
*
* boolean isFile()
* 判断File构造方法中封装的路径是不是文件
*/
public static void function_1(){
File file = new File("D:\\java");
if(file.exists()){
boolean b = file.isDirectory();
System.out.println(b);
}
}
/*
* File判断功能
* boolean exists()
* 判断File构造方法中封装路径是否存在
* 存在返回true,不存在返回false
*/
public static void function(){
File file = new File("src");
boolean b = file.exists();
System.out.println(b);
}
}
1.5 File类的获取
创建完了File对象之后,那么File类中都有如下常用方法,可以获取文件相关信息
1.String getName()
返回路径中表示的文件或者文件夹名,即获取路径中的最后部分的名字
不管文件或者文件夹是否存在,只负责返回后面一部分的字符串
/*
* File类的获取功能
* String getName()
* 返回路径中表示的文件或者文件夹名,即获取路径中的最后部分的名字
* 不管文件或者文件夹是否存在,只负责返回后面一部分的字符串
*/
public static void function(){
File file = new File("d:\\eclipse\\eclipse.exe");
String name = file.getName();
System.out.println(name);
//getPath()功能:File类型转换为String类型
/*String path = file.getPath();
System.out.println(path);*/
// System.out.println(file);
}
2.long length()
返回路径中表示的文件的字节数。
不能获取文件夹的字节数,只能获取文件的字节数。
/*
* File类获取功能
* long length()
* 返回路径中表示的文件的字节数
* 不能获取文件夹的字节数,只能获取文件的
*/
public static void function_1(){
File file = new File("d:\\eclipse\\eclipse.exe");
long length = file.length();
System.out.println(length);
}
3.获取绝对路径
一般获取返回值都为两套,一套返回值值为String,一套为File,一般用于文件操作,建议使用File。
String getAbsolutePath() ,返回String对象
File getAbsoluteFile() ,返回File对象
获取绝对路径,eclipse环境中,写的是一个相对路径,绝对位置工程根目录
/*
* File类获取功能
* String getAbsolutePath() 返回String对象
* File getAbsoluteFile() 返回File对象
* 获取绝对路径
* eclipse环境中,写的是一个相对路径,绝对位置工程根目录
*/
public static void function_2(){
//File file = new File("src");
File file = new File("abc");//文件不存在,返回的也是D:\Users\Administrator\eclipse-workspace\practice\abc
File absolute = file.getAbsoluteFile();
System.out.println(absolute);//D:\Users\Administrator\eclipse-workspace\practice\src
}
4. 获取父路径
String getParent() 返回String对象
File getParentFile()返回File对象
/*
* File类的获取功能
* String getParent() 返回String对象
* File getParentFile()返回File对象
* 获取父路径
*
*/
public static void function_3(){
File file = new File("d:\\eclipse\\eclipse.exe");
//File parent = file.getParentFile().getParentFile();//d:\
File parent = file.getParentFile().getParentFile().getParentFile(); //null
System.out.println(parent);
}
代码总和:
package day22.demo1;
import java.io.File;
/*
* File类的获取功能
*/
public class FileDemo3 {
public static void main(String[] args) {
function_2();
}
/*
* File类的获取功能
* String getParent() 返回String对象
* File getParentFile()返回File对象
* 获取父路径
*
*/
public static void function_3(){
File file = new File("d:\\eclipse\\eclipse.exe");
//File parent = file.getParentFile().getParentFile();//d:\
File parent = file.getParentFile().getParentFile().getParentFile(); //null
System.out.println(parent);
}
/*
* File类获取功能
* String getAbsolutePath() 返回String对象
* File getAbsoluteFile() 返回File对象
* 获取绝对路径
* eclipse环境中,写的是一个相对路径,绝对位置工程根目录
*/
public static void function_2(){
//File file = new File("src");
File file = new File("abc");//文件不存在,返回的也是D:\Users\Administrator\eclipse-workspace\practice\abc
File absolute = file.getAbsoluteFile();
System.out.println(absolute);//D:\Users\Administrator\eclipse-workspace\practice\src
}
/*
* File类获取功能
* long length()
* 返回路径中表示的文件的字节数
* 不能获取文件夹的字节数,只能获取文件的
*/
public static void function_1(){
File file = new File("d:\\eclipse\\eclipse.exe");
long length = file.length();
System.out.println(length);
}
/*
* File类的获取功能
* String getName()
* 返回路径中表示的文件或者文件夹名,即获取路径中的最后部分的名字
* 不管文件或者文件夹是否存在,只负责返回后面一部分的字符串
*/
public static void function(){
File file = new File("d:\\eclipse\\eclipse.exe");
String name = file.getName();
System.out.println(name);
//getPath()功能:File类型转换为String类型
/*String path = file.getPath();
System.out.println(path);*/
// System.out.println(file);
}
}
1.6 listFiles()方法介绍
获取一个目录中的所有文件或者目录中的文件夹,推荐使用listFiles()方法,返回的是绝对路径。
1.String[] list()
获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
返回只有名字
/*
* File类的获取功能
* String[] list()
* 获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
* 返回只有名字
*/
public static void function(){
File file = new File("c:");
String[] strArr = file.list();
System.out.println(strArr.length);//21
for(String str : strArr){
System.out.println(str);//$360Section $RECYCLE.BIN 360SANDBOX...
}
}
2. File[] listFiles()
获取到File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
返回的是目录或者文件的全路径
/*
* File类的获取功能
* File[] listFiles()
* 获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)
* 返回的是目录或者文件的全路径
*/
public static void function_1(){
File file = new File("D:\\java");
File[] fileArr = file.listFiles();
for(File f : fileArr){
System.out.println(f);//D:\java\bin...
}
}
3. File.listRoots()
获取系统中的所有根目录
public static void function_2(){
//获取系统中的所有根目录
File[] fileArr = File.listRoots();
for(File f : fileArr){
System.out.print(f+" "); //C:\ D:\ E:\ F:\
}
System.out.println();
}
注意:在获取指定目录下的文件或者文件夹时必须满足下面两个条件
1. 指定的目录必须是存在的,
2. 指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException
1.7 文件过滤器
如果我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹如何操作呢?
File类中重载的listFiles方法,并且接受指定的过滤器。
listFiles()遍历目录的同时,获取到了文件名的全路径,调用自定义过滤器中重写的抽象方法accept(pathname),如果accept()返回值为true时,才将此pathname加入Files数组中。
当我们需要过滤文件名称时就可以使用FilenameFilter这个过滤器,当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter ,比如需要当前目录下的所有文件夹,就可以使用FileFilter 过滤器。
自定义过滤器:
package day22.demo1;
import java.io.File;
import java.io.FileFilter;
/*
* 自定义过滤器
* 实现FileFilter接口,重写抽象方法
*/
public class MyFilter implements FileFilter{
public boolean accept(File pathname) {
System.out.println(pathname+"#######");
/*
* pathname 接受到的也是文件的全路径
* d:\\demo\\a.txt
* 对路径进行判断,如果是java文件,返回true,不是java文件,返回false
* 文件的后缀结尾是.java
*/
String name = pathname.getName();
return name.endsWith(".java");//以.java结尾的文件
}
}
测试类:
package day22.demo1;
import java.io.File;
/*
* File类的获取,文件获取过滤器
* 遍历目录的时候,可以根据需要,只获取满足条件的文件
* 遍历目录方法 listFiles()重载形式
* listFiles(FileFilter filter)接口类型
* 传递FileFilter接口的实现类
* 自定义FileFilter接口实现类,重写抽象方法accept,
* 接口实现类对象传递到遍历方法listFiles
*/
public class FileDemo6 {
public static void main(String[] args) {
File file = new File("d:\\demo");
//MyFilter()返回值为true时,才将此文件存入数组中
File[] fileArr = file.listFiles(new MyFilter());
for(File f : fileArr){
System.out.println(f);
}
}
}
运行结果:
第二章 递归
2.1 概念
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
/*
* 方法的递归调用
* 方法自己调用自己
* 适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化
* 注意:
* 递归一定要有出口, 必须可以让程序停下
* 递归次数不能过多
* 构造方法,禁止递归
*/
public class DiGuiDemo {
public static void main(String[] args) {
/*int sum = getSum(3);
System.out.println(sum);*/
System.out.println(getJieCheng(5));
System.out.println(getFBNQ(12));
}
/*
* 方法递归,计算斐波那契数列
*
*/
public static int getFBNQ(int month){
if( month == 1)
return 1;
if( month == 2)
return 1;
return getFBNQ(month-1)+getFBNQ(month-2);
}
/*
* 计算阶乘 5!
* 5*4*3*2*1
*/
public static int getJieCheng(int n){
if ( n == 1)
return 1;
return n * getJieCheng(n-1);
}
/*
* 计算 1+2+3+100和 = 5050
* 计算规律:
* n+(n-1)+(n-2)
* 100+(100-1)+(99-1)+...1
*/
public static int getSum(int n){
if( n == 1)
return 1;
return n + getSum(n-1);
}
}
2.2 递归打印所有子目录中的文件路径
编写一个方法用来打印指定目录中的文件路径,并进行方法的调用
要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来
步骤:
1. 指定要打印的目录File对象
2. 调用getFileAll()方法
2.1 获取指定目录中的所有File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
代码演示:
import java.io.File;
/*
* 对一个目录的下的所有内容,进行完全的遍历
* 编程技巧,方法的递归调用,自己调用自己
*/
public class FileDemo {
public static void main(String[] args) {
File dir = new File("d:\\eclipse");
getAllDir(dir);
}
/*
* 定义方法,实现目录的全遍历
*/
public static void getAllDir(File dir){
System.out.println(dir);
//调用方法listFiles()对目录,dir进行遍历
File[] fileArr = dir.listFiles();
for(File f : fileArr){
//判断变量f表示的路径是不是文件夹
if(f.isDirectory()){
//是一个目录,就要去遍历这个目录
//本方法,getAllDir,就是给个目录去遍历
//继续调用getAllDir,传递他目录
getAllDir(f);
}else{
System.out.println(f);
}
}
}
}
2.3 搜索指定目录中的.java文件(含子目录)
需求:打印指定目录即所有子目录中的.java文件的文件路径
要求:编写一个方法用来打印指定目录中的.java文件路径,并进行方法的调用
若指定的目录有子目录,那么把子目录中的.java文件路径也打印出来
步骤:
1. 指定要打印的目录File对象
2. 调用getFileAll()方法,传入要打印的目录File对象
2.1 通过FilenameFilter过滤器获取指定目录中的所有.java类型的File对象
2.2 遍历得到每一个File对象
2.3 判断当前File 对象是否是目录
判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
判断结果为false,说明是文件,打印文件的路径
import java.io.File;
/*
* 遍历目录,获取目录下的所有.java文件
* 遍历多级目录,方法递归实现
* 遍历的过程中,使用过滤器
*/
public class FileDemo1 {
public static void main(String[] args) {
getAllJava(new File("c:\\demo"));
// new File("c:\\demo").delete();
}
/*
* 定义方法,实现遍历指定目录
* 获取目录中所有的.java文件
*/
public static void getAllJava(File dir){
//调用File对象方法listFiles()获取,加入过滤器
File[] fileArr = dir.listFiles(new MyJavaFilter());
for(File f : fileArr){
//对f路径,判断是不是文件夹
if(f.isDirectory()){
//递归进入文件夹遍历
getAllJava(f);
}else{
System.out.println(f);
}
}
}
}
过滤器:
import java.io.File;
import java.io.FileFilter;
public class MyJavaFilter implements FileFilter {
public boolean accept(File pathname) {
//判断获取的是目录,直接返回true
if(pathname.isDirectory())
return true;
return pathname.getName().toLowerCase().endsWith(".java");//endsWith不区分大小写,需要先转为小写再判断
}
}
第三章 总结
递归: 方法定义中调用方法本身的现象
直接递归
public void methodA(){
methodA();
}
间接递归
public void metohdB(){
methodC();
}
public void methodC(){
methodB();
}
递归注意实现
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
File: 文件和目录路径名的抽象表示形式
构造方法:
public File(String pathname) 通过给定的文件或文件夹的路径,来创建对应的File对象
public File(String parent, String child) 通过给定的父文件夹路径,与给定的文件名称或目录名称来创建对应的File对象
public File(File parent, String child)通过给定的File对象的目录路径,与给定的文件夹名称或文件名称来创建对应的File对象
路径的分类:
-绝对路径, 带盘盘符
E:\Workspace\day20_File\abc.txt
-相对路径, 不带盘符
day20_File\abc.txt
注意: 当指定一个文件路径的时候,如果采用的是相对路径,默认的目录为 项目的根目录
方法
- public boolean createNewFile()创建文件
返回值为true, 说明创建文件成功;返回值为false,说明文件已存在,创建文件失败
- public boolean mkdir() 创建单层文件夹
创建文件夹成功,返回 true;创建文件夹失败,返回 false
- public boolean mkdirs() 创建多层文件夹
- public boolean delete() 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除
- public boolean isDirectory() 判断是否为文件夹
- public boolean isFile() 判断是否为文件
- public boolean exists() 判断File对象对应的文件或文件夹是否存在
- public String getAbsolutePath() 获取当前File的绝对路径
- public String getName() 获取当前File对象的文件或文件夹名称
- public long length() 获取当前File对象的文件或文件夹的大小(字节)
- public File[] listFiles() 获取File所代表目录中所有文件或文件夹的绝对路径