IO流之File类
IO即InputStream和OutputStream。
Java语言中提供的众多的对计算机硬盘上的文件进行操作的类
概述
1、Java.io包中的类。
2、在程序中需要对硬盘中的文件进行操作,需要在程序中表示一个文件。
3、一个File类的对象可以表示计算机中的一个文件或目录(文件夹)。
4、File对象可以对文件或目录的属性进行操作。
5、通过File类对象可以获取其所表示的文件的相关信息。
6、File类对象不能对文件中的内容进行读写操作。
File类的构造方法
1、File f = new File(“String s”);直接将文件路径以字符串形式添加进去。
2、File f = new File(“String s1”,“String s2”);将文件父级路径以字符串形式写在s1,文件名放在以字符串形式放在s2处。
3、File f = new File(parent,“String s”);将文件父级路径放在File对象当中,在parent处传入对象,文件名以字符串形式放在s处。
注意:File类的构造方法是在当前目录下创建一个与指定文件名相关联的文件对象,指明详细的路径和文件名,一定要注意使用" \ \ “或” / ",因为在Java中 " \ "是有特殊含义的。所谓绝对路径就是完整的写明文件路径,相对路径就是只有文件名。
File类的常用方法
返回值 | 方法名 | 功能描述 |
---|---|---|
boolean | canRead() | 判断文件是否可以读取 |
boolean | canWrite() | 判断文件是否可以写入 |
boolean | equals() | 判断文件路径是否一致 |
boolean | exists() | 判断文件是否存在 |
boolean | isAbsolute() | 判断给定的文件名是否为绝对路径 |
boolean | isDirectory() | 判断是否为文件夹 |
boolean | isFile() | 判断是否为文件 |
boolean | delete() | 删除文件或文件夹(必须为空文件夹),成功返回true,失败返回false |
boolean | createNewFile() | 创建一个新文件,存在就不创建,需要处理异常IOException |
boolean | mkdir() | 只能创建单级文件,存在就不创建,如G : \ \demo |
boolean | mkdirs() | 可以创建多级文件。如G:\ \ demo\ \demo |
String | getAbsolutePath() | 获取文件的绝对路径 |
String | getName() | 获取文件名 |
String | getPath() | 获取文件路径 |
String | getParent() | 获取文件父级目录 |
long | lastModified() | 最后一次修改文件的时间 |
long | length() | 获取字节数量 |
String[ ] | list() | 返回所有指定文件夹下的文件和文件夹名字作为字符串数组 |
File[ ] | listFiles() | 返回所有指定文件夹下的文件和文件夹名字作为File对象数组 |
boolean | renameTo() | 为文件重命名 |
代码示例:
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
public class FilePractice1 {
public static void main(String[] args) {
//构造方法1
File f = new File("G:\\test.txt");
//构造方法2
File f1 = new File("G:\\","test.txt");
//构造方法3
File f2 = new File("G:/");
File f3 = new File(f2,"test.txt");
//判断文件是否可以读入
System.out.println(f.canRead());
//判断文件是否可以写入
System.out.println(f.canWrite());
//判断文件路径是否一致
System.out.println(f.equals(f1));
//判断文件是否存在
System.out.println(new File("G:\\demo.txt"));
//判断给定文件名是否为绝对路径
System.out.println(f.isAbsolute());
//判断是否为文件夹
System.out.println(f.isDirectory());
//判断是否为文件
System.out.println(f.isFile());
//创建一个新文件,存在就不创建,需要处理异常
try {
new File("G:\\t.md").createNewFile();
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件路径不正确!");
}
//创建单级文件
new File("G:\\num").mkdir();
//创建多级文件
new File("G:\\num\\num").mkdirs();
//获取文件绝对路径
System.out.println(f.getAbsolutePath());
//获取文件名
System.out.println(f.getName());
//获取文件路径
System.out.println(f.getPath());
//获取父级目录
System.out.println(new File("G:\\num").getParent());
//最后一次修改时间---秒
System.out.println(f.lastModified());
//获取字节数量
System.out.println(f.length());
//返回指定文件夹下文件和文件夹为字符串数组
String [] str = f2.list();
System.out.println(Arrays.toString(str));
//返回指定文件夹下文件和文件夹为File对象数组
File [] files = f2.listFiles();
System.out.println(Arrays.toString(files));
//为文件重命名
System.out.println(f.renameTo(new File("hello.txt")));
}
}
File类的使用
日期格式转换
我们通过lastModified()获得的文件最后一次修改时间是一个long型的数字,跟我们所要看懂的时间完全不同,因此这里我们需要通过日期的格式转换将时间转换为人们能懂的形式,详细的日期转换可以看一看这篇博客link
代码示例
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FilePractice2 {
public static void main(String[] args) {
File file = new File("G:\\text.txt");
long l = file.lastModified();
System.out.println(l);//1606495736813
Date date = new Date(l);
SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str = sdf.format(date);
System.out.println(str);//2020年11月28日 00:48:56
}
}
按需求获取文件名
我们通过list()或者listFile()获得的文件目录下的文件名是指定文件目录下的所有文件,但是有时我们只是需要指定目录下的一部分指定类型的文件,比如我只需要txt文件,这时File类提供的方法就不能够满足我们的需要了,因此我们需要自己设计按需返回。
介绍一个接口FilenameFilter , 这个接口的目的就是筛选文件类型,其内部的方法就只有accept(File dir, String name),当返回为true时就满足筛选条件,为false就不满足, 这是list()用的.
代码示例—list()返回String[]
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class FilePractice3 {
public static void main(String[] args) {
File file = new File("G:\\Demo2");
String[] str = file.list();
System.out.println("G:\\Demo2下的所有文件为"+Arrays.toString(str));
// G:\Demo2下的所有文件为
// [Demo.md, Demo1, Demo3, test - 副本 (2).txt, test - 副本 (3).txt,
// test - 副本 (4).txt, test - 副本.txt, test.txt]
String[] str1 = file.list(new FilenameFilter() {//通过匿名内部类实现筛选txt
@Override
public boolean accept(File dir, String name) {
return (name.substring(name.lastIndexOf(".")+1)).equals("txt");
}
});
for (String s:str1) {
System.out.print(s+"\t");
}
// test - 副本 (2).txt test - 副本 (3).txt
// test - 副本 (4).txt test - 副本.txt test.txt
}
}
再介绍一个接口FileFilter , 这个接口的目的也是筛选文件类型,其内部的方法就只有accept(File pathname),当返回为true时就满足筛选条件,为false就不满足, 这是listFile()用的.
代码示例—listFile( )返回File[ ]
import java.io.File;
import java.io.FileFilter;
public class FilePractice4 {
public static void main(String[] args) {
File file = new File("G:\\Demo2");
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return (pathname.getName().substring(pathname.getName().lastIndexOf(".")+1)).equals("txt");
}
});
for (File f:files) {
System.out.println(f+"\t");
}
}