15.1 File类
File
类是java.io
包下代表与平台无关的文件和目录,也就是说,在程序中操作文件和目录都可以通过File
类来完成。值得指出的是,不管是文件还是目录都是使用File
来操作的,File
能新建、删除、重命名文件和目录,
File不能访问文件内容
File
不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
15.1.1 访问文件和目录
File
类可以使用文件路径字符串来创建File
实例,该文件路径字符串既可以是绝对路径,也可以是相对路径。
相对路径的处理方式
在默认情况下,系统总是依据用户的工作路径来解释相对路径,这个路径由系统属性user.dir
指定,通常也就是运行Java
虚拟机时所在的路径。
File类常用方法
一旦创建了File
对象后,就可以调用File
对象的方法来访问,File
类提供了很多方法来操作文件和目录,下面列出一些比较常用的方法。
获取文件名
方法 |
描述 |
String getName() |
返回此File 对象所表示的文件名或路径名(如果是路径,则返回最后一级子路径名). |
String getParent() |
返回此File 对象所对应目录(最后一级子目录)的父目录名。 |
获取路径名
方法 |
描述 |
String getPath() |
返回次File 对象所对应的路径名. |
String getAbsolutePath() |
返回此File 对象的绝对路径。 |
String getCanonicalPath() |
返回此File 对象的的规范路径名字符串。 |
getPath getAbsolutePath getCanonicalPath三个方法的区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.io.File; import java.io.IOException;
public class FileTest2 { public static void main(String[] args) { try { File tmpFile = File.createTempFile("Hello_", "_World"); System.out.println(tmpFile.getName()); System.out.println(tmpFile.getPath()); System.out.println(tmpFile.getCanonicalPath()); System.out.println(tmpFile.getAbsolutePath()); tmpFile.deleteOnExit(); System.out.println("-------------------------------"); File file = new File("."); System.out.println("getPath=" + file.getPath()); System.out.println("getCanonicalPath=" + file.getCanonicalPath()); System.out.println("getAbsolutePath=" + file.getAbsolutePath()); System.out.println("-------------------------------"); File testFile = new File("./test.txt"); System.out.println("getPath=" + testFile.getPath()); System.out.println("getCanonicalPath=" + testFile.getCanonicalPath()); System.out.println("getAbsolutePath=" + testFile.getAbsolutePath());
} catch (IOException e) { e.printStackTrace(); }
} }
|
运行效果:
1 2 3 4 5 6 7 8 9 10 11 12
| Hello_6147365813433103955_World C:\Users\lan\AppData\Local\Temp\Hello_6147365813433103955_World C:\Users\lan\AppData\Local\Temp\Hello_6147365813433103955_World C:\Users\lan\AppData\Local\Temp\Hello_6147365813433103955_World ------------------------------- getPath=. getCanonicalPath=G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\15\15.1 getAbsolutePath=G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\15\15.1\. ------------------------------- getPath=.\test.txt getCanonicalPath=G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\15\15.1\test.txt getAbsolutePath=G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\15\15.1\.\test.txt
|
总结
方法 |
描述 |
getPath() |
方法返回构造时传入的路径 |
getAbsolutePath() |
方法返回文件的绝对路径,- 如果构造的时候是全路径就直接返回全路径,
- 如果构造时是相对路径,就返回当前目录的路径 + 构造File对象时的路径
|
getCanonicalPath() |
方法返回绝对路径,会把. 、.. 这两个相对路径符号删除掉 |
重命名
方法 |
描述 |
boolean renameTo(File dest) |
重命名此File 对象所对应的文件或目录,如果重命名成功,则返回true ;否则返回false . |
判断方法
方法 |
描述 |
boolean exists() |
判断File 对象所对应的文件或目录是否存在。 |
boolean canWrite() |
判断File 对象所对应的文件和目录是否可写。 |
boolean canRead() |
判断File 对象所对应的文件和目录是否可读。 |
boolean isFile() |
判断File 对象所对应的是否是文件,而不是目录。 |
boolean isDirectory() |
判断File 对象所对应的是否是目录,而不是文件。 |
boolean isAbsolute() |
判断File 对象所对应的文件或目录是否是绝对路径。 该方法消除了不同平台的差异,可以直接判断File 对象是否为绝对路径。- 在
UNIX/Linux/BSD 等系统上,如果路径名开头是一条斜线(/ ),则表明该File 对象对应一个绝对路径; - 在
Windows 等系统上,如果路径开头是盘符,则说明它是一个绝对路径。
|
获取常规文件信息
方法 |
描述 |
long lastModified() |
返回文件的最后修改时间 |
long length() |
返回文件内容的长度 |
创建文件
方法 |
描述 |
boolean createNewFile() |
当此File 对象所对应的文件不存在时,该方法将新建一个该File 对象所指定的新文件,如果创建成功则返回true ;否则返回false . |
static File createTempFile(String prefix,String suffix) |
在默认的临时文件目录中创建一个临时的空文件- 使用给定前缀、系统生成的随机数和给定后缀作为文件名。
prefix 参数必须至少是3字节长。建议前缀使用一个短的、有意义的字符串,比如”hjb 或”"mail" .suffix 参数可以为null ,在这种情况下,将使用默认的后缀”.tmp “
|
static File createTempFile(String prefix,String suffix,File directory) |
在directory所指定的目录中创建一个临时的空文件,使用给定前缀、系统生成的随机数和给定后缀作为文件名。 |
删除文件
方法 |
描述 |
boolean delete() |
删除File 对象所对应的文件或目录。 |
void deleteOnExit() |
注册一个删除钩子,指定当Java 虚拟机退出时,删除File 对象所对应的文件和目录。 |
创建目录
方法 |
描述 |
boolean mkdir() |
试图创建一个File 对象所对应的目录,如果创建成功,则返回true ;否则返回false 。调用该方法时File 对象必须对应一个路径,而不是一个文件。 |
查询目录列表
方法 |
描述 |
String[] list() |
列出File 对象的所有子文件名和子路径名,返回String 数组。 |
File[] listFiles() |
列出File 对象的所有子文件和子路径,返回File 数组。 |
static File[] listRoots() |
列出系统所有的根路径。这是一个静态方法,可以直接通过File 类来调用。 |
程序示例
上面详细列出了File
类的常用方法,下面程序以几个简单方法来测试一下File
类的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import java.io.*;
public class FileTest { public static void main(String[] args) throws IOException { File file = new File("."); System.out.println("file.getName()="+file.getName()); System.out.println("file.getParent()="+file.getParent()); System.out.println("file.getAbsoluteFile()="+file.getAbsoluteFile()); System.out.println("file.getAbsoluteFile().getParent()="+file.getAbsoluteFile().getParent()); File tmpFile = File.createTempFile("aaa", ".txt", file); tmpFile.deleteOnExit(); File newFile = new File(System.currentTimeMillis() + ""); System.out.println("newFile对象是否存在:" + newFile.exists()); newFile.createNewFile(); newFile.mkdir(); String[] fileList = file.list(); System.out.println("====当前路径下所有文件和路径如下===="); for (String fileName : fileList) { System.out.println(fileName); } File[] roots = File.listRoots(); System.out.println("====系统所有根路径如下===="); for (File root : roots) { System.out.println(root); } } }
|
运行上面程序,效果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| file.getName()=. file.getParent()=null file.getAbsoluteFile()=G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\15\15.1\. file.getAbsoluteFile().getParent()=G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\15\15.1 newFile对象是否存在:false ====当前路径下所有文件和路径如下==== 1583829365214 aaa5846229108561415065.txt FilenameFilterTest.java FileTest.java ====系统所有根路径如下==== C:\ D:\ E:\ F:\ G:\ H:\
|
可以看到程序列出当前路径的所有文件和路径时,列出了程序创建的临时文件,但程序运行结束后,aaa.txt
临时文件并不存在,因为程序指定虚拟机退出时自动删除该文件。
反斜线作为分隔符的情况
Windows
的路径分隔符使用反斜线(\
),而Java
程序中的反斜线表示转义字符,所以如果需要在Windows
的路径下包括反斜线,则应该使用两条反斜线,如F:\\abc\\test.txt
。
建议使用斜线作为分隔符
或者直接使用斜线(/
)也可以,Java
程序支持将斜线(/
)当成平台无关的路径分隔符.