File是文件,它还有个兄弟叫流(Stream)
他们一起叫IO
- 当需要把内存中的数据存储到持久设备上的这个动作称为输出(写)Output操作。
- 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。
把这种输入与输出动作称为IO操作。
1 File与Stream的关系
IO也可以称作File(文件)与Stream(流)。
做个比喻:
- 水杯和水是什么关系?水杯是水的容器,水是水杯的内容。
-
文件是流的容器,流是文件的内容。
image.png
2 输入流和输出流
- 输入流:如果Java程序得到了数据,就是输入流
-
输出流:如果Java程序对外提供了数据,就是输出流。
image.png
3 File 类的简介
File类是文件和目录路径名的抽象表示,即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们去操作磁盘上的文件,或者文件夹只要找到File类即可,File类还可以表示磁盘。
3.1 File可以代表:
1.文件
2.目录
3.磁盘
4 File类的构造函数
1.File(File parent,String child):从父类抽象路径名和子类路径名 字符串创建新的File实例。
2.File(String pathname):通过将给定的路径名 字符串转换为抽象路径名来创建新的File实例。
3.File(String parent,String child:从父类路径名 字符串和子类路径名 字符串创建新的File实例。
4.File(URI uri):通过将给定的file:URI转换为抽象路径名来创建新的File实例。
5 常用的File方法
1.delete():删除由此抽象路径名表示的文件或目录,返回值为:boolean类型。
2.getAbsoluteFile():返回此抽象路径名的绝对形式,返回值为:File类型。
3.getAbsolutePath():返回此抽象路径名的绝对路径名字符串,返回值为:String类型。
4.getName():返回由此抽象路径名表示的文件或目录的名称,返回值为:String类型。
5.length():返回由此抽象路径名表示的文件的大小、长度,返回值为:long类型。
案例:
1:获取文件信息
public static void main(String[] args) {
//创建文件对象
File file = new File("FileTest.java");
//获取文件的绝对路径,即全路径
String absPath = file.getAbsolutePath();
//File中封装的路径是什么获取到的就是什么。
String path = file.getPath();
//获取文件名称
String filename = file.getName();
//获取文件大小
long size = file.length();
System.out.println("absPath="+absPath);
System.out.println("path="+path);
System.out.println("filename="+filename);
System.out.println("size="+size);
}
2:文件和目录操作
public static void main(String[] args) throws IOException {
// 对文件或者文件加进行操作。
File file = new File("d:\\file.txt");
// 创建文件:如果文件不存在,创建 返回 true; 如果文件存在,则不创建 返回 false; 如果路径错误,IOException。
boolean b1 = file.createNewFile();
System.out.println("b1=" + b1);
//-----------删除文件操作-------注意:不去回收站。慎用------
boolean b2 = file.delete();
System.out.println("b2="+b2);
//-----------需要判断文件是否存在------------
boolean b3 = file.exists();
System.out.println("b3="+b3);
//-----------对目录操作 创建,删除,判断------------
File dir = new File("d:\\abc\\def");
//mkdir()创建单个目录。//dir.mkdirs();创建多级目录
boolean b4 = dir.mkdir();
System.out.println("b4="+b4);
//删除目录时,如果目录中有内容,无法直接删除。
boolean b5 = dir.delete();
//只有将目录中的内容都删除后,保证该目录为空。这时这个目录才可以删除。
System.out.println("b5=" + b5);
//-----------判断文件,目录------------
File f = new File("d:\\java");// 要判断是否是文件还是目录,必须先判断存在。
if(f.exists()) {
System.out.println(f.isFile());
System.out.println(f.isDirectory());
}else{
// f.createNewFile();
// f.mkdirs();
}
}
3:磁盘操作
public static void main(String[] args) throws IOException {
//获取当前所有的磁盘
File []disks = File.listRoots();
for (int i = 0; i < disks.length; i++) {
System.out.println("盘符" + disks[i]);
System.out.println(String.format("%s的容量是%d", disks[i], disks[i].getTotalSpace()
/ 1024 / 1024 / 1024));
System.out.println(String.format("%s的已用的容量是%d", disks[i], disks[i].getFreeSpace()
/ 1024 / 1024 / 1024));
System.out.println(String.format("%s的已用的容量是%d", disks[i], disks[i].getUsableSpace()
/ 1024 / 1024 / 1024));
}
}
5:实现dir操作
public static void main(String[] args) throws IOException {
File dir = new File("d:\\tools");
//获取的是目录下的当前的文件以及文件夹的名称。
String[] names = dir.list();
for(String name : names){
System.out.println(name);
}
//获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
File[] files = dir.listFiles();
for(File file : files){
System.out.println(file);
}
}
注意:在获取指定目录下的文件或者文件夹必须满足下面两个条件
1.指定的目录必须是存在的
2.指定的必须是目录,否则容易引发返回数组为null的问题,出现NullPointerExcetion。
6文件过滤
过滤器有两种:
(1)FilenameFilter:通过文件名过滤
(2)FileFilter:通过文件对象过滤
显示d盘根目录下的所有java源文件
//定义类实现文件名称FilenameFilter过滤器
static class MyFileNameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".java");
}
}
public static void main(String[] args) throws IOException {
//获取扩展名为.java所有文件
//创建File对象
File file = new File("d:\\");
//获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
File[] files = file.listFiles(new MyFileNameFilter());
//遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
显示d盘目录下的所有目录
//定义类实现文件名称FilenameFilter过滤器
static class MyFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
public static void main(String[] args) throws IOException {
//显示D盘下的所有目录
File file = new File("d:\\");
File[] files = file.listFiles(new MyFileFilter());
//遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
打印d盘下所有的文件
public static void main(String[] args) {
File file = new File("d:\\");
getAllFile(file);
}
//获取指定目录以及子目录中的所有的文件
public static void getAllFile(File file) {
File[] files = file.listFiles();
//遍历当前目录下的所有文件和文件夹
if(files!=null) {
for (File f : files) {
if (f != null) {
//判断当前遍历到的是否为目录
if (f.isDirectory()) {
//是目录,继续获取这个目录下的所有文件和文件夹
getAllFile(f);
} else {
//不是目录,说明当前f就是文件,那么就打印出来
System.out.println(f);
}
}
}
}
}