目录
3.2. File(String parent,String child)
3.3.File(File parent,String child)
File类的使用详解
1.什么是File类,能实现哪些功能?
File
- java.io.File类:文件和目录路径名的抽象表示形式。
- java把电脑中的文件和文件夹(目录)封装为了一个File类,可以使用File类对文件(夹)操作
- File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
功能
- 1.创建一个文件/文件夹
- 2.删除文件/文件夹
- 3.获取文件/文件夹
- 4.判断文件/文件夹是否存在
- 5.对文件夹进行遍历
- 6.获取文件的大小
注意
* file:文件
* directory:文件夹/目录
* path:路径
2.File类静态成员变量_分隔符
- File类的静态成员变量 :路径分隔符、文件分隔符
static String pathSeparator:与系统有关的路径分隔符,为方便,它被表示为字符串
static char pathSeparatorChar:与系统有关的路径分隔符
static String separator:与系统有关的默认分隔符,为方便,它被表示为一个字符串
static char separatorChar:与系统有关的默认分隔符
- 操作路径时:路径不能写死了,因为系统不同,路径、文件分隔符也不同。
C:\develop\a\a.txt windows系统下文件名称分隔符为反斜杠\
C:/develop/a/a.txt Linux系统下文件名称分隔符为正斜杠/
- 上面路径通过File类静态成员变量_分隔符写法如下:
"C:"+File.separator+"develop"+File.separator+"a"+File.separator+"a.txt"
- Demo
import java.io.File;
public class Demo01File {
public static void main(String[] args) {
String ps= File.pathSeparator;
System.out.println(ps);//输出路径分隔符与系统有关,windows为分号,linux为冒号
String s=File.separator;
System.out.println(s);//文件分隔符,windows下为反斜杠\,Linux下为正斜杠/
}
}
3.File三种构造创建File对象
- 学习类,首先要学习该类中的静态成员,因为可以通过类名调用,然后学习构造方法,这样就可以创建对象,进而学习成员方法,对象调用之。
3.1.File(String pathname)
File(String pathname):通过给定路径名字符串转换为抽象路径名来创建一个新File实例
参数:
- String pathname:字符串形式的路径名称
- 路径可以以文件结尾,也可以以文件夹结尾
- 路径可以是相对路径,也可以是绝对路径
- 路径可以是存在的,也可以是不存在的
- 创建File对象,只是把字符串路径封装为File对象,不考虑路径真假情况
Demo
package demo22IO;
import java.io.File;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("E://1.txt");//创建File对象(将路径封装)
boolean flag = file.createNewFile(); //对象调用createNewFile创建文件
System.out.println(flag?"1.txt文件创建成功":"1.txt文件创建失败");
System.out.println("文件路径为:"+file);
File dir = new File("E://File1");//创建File对象
boolean flag1 = dir.mkdir();//对象调用mkdir创建文件夹
System.out.println(flag1?"File1文件夹创建成功":"File1文件夹创建失败");
System.out.println("文件路径为:"+file);
}
}
3.2. File(String parent,String child)
3.3.File(File parent,String child)
File(String parent,String child)构造方法: 根据parent路径名和child路径名创建一个新File对象
File(File parent,String child)
参数:把路径分成两个部分
- String parent:父路径
- String child:子路径
好处: 父路径和子路径,可以单独书写,使用起来非常灵活;父子路径都可以变化
package demo22IO;
import java.io.File;
import java.io.IOException;
/**
* File构造方法二、三
* File(String parent,String child)构造: 根据parent路径名和child路径名创建一个新File对象
* File(File parent,String child)
* 即在parent路径下创建文件(夹)child
*/
public class Demo2 {
public static void main(String[] args) throws IOException {
File file = new File("E://");//封装路径
//在E盘下创建文件夹haha
File file1 = new File(file, "haha");//封装路径
boolean flag = file1.mkdir(); //根据路径创建文件夹
System.out.println(flag?"创建成功":"创建失败");
System.out.println("haha文件路径是:"+file1);
//在E盘下创建文件haha.txt
File file2 = new File("E://", "haha.txt");
boolean flag2 = file2.createNewFile();
System.out.println(flag2?"创建成功":"创建失败");
System.out.println("haha.txt文件路径是:"+file2);
}
}
4.File中关于获取的方法
File类的关于获取功能的方法:
-public String getAbsolutePath():获取此File的绝对路径名字符串
-public String getPath():将此File转化为字符串路径即参数传递的路径是什么样就获取什么样
-public String getName():获取由此File表示的文件或目录的名称(即文件/文件夹名称)
-public long Length():获取由此File表示的文件长度(大小,字节为单位),不能获取文件夹大小
- 文件夹是没有大小概念的,不能获取文件夹的大小,只能获取文件大小
- 如果构造方法中给出的路径不存在,那么length方法返回0
package demo22IO;
import java.io.File;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) throws IOException {
File f1 = new File("E://hello");//封装路径并未创建该文件夹
System.out.println(f1.getAbsolutePath());//获取f1绝对路径E:\hello
File f2 = new File("hello.txt");//参数使用相对路径
//获取f2绝对路径F:\新职课\代码\xinzhike\hello.txt
System.out.println(f2.getAbsolutePath());
System.out.println(f2.getPath());//hello.txt
File f3 = new File("E://hehe");
File f4 = new File("E://hehe.txt");
System.out.println("文件夹名称是:"+f3.getName());//hehe
System.out.println("文件名称是:"+f4.getName());//hehe.txt
File f5 = new File("E://haha.txt");//封装路径
long len = f5.length();
System.out.println("haha.txt文件大小:"+len);//路径不存在大小0
}
}
5.File中关于创建/删除的方法
File类创建删除功能的方法:
-public boolean createNewFile():创建一个新文件(文件名称要唯一)
-public boolean delete():删除由此File表示的文件或目录(文件夹)
-public boolean mkdir():创建由此File表示的目录(文件夹)
-public boolean mkdirs():创建由此File表示的目录(多级同时创建),
使用相对路径,在"File类与IO流"项目直接下级创建多级文件夹222//333//444
File f2 = new File("File类与IO流//222//333//444");
boolean m2 = f2.mkdirs();
文件删除
f2.delete();
6.File中关于判断功能
File类中判断功能的方法:
-public boolean exists():判断此File(对象)表示的文件或目录是否实际存在
-public boolean isDirectory():判断此File表示的是否为目录(即文件夹)
-public boolean isFile():判断此File表示的是否为文件
package demo22IO;
import java.io.File;
import java.io.IOException;
public class Demo3a {
public static void main(String[] args) throws IOException {
File f1 = new File("E://nihao");//封装路径,不存在的路径
File f2 = new File("E://nihao.txt");
System.out.println("f1表示的文件夹是否存在:"+f1.exists());
System.out.println("f2表示的文件夹是否存在:"+f2.exists());
System.out.println("======================");
boolean flag = f1.mkdir();//创建文件夹nihao
boolean flag1 = f2.createNewFile();//创建文件nihao.txt
System.out.println("f1表示的文件夹是否存在:"+f1.exists());
System.out.println("f2表示的文件夹是否存在:"+f2.exists());
System.out.println("f1是否表示文件夹:"+f1.isDirectory());
System.out.println("f2是否表示文件:"+f2.isFile());
}
}
7.renameTo文件重命名到(算是命名+复制功效)
- file1.renameTo(file2):将file1文件以file2名字命名并移动到file2路径中。
8.文件遍历_指定文件搜索
File类遍历目录的方法
-public String[] list()
- 返回一个String类型数组,表示该File目录中那一层的所有的子文件和子文件夹
- 以字符串形式存储到String数组中,取出时是各个文件/文件夹的名称(非路径)
-public File[] listFiles():
- 返回一个File类型数组,表示该File目录下子文件或文件夹(目录)
- 被封装为一个个File对象存储到File类型的数组中。
- 从File数组中遍历输出的是被封装在File对象中的各个文件路径
指定文件搜索步骤:
- 1.使用递归进行多级遍历,当遍历到文件时,判断是否是.ppt后缀
- 2.将File类型的路径(即File对象)转换为字符串形式有三种方式:
- Strin name=f.getName():--获取路径f的末尾文件abc.ppt
- String path=f.getPath();--(原样)获取路径f即c:\\abc\\abc.ppt
- String s=f.toString();--同上,因为重写的toString方法中就是getPath()
- 3.判断后缀为.ppt文件方法:
- 调用String类中方法endsWith判断字符串结尾是否是.ppt
- boolean b=s.endsWith(".ppt");
package demo22IO;
import java.io.File;
/**
* 文件遍历
*/
public class Demo3aaa {
public static void main(String[] args) {
File f = new File("F:\\班级表格");//封装路径
File[] files = f.listFiles();//获取该路径下所有文件/文件夹存入数组
listFiles(files);
}
/**
* 定义一个遍历文件的方法
* @param files
*/
private static void listFiles(File[] files) {
if(files!=null&&files.length>0){ //首先文件数组存在且要有文件/夹
for (File f:files) { //遍历判断是文件还是文件夹
if (f.isFile()){ //是文件
if (f.getName().endsWith(".ppt")){//若文件后缀java且<10M则打印路径
if (f.length()<10*1024*1024){ //1B-1KB-1MB
System.out.println("找到一个.ppt文件:"+f.getAbsolutePath());
}
}
}else {//是文件夹
File[] files1 = f.listFiles();//再获取该文件夹下所有文件/文件夹
listFiles(files1);//递归
}
}
}
}
}
9.文件过滤器FileFilter_完成指定文件搜索
FileFilter过滤器原理
- 1.listFiles方法会对构造方法中传递的目录进行遍历,遍历的文件/文件夹封装为File对象
- 2.listFiles方法调用参数传递的过滤器中的accept方法
- 3.listFiles方法会把遍历得到的每一个File对象,传递给accept方法的参数pathname
- 4.accept方法中设置过滤规则,判断传过来的File对象是否以.ppt结尾,返回布尔值
- true:就会把传递过去的File对象保存到File数组中
- false:就不会把传递过去的File对象保存到File数组中
package demo22IO;
import java.io.File;
import java.io.FileFilter;
//文件过滤器接口
public class PDFFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {//定义过滤规则
//若文件后缀.pdf或者是文件夹则返回true表示保留在文件数组中
if (pathname.getName().endsWith(".ppt")||pathname.isDirectory()){
return true;
}
return false;
}
}
package demo22IO;
import java.io.File;
/**
* 搜索指定文件_使用文件过滤器FileFilter
* 1.需要实现过滤器接口,并重写方法定义过滤规则
*/
public class Demo3b {
public static void main(String[] args) {
File f = new File("F:\\班级表格");//封装路径
getFiles(f);
}
private static void getFiles(File file) { //过滤文件方法
//1.创建一个过滤器并描述规则
PDFFileFilter filter = new PDFFileFilter();
//2.通过文件file获取过滤后的子文件/夹,并判空
File[] files = file.listFiles(filter);
if (files != null && files.length > 0) {
//3.遍历文件数组
for (File f : files) {
if (f.isDirectory()) { //如果是文件夹,则递归继续处理这个文件夹
getFiles(f);
} else { //是文件,过滤后保留在数组的文件一定pdf
System.out.println("发现一个ppt:" + f.getAbsolutePath());
}
}
}
}
}
使用匿名内部类简化过滤器接口实现
package demo22IO;
import java.io.File;
import java.io.FileFilter;
/**
* 匿名内部类简化过滤器接口实现
* 将实现过滤器接口的PDFFieFilter类删除
*/
public class Demo3bb {
public static void main(String[] args) {
File f = new File("F:\\班级表格");//封装路径
getFiles(f);
getFiles1(f);
}
/**
* 使用匿名内部类简化接口实现
* @param file
*/
private static void getFiles(File file) { //过滤文件方法
//1.创建一个过滤器并描述规则
FileFilter filter = new FileFilter(){
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".ppt")||pathname.isDirectory()){
return true;
}
return false;
}
};
//2.通过文件file获取过滤后的子文件/夹存入数组,并判空
File[] files = file.listFiles(filter);
if (files != null && files.length > 0) {
//3.遍历文件数组
for (File f : files) {
if (f.isDirectory()) { //如果是文件夹,则递归继续处理这个文件夹
getFiles(f);
} else { //是文件,过滤后保留在数组的文件一定pdf
System.out.println("发现一个ppt:" + f.getAbsolutePath());
}
}
}
}
/**
* 2.将匿名内部类直接放在使用的地方,开发中常用
* @param file
*/
private static void getFiles1(File file) { //过滤文件方法
//通过文件file获取过滤后的子文件/夹存入数组,并判空。
//listFiles()遍历,参数传递文件过滤器接口的实现
File[] files = file.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".ppt") || pathname.isDirectory()) {
return true;
}
return false;
}
});
if (files != null && files.length > 0) {
//3.遍历文件数组
for (File f : files) {
if (f.isDirectory()) { //如果是文件夹,则递归继续处理这个文件夹
getFiles(f);
} else { //是文件,过滤后保留在数组的文件一定pdf
System.out.println("发现一个ppt:" + f.getAbsolutePath());
}
}
}
}
/**
*3.Lambda表达式进一步简化
* @param file
*/
private static void getFiles2(File file) { //过滤文件方法
//通过文件file获取过滤后的子文件/夹存入数组,并判空。
//listFiles()遍历,参数传递文件过滤器接口的实现
File[] files = file.listFiles((pathname)->{
if (pathname.getName().endsWith(".ppt") || pathname.isDirectory()) {
return true;
}
return false;
});
if (files != null && files.length > 0) {
//3.遍历文件数组
for (File f : files) {
if (f.isDirectory()) { //如果是文件夹,则递归继续处理这个文件夹
getFiles(f);
} else { //是文件,过滤后保留在数组的文件一定pdf
System.out.println("发现一个ppt:" + f.getAbsolutePath());
}
}
}
}
}
10.相对路径/绝对路径
package demo22IO;
import java.io.File;
public class Demo5 {
public static void main(String[] args) {
//相对路径:以盘符开始 例如c://a.txt
//绝对路径:java中是相对于项目目录路径 例如 a.txt
File file1 = new File("c://a.txt");
File file2 = new File("a.txt");
System.out.println("File1的路径"+file1.getAbsolutePath());
System.out.println("File2的路径"+file2.getAbsolutePath());
}
}