注:Windows 的路径分隔符使用反斜线“\”,而 Java 程序中的反斜线表示转义字符,所以如果需要在 Windows 的路径下包括反斜线,则应该使用两条反斜线或直接使用斜线“/”也可以。Java 程序支持将斜线当成平台无关的路径分隔符。
java.io.File
类∶代表文件和目录。在开发中,读取文件、生成文件、删除文件、修改文件的属性时经常会用到本类。File类java.io包中唯一代表磁盘文件本身的对象。File提供了三种形式的构造方法
方法 | 参数描述 |
---|---|
File(String path) |
如果 path 是实际存在的路径,则该 File 对象表示的是目录;如果 path 是文件名,则该 File 对象表示的是文件。 |
File(String path, String name) |
path 是路径名,name 是文件名 |
File(File dir, String name) |
dir 是路径对象,name 是文件名 |
使用任意一个构造方法都可以创建一个File对象,下面是一个小例子
package konoha.commonClass.ClassFile;
import java.io.File;
import java.io.IOException;
public class testClassFile {
public static void main(String[] args) throws IOException {
File file = new File("D:\\JavaLearning\\JavaSE\\JavaSE\\src\\konoha\\commonClass\\ClassFile\\testFile");
//输出路径
System.out.println(file);
/**
* user.dir
* 用户目录
*
*/
System.out.println(System.getProperty("user.dir"));
}
以下是File常用方法的描述
方法名 | 方法描述 |
---|---|
boolean exists() |
测试当前 File 是否存在 |
boolean canRead() |
测试应用程序是否能从指定的文件中进行读取 |
boolean canWrite |
测试应用程序是否能写当前文件 |
boolean delete() |
删除当前对象指定的文件 |
String getAbsolutePath() |
返回由该对象表示的文件的绝对路径名 |
String getName() |
返回表示当前对象的文件名或路径名(如果是路径,则返回最后一级子路径名) |
String getParent() |
返回当前 File 对象所对应目录(最后一级子目录)的父目录名 |
boolean isAbsolute() |
测试当前 File 对象表示的文件是否为一个绝对路径名。该方法消除了不同平台的差异,可以直接判断 file 对象是否为绝对路径。 |
boolean isDirectory() |
测试当前 File 对象表示的文件是否为一个路径 |
boolean isFile() |
测试当前 File 对象表示的文件是否为一个“普通”文件 |
long lastModified() |
返回当前 File 对象表示的文件最后修改的时间,(是与计算机0时间相减的结果,是一个long值,可以创建Data对象) |
long length() |
返回当前 File 对象表示的文件长度 |
String[] list() |
返回当前 File 对象指定的路径文件列表 |
String[] list(FilenameFilter) |
返回当前 File 对象指定的目录中满足指定过滤器的文件列表 |
boolean mkdir() |
创建一个目录,它的路径名由当前 File 对象指定 |
boolean mkdirs() |
创建一个目录,它的路径名由当前 File 对象指定 |
boolean renameTo(File) |
将当前 File 对象指定的文件更名为给定参数 File 指定的路径名 |
mkdir()与mkdirs()方法的区别在于mkdir在创建目录路径有一个不存在时,就会创建失败,而mkdirs则会递归的创建所有不存在的目录。
File类有两个常用常量:pathSeparator和separator,源码的定义如下
private static final FileSystem fs = DefaultFileSystem.getFileSystem(); //得到文件系统
//指的是分隔连续多个路径字符串的分隔符,Windows 下指;。例如 java -cp test.jar;abc.jar HelloWorld
public static final char pathSeparatorChar = fs.getPathSeparator(); //得到分割符
public static final String pathSeparator = "" + pathSeparatorChar; //将分隔符转化为字符串,下同
//用来分隔同一个路径字符串中的目录的,Windows 下指/。例如 C:/Program Files/Common Files
public static final char separatorChar = fs.getSeparator();
public static final String separator = "" + separatorChar;
获取文件属性
假设有一个文件位于 "C:\Users\45362\Downloads\KindlePreviewerInstaller.exe"
。编写 Java 程序获取并显示该文件的长度、是否可写、最后修改日期以及文件路径等属性信息。实现代码如下
package konoha.commonClass.ClassFile;
import java.io.File;
import java.util.Date;
/**
* 假设有一个文件位于 `"C:\Users\45362\Downloads\KindlePreviewerInstaller.exe"`。
* 编写 Java 程序获取并显示该文件的长度、是否可写、最后修改日期以及文件路径等属性信息。
*/
public class getFileDetails {
public static void main(String[] args) {
//两个文件一个使用了绝对路径创建,一个使用了相对路径创建,输出是可以看出其区别
String path1 = "C:\\Users\\45362\\Downloads\\KindlePreviewerInstaller.exe";
String path2 = "JavaSE";
showFileDetails(path1);
showFileDetails(path2);
}
public static void showFileDetails(String path) {
File file = new File(path);
System.out.println("============================================================");
System.out.println("File Details: ");
System.out.println("File Name: " + file.getName());
System.out.println("File Length: " + file.length()+"Byte");
System.out.println("File or Dir: " + (file.isDirectory() ? "Dir" : "File"));
System.out.println("Is File able to read: " + (file.canRead() ? "Yes" : "No"));
System.out.println("Is File able to write: " + (file.canWrite() ? "Yes" : "No"));
System.out.println("Is File Hidden: " + (file.isHidden() ? "Yes" : "No"));
System.out.println("Last Modified Time: " + new Date(file.lastModified()));//使用Data类来规范输出时间
System.out.println("File Path: " + file.getPath());
System.out.println("Absolute Path: " + file.getAbsolutePath());
System.out.println("============================================================");
}
}
创建和删除文件
File 类不仅可以获取已知文件的属性信息,还可以在指定路径创建文件,以及删除一个文件。创建文件需要调用 createNewFile() 方法,删除文件需要调用 delete() 方法。无论是创建还是删除文件通常都先调用 exists() 方法判断文件是否存在。
假设要在 C 盘上创建一个 test.txt 文件,程序启动时会检测该文件是否存在,如果不存在则创建;如果存在则删除它再创建。
在操作文件时一定要使用 File.separator 表示分隔符。在程序的开发中,往往会使用 Windows 开发环境,因为在 Windows 操作系统中支持的开发工具较多,使用方便,而在程序发布时往往是直接在 Linux 或其它操作系统上部署,所以这时如果不使用 File.separator,则程序运行就有可能存在问题。关于这一点我们在以后的开发中一定要有所警惕。
package konoha.commonClass.ClassFile;
import java.io.File;
import java.io.IOException;
/**
* 假设要创建一个 test.txt 文件,程序启动时会检测该文件是否存在,如果不存在则创建;如果存在则删除它再创建。
*/
public class createAndDeleteFile {
public static void main(String[] args) throws IOException {
//File file = new File("D:\\test.txt");
File file = new File("D:" + File.separator+"test.txt");
//在windows系统中两种方法都可以成功创建文件,区别如上文
if (file.exists()) {
file.delete();
System.out.println("File Deleted!");
}
file.createNewFile();
System.out.println("File Created!");
}
}
递归遍历输出目录文件
通过遍历目录可以在指定的目录中查找文件,或者显示所有的文件列表。File 类的 list() 方法提供了遍历目录功能,该方法有如下两种重载形式。
String[] list()
:该方法表示返回由 File 对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的 File 对象不是目录,则返回 null。
提示:list() 方法返回的数组中仅包含文件名称,而不包含路径。但不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。
String[] list(FilenameFilter filter)
:该方法的作用与 list() 方法相同,不同的是返回数组中仅包含符合 filter 过滤器的文件和目录,如果 filter 为 null,则接受所有名称。
package konoha.commonClass.ClassFile;
import java.io.File;
import java.util.Date;
/**
* 遍历输出文件夹下所有的目录和文件及其基本属性
* 本例子中采用了listFiles()的方法,而不是list()方法,两者用法相似,只需要注意返回值的差异即可
*/
public class showAllFileInDIr {
public static void main(String[] args) {
File file = new File("D:\\JavaLearning\\JavaSE\\JavaSE\\src");
showFiles(file);
}
public static void showFiles(File file){
System.out.println("All files in " + file.getName() + ":");
int level = 0;
showFiles(file,level);
}
public static void showFiles(File file, int level) {
System.out.print("|-");
for (int i = 0; i < level; i++) System.out.printf("-");
if (file.isDirectory()){
System.out.println(getFileDetails(file));
File [] files = file.listFiles();
for (File tmp: files) {
showFiles(tmp, level+1);
}
}else System.out.println(getFileDetails(file));
}
public static String getFileDetails(File file) {
String des = "";
des = des+file.getName() +"\t" + (file.isDirectory()?"Dir":"File") + "\t";
if (file.isDirectory())
des += "---\t";
else des += file.length() + "Bytes\t";
des += new Date(file.lastModified());
return des;
}
}
使用过滤器输出指定的文件
假设希望只列出目录下的某些文件,这就需要调用带过滤器参数的 list() 方法。首先需要创建文件过滤器,该过滤器必须实现 java.io.FilenameFilter
接口,并在 accept() 方法中指定允许的文件类型。
实现方法如下:
package konoha.commonClass.ClassFile;
import java.io.File;
import java.io.FilenameFilter;
//过滤器
public class javaFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
//允许指定的文件类型
return name.endsWith(".java");
}
}
package konoha.commonClass.ClassFile;
import java.io.File;
public class showFileInDir {
public static void main(String[] args) {
//下面两种方法都可以实现要求,其中getFileDetails()方法来自上一个练习,此处使用
String path = "D:\\JavaLearning\\JavaSE\\JavaSE\\src\\konoha\\commonClass\\ClassFile";
File file = new File(path);
String [] names = file.list(new javaFilter());
for (String str : names) {
System.out.println(showAllFileInDIr.getFileDetails(new File(path, str)));
}
File [] names = file.listFiles(new javaFilter());
for (File str : names) {
System.out.println(showAllFileInDIr.getFileDetails(str));
}
}
}
原文:https://www.cnblogs.com/konoha/p/15145197.html