Java中用File类来抽象的表示硬盘上的各种文件,File是文件和目录(文件夹)路径名的抽象表现形式
File类的构造方法:
- File(String pathname)
- File(String parent,String child)
- File(File parent,String child)
import java.io.File;
public class Demo1 {
public static void main(String[] args) {
//public File(String pathname)
//将文件路径D:\java\a.txt封装成一个File对象
File file1 = new File("D:\\java\\a.txt");
System.out.println(file1); //D:\java\a.txt
//public File(String parent,String child)
//根据一个目录和一个子文件或目录得到一个File对象
File file2 = new File("D:\\java","a.txt");
System.out.println(file2); //D:\java\a.txt
//public File(File parent,String child)
//根据一个父的File对象和一个子文件或目录得到一个File对象
File file3 = new File("D:\\java"); //父的File对象
File file4 = new File(file3,"Demo"); //子的目录
System.out.println(file4); //D:\java\Demo
}
}
File类的创造功能
public boolean createNewFile()
public boolean mkdir()
public boolean mkdirs()
public class Demo2 {
public static void main(String[] args) {
//createNewFile()创建一个新的文件
//如果要创建的文件已经存在,那么既不会创建也不会报错
//如果要创建的文件所在的目录不存在则会报错
File file1 = new File("D:\\java\\b.txt");
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package review.FileDemo;
import java.io.File;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) {
//mkdir()在指定目录下创建文件夹
//比如在D:\java目录下创建文件夹demo1
File file2 = new File("D:\\java\\demo1");
//要创建的文件夹已经存在时不会创建
//前置目录不存在或者错误时不会创建
//创建成功返回true,创建失败或没有创建则返回false
System.out.println(file2.mkdir());
//mkdirs()创建多级文件夹
File file3 = new File("D:\\java\\test1\\test2\\test3");
//创建成功返回true,创建失败返回false
System.out.println(file3.mkdirs());
}
}
注意:
package review.FileDemo;
import java.io.File;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) {
//注意分辨创建的是文件还是文件夹
//创建文件的时候需要跟上后缀名
//如果创建文件时加上后缀名,后缀名部分会被认为是文件夹名字的一部分
File file4 = new File("D:\\java\\test1.txt");
try {
System.out.println(file4.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
File file5 = new File("D:\\java\\test2.txt");
System.out.println(file5.mkdir());
}
}
结果是分别创建了一个叫 test1.txt 文件和一个叫 test2.txt 的文件夹
需要注意的是,win10中,文件夹与文件不能同名
删除功能
public boolean delete()
package review.FileDemo;
import java.io.File;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) {
//一、删除文件
File file1 = new File("D:\\java\\test1.txt");
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//删除成功返回true,删除失败返回false
System.out.println(file1.delete()); //true
//二、删除文件夹
File file2 = new File("D:\\java\\test1\\test2");
file2.mkdirs();
//只有文件夹中为空时才能删除文件夹
File test1 = new File("D:\\java\\test1");
System.out.println(test1.delete()); //false,删除失败因为test1文件夹不为空
File test2 = new File("D:\\java\\test2");
System.out.println(test2.delete()); //false,删除失败因为路径不存在
File test3 = new File("D:\\java\\test1\\test2");
System.out.println(test3.delete()); //true,删除成功
}
}
重命名功能:
public boolean renameTo(File dest)
import java.io.File;
public class Demo4 {
public static void main(String[] args) {
//renameTo将file1对象的名字改为file2的对象名
File file1 = new File("D:\\java\\a.txt");
File file2 = new File("D:\\java\\b.txt");
//修改成功返回true,失败为false
file1.renameTo(file2);
}
}
判断功能
public boolean isDirectory()
public boolean isFile()
public boolean exists()
public boolean canRead()
public boolean canWrite()
public boolean isHidden()
package review.FileDemo;
import java.io.File;
public class Demo5 {
public static void main(String[] args) {
File file1 = new File("D:\\java\\a.txt");
//判断是不是文件夹
System.out.println(file1.isDirectory()); //false
//判断是不是文件
System.out.println(file1.isFile()); //true
//判断文件是否存在
System.out.println(file1.exists()); //true
//判断是否可读
System.out.println(file1.canRead()); //true
//判断是否可写
System.out.println(file1.canWrite()); //true
//判断是否隐藏
System.out.println(file1.isHidden()); //false
//当file1不存在时,上面全是false
}
}
获取功能一
public String getAbsolutePath()
public String getPath()
public String getName()
public long length()
public long lastModified()
package review.FileDemo;
import java.io.File;
import java.io.IOException;
public class Demo6 {
public static void main(String[] args) {
//在idea的当前项目的src文件夹中创建test.txt文件
File file = new File("src\\test.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//getAbsolutePath() 获取绝对路径,也就是获取完整路径
System.out.println(file.getAbsolutePath()); //F:\idea2018.1\workplace\Demo\src\test.txt
//getPath() 获取相对路径
System.out.println(file.getPath()); //src\test.txt
//getName() 获取文件名称
System.out.println(file.getName()); //test.txt
//long length() 获取文件的字节大小
System.out.println(file.length()); //0
//long lastModified() 指定文件最后一次被修改的时间戳
System.out.println(file.lastModified()); //1634645504934
}
}
获取功能二
public String[] list()
public File[] listFiles()
package review.FileDemo;
import java.io.File;
public class Demo7 {
public static void main(String[] args) {
File file = new File("D:\\java\\Demo\\file1");
//String[] --- list()
//获取指定目录下的所有文件和文件夹的名称,并将所有名称放入String类型数组
String[] list = file.list();
for(String s : list){
System.out.println(s);
}
System.out.println("----------------");
//File[] --- listFiles()
//将指定目录下的所有文件和文件夹都放入File类型数组
File[] files = file.listFiles();
for(File file1 : files){
System.out.println(file1.getName());
}
}
}
例子
判断file1文件夹下面有没有以JPG为后缀名结尾的文件,如果有则打印出来
方法一、遍历File数组
package review.FileDemo;
import java.io.File;
public class Demo8 {
public static void main(String[] args) {
File file = new File("D:\\java\\Demo\\file1");
File[] files = file.listFiles();
for(File file1 : files){
if(file1.isFile()){
if(file1.getName().endsWith(".JPG")){
System.out.println(file1.getName());
}
}
}
}
}
方法二、文件名称过滤器
package review.FileDemo;
import java.io.File;
import java.io.FilenameFilter;
public class Demo8 {
public static void main(String[] args) {
File f = new File("D:\\java\\Demo\\file1");
//方法二
//获取file1目录下所有的文件和文件夹名称,并放入String类型数组中
//将每一个对象名称,按照FilenameFilter判断的结果决定是否加入数组
String[] list = f.list(new FilenameFilter() {
@Override
//这里是一个boolean类型的判断方法,返回true则将文件或文件夹名称加入数组,否则不添加
public boolean accept(File dir, String name) {
File file1 = new File(dir,name);
//两个判断条件,当前File对象是一个文件,并且后缀名为.JPG
boolean b1 = file1.isFile();
boolean b2 = file1.getName().endsWith(".JPG");
return b1 && b2;
}
});
for(String s : list){
System.out.println(s);
}
}
}
结果跟方法一结果相同
这里是list的源码,首先this.list()也就是用一开始的File对象 f.list(),生成当前目录的所有文件和文件夹名字放入String names[]数组中
实现接口的具体方法public boolean accept(File dir, String name)的参数列表中
File dir就是this,也就是 File f 对应的文件目录
String name 就是names[ i ] 也就是当前放入accept方法里面进行筛选判断的文件对象,如果返回true则将此对象放入数组中
list()方法最后返回的是一个数组
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}