InputStream 和 OutputStream 只能操作文件中的数据本身,但是操作不了文件本身的属性,也操作不了文件夹。
File对象目录
File概述
File 是文件和目录路径名的抽象表示形式
File 可以将一个已经存在或者不存在的文件或者目录封装成对象
文件的常用属性
- 文件名称 file.getName()
- 文件路径 file.getPath() / file.getAbsolutePath()
- 文件大小 file.length()
- 文件修改时间 file.lastModified()
import java.io.File;
import java.text.DateFormat;
import java.util.Date;
class FileTest {
public static void main(String[] args) {
File file = new File("file.txt");
String fileName = file.getName();
String path = file.getPath();//获取相对路径
String fullPath = file.getAbsolutePath();//获取相对路径
Long fileSize = file.length();//文件大小
Long time = file.lastModified();//文件最后修改时间
System.out.println("fileName = " + fileName);
System.out.println("path = " + path);
System.out.println("fullPath = " + fullPath);
System.out.println("fileSize = " + fileSize);
System.out.println("time = " + time);
//格式化一下文件最后的修改时间
Date date = new Date(time);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
System.out.println("time = " + dateFormat.format(date));
}
}
创建文件&删除文件
创建文件
创建一个新文件(如果文件不存在,则创建,如果存在则不创建)
- createNewFile
import java.io.File;
import java.io.IOException;
/**
* 创建一个新文件测试(如果文件不存在,则创建,如果存在则不创建)
*/
class CreateFileTest {
public static void main(String[] args) throws IOException {
File file = new File("newFile.txt");
boolean createFlag = file.createNewFile();
System.out.println("createFlag = " + createFlag);
}
}
创建文件夹
import java.io.File;
import java.io.IOException;
/**
* 创建文件夹测试
*/
class CreateDirTest {
public static void main(String[] args) throws IOException {
File file = new File("testDir");
boolean createDirFlag = file.mkdir();
System.out.println("createDirFlag = " + createDirFlag);
}
}
创建多级目录
import java.io.File;
import java.io.IOException;
/**
* 创建多级文件夹
*/
class CreateDirsTest {
public static void main(String[] args) throws IOException {
File file = new File("a\\b\\c\\d\\e\\f\\h\\i\\j\\k\\l\\m\\n");
boolean createDirsFlag = file.mkdirs();
System.out.println("createDirsFlag = " + createDirsFlag);
}
}
删除文件
- 删除一个文件(如果存在,并返回删除结果)
import java.io.File;
import java.io.IOException;
/**
* 删除一个文件
*/
class DeleteFileTest {
public static void main(String[] args) throws IOException {
File file = new File("newFile.txt");
boolean deleteFlag = file.delete();
System.out.println("deleteFlag = " + deleteFlag);
}
}
删除文件夹
删除文件夹时,文件夹需为空,否则删除失败。删除时直接删除,不会进入回收站。
import java.io.File;
import java.io.IOException;
/**
* 删除文件夹
*/
class DeleteDirTest {
public static void main(String[] args) throws IOException {
File file = new File("testDir");
boolean deleteDirFlag = file.delete();
System.out.println("deleteDirFlag = " + deleteDirFlag);
}
}
文件判断
判断文件是否存在
一般在对文件进行操作前,需要对文件进行此判断。
import java.io.File;
/**
* 判断文件是否存在
*/
class FileIsTest {
public static void main(String[] args) {
File file = new File("newFile.txt");
boolean flag = file.exists();
System.out.println("flag = " + flag);
}
}
文件的其他判断
import java.io.File;
/**
* 判断文件是否存在
*/
class FileIsTest {
public static void main(String[] args) {
File file1 = new File("file.txt");
System.out.println("file1----------------");
System.out.println("isDirectory = " + file1.isDirectory());
System.out.println("isFile = " + file1.isFile());
File file2 = new File("a");
System.out.println("file2----------------");
System.out.println("isDirectory = " + file2.isDirectory());
System.out.println("isFile = " + file2.isFile());
File file3 = new File("abc");
System.out.println("file3----------------");
System.out.println("isDirectory = " + file3.isDirectory());
System.out.println("isFile = " + file3.isFile());
}
}
结果:
file1----------------
isDirectory = false
isFile = true
file2----------------
isDirectory = true
isFile = false
file3----------------
isDirectory = false
isFile = false
文件重命名
import java.io.File;
/**
* 文件重命名
*/
class FileRenameTest {
public static void main(String[] args) {
File file = new File("file.txt");
file.renameTo(new File("file_rename.txt"));
}
}
获取系统所有根目录
import java.io.File;
/**
* 列出系统所有根目录,并且打印出每个盘的总空间,已用空间,空闲空间
*/
class ListRootTest {
public static void main(String[] args) {
File[] rootList = File.listRoots();
for(File file:rootList){
System.out.println("file = " + file);
//获取总空间
System.out.println(file+" TotalSpace=" + file.getTotalSpace()/1024/1024/1024+"G");
//获取已使用空间
System.out.println(file+" UsableSpace=" + file.getUsableSpace()/1024/1024/1024+"G");
//获取空闲空间
System.out.println(file+" FreeSpace=" + file.getFreeSpace()/1024/1024/1024+"G");
}
}
}
获取目录内容
调用 list 的文件必须是目录,以及有访问权限的目录,否则返回空数组,从而引发 NullPointException 异常。
import java.io.File;
/**
* 获取某个目录下的文件以及文件夹的名称
*/
class FileListTest {
public static void main(String[] args) {
File file = new File("c:\\");
String[] fileList = file.list();
for (String fileName: fileList) {
System.out.println("fileName = " + fileName);
}
}
}
文件名过滤器
通过一个简单实现的过滤器来找到D盘下所有的.zip文件
import java.io.File;
import java.io.FilenameFilter;
/**
* 过滤器的使用,找到D盘下的所有.zip文件
*/
class FilenameFilterTest {
public static void main(String[] args) {
File file = new File("D:\\");
String[] fileList = file.list(new ZipFilenameFilter());
for (String fileName: fileList) {
System.out.println("fileName = " + fileName);
}
}
}
/**
* 一个简单过滤器的实现,
*/
class ZipFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir,String name) {
return name.endsWith(".zip");
}
}
文件过滤器
通过文件过滤器,可以根据文件的其他属性进行过滤,比如是否隐藏,大小,修改时间等。
import java.io.File;
import java.io.FileFilter;
/**
* 通过文件过滤器获取文件列表
*/
class FileFilterTest {
public static void main(String[] args) {
File file = new File("D:\\");
File[] files = file.listFiles(new ZipFileFilter());
for (File fileItem: files) {
System.out.println("fileItem = " + fileItem);
}
}
}
/**
* 文件过滤器
*/
class ZipFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".zip");
}
}
目录递归遍历
file.list() 或者 是 file.listFiles() 都只能列出当前目录下的文件或者文件夹。
import java.io.File;
/**
* 遍历某个目录下所有的文件件和文件(使用递归)
*/
class FileTest {
public static void main(String[] args) {
listAll(new File("D:\\demo"));
}
public static void listAll(File dir) {
//获取dir目录下面所有的文件和文件件
File[] files = dir.listFiles();
for (File file: files) {
//如果文件本身是文件夹,则需要继续查找下面的内容
if (file.isDirectory()) {
//所以这里使用了递归,调用了自己。
listAll(file);
}
System.out.println("file = " + file.getAbsolutePath());
}
}
}
目录递归遍历(缩进打印)
递归的使用参考准则:某个功能被重复使用,并且在使用时,参与运算的结果和上一次调用有关系。
import java.io.File;
/**
* 遍历某个目录下所有的文件件和文件(使用递归)
*/
class FileTest2 {
public static void main(String[] args) {
listAll(new File("D:\\demo"),0);
}
public static void listAll(File dir,int count) {
for (int i = count;i > 0;i--) {
System.out.print("|---");
}
count++;
System.out.println(dir.getName());
//获取dir目录下面所有的文件和文件件
File[] files = dir.listFiles();
for (File file: files) {
//如果文件本身是文件夹,则需要继续查找下面的内容
if (file.isDirectory()) {
//所以这里使用了递归,调用了自己。
listAll(file,count);
} else {
for (int i = count;i > 0;i--) {
System.out.print("|---");
}
System.out.println(file.getName());
}
}
}
}
打印结果:
demo
|—1
|—|---11
|—|---22
|—2
|—3
|—4
|—5
|—6
|—ttt - 副本 (2) - 副本.txt
|—ttt - 副本 (2).txt
|—ttt - 副本 - 副本 - 副本.txt
|—ttt - 副本 - 副本.txt
|—ttt - 副本.txt
|—ttt.txt
删除带内容的目录
删除带内容的目录需要从最里层的文件和文件逐渐往外删除
import java.io.File;
/**
* 删除带内容的目录
*/
class DeleteDirTest {
public static void main(String[] args) {
delDir(new File("d:\\listFile"));
}
/**
*删除一个带内容的文件夹
*/
public static void delDir(File dir) {
File[] files = dir.listFiles();
for (File file: files) {
if (file.isDirectory()) {
//进行递归
delDir(file);
} else {
//如果是文件,打印信息之后进行删除
System.out.println(file+"[file]" + file.delete());
;
}
}
//打印当前目录,并且删除
System.out.println(dir+"[dir]" + dir.delete());
dir.delete();
}
}
找到指定的文件类型,并把文件名称记录到一个文件中
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* 步骤:
* 1.对文件夹进行深度遍历
* 2.在遍历的过程中进行过滤,将符合条件的内容都存储到容器中
* 3.对容器中的内容进行遍历并将文件名称写入到文件中
*/
class FindFileTest {
public static void main(String[] args) throws IOException {
//1.对文件夹进行深度遍历
//2.在遍历的过程中进行过滤,将符合条件的内容都存储到容器中
//3.对容器中的内容进行遍历并将文件名称写入到文件中
List<File> files = new ArrayList<>();
findFile(new File("d:\\test"),new FilenameFilter() {
@Override
public boolean accept(File dir,String name) {
return name.endsWith(".java");
}
},files);
writeToFile(files,new File("findFile.txt"));
}
public static void findFile(File dir,FilenameFilter filter,List<File> list) {
File[] files = dir.listFiles();
for (File file: files) {
if (file.isDirectory()) {
//进行递归
findFile(file,filter,list);
} else {
//对文件进行过滤,如果符合条件,则将其存储到集合中
if (filter.accept(dir,file.getName())) {
list.add(file);
}
}
}
//打印被查找的文件夹
System.out.println(dir + "[dir]");
}
/**
* 将文件列表写入文件
*/
public static void writeToFile(List<File> files,File toFile) throws IOException {
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter(toFile));
for (File file: files) {
bufferedWriter.write(file.getAbsolutePath());
bufferedWriter.newLine();
bufferedWriter.flush();
}
} finally {
if (bufferedWriter != null) {
bufferedWriter.close();
}
}
}
}