Java File 类
定义Java
虚拟机的接口和类,以访问文件,文件属性和文件系统。
- 字段:
File类中包含4个public
静态字段,并且这4个字段比较相近:
pathSeparator
//与系统相关的路径分隔符,返回String
–
pathSeparatorChar
//与系统相关的路径分隔符,返回Char
-
separator
//系统相关的默认名称分割符,返回String
-
separatorChar
//系统相关的默认名称分隔符。返回Char
由此可以看出来,这4个字段主要分为两个:
“`pathSeparator“`和“`separator“`
区别在于:“`pathSeparator“`用于处理在多个路径下的文件分割符,比如在`Windows`环境变量下,每个环境变量是以`;`分割开来,比如:“`C:\test;C:\java“`,而在`Unix`中却是以`:`分割。因此“`pathSeparator“`可以理解为多个路径分割符。
而“`separator“`用于处理在某个路径表示的分隔符,比较明显的就是`Windows`是以`“\”`分割:比如“`C:\\test“`,而`Unix`以`“/”`分割:“`/home/test“`。
使用这两类符号表示路径,能够使编写出来的代码跨平台使用也没有什么问题。在
Java
官方文档中,标明File
类是用来访问文件,文件属性和文件系统相关的,并且File
类是无法访问File
的具体内容的。
下面列举下File
类中比较有用的方法:
createNewFile() //当且仅文件不存在的时候,创建新的文件
createTempFile(String prefix,String suffix) //在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称
//此方法在不用指定路径,因为默认使用的系统Temp文件夹,也就是临时文件夹,生成的文件名一般不会重复,可以看做是类似:前缀+uuid+后缀
createTempFile(String prefix,String suffix,File directory) //在指定的路径下生成临时文件,和两个参数的区别在于不再临时Temp文件夹中生成
delete() //删除文件或目录
deleteOnExit() //在虚拟机退出的时候删除文件或目录
getAbsolutePath() //获取此抽象路径名的绝对形式
getCanonicalFile() //获取此抽象路径的名的规范形式
getPath() //获取此抽象路径名转换为路径名字符串。
//getPath(),getAbsolutePath(),getCanonicalPath()
//三个方法分别在于使用相对路径的时候表现不同
//Path path=new Path(".");
//getPath(); 输出 .
//getAbsolutPath(); 输出D:\test\.
//getCanonicalPath() 输出D:\test
//并且值得注意的是:只有getCanonicalPath()是能正确解析相对路径的,而其他方法:getPath(),getName(),getParen()等是无法解析相对路径的。
isAbsolute() //测试此路径是否为绝对路径
isDirectory() //测试此路径是否是文件夹
list() //返回此路径下表示的目录的中的所有文件和目录
list(FilenameFilter filter) //使用过滤器过滤文件和目录
toURI() //返回由此路径表示的URI
toPath() //返回NIO的Path对象
Path
值得注意的是在JDK1.7
中,增加了NIO Path
对象,用于增强File
。
值得注意的方法有:
Paths.get() //NIO Path的默认构造函数,注意Path默认构造函数是private的
endWith(Path other) //路径是否是以other结束
startWith(Path other) //路径是否是以other开始
getName(int index) //获取索引为index的目录或者名称(根目录不算)
//注意,和getName(index)配套的有getNameCount() ,获取元素个数,因此可以使用for循环来访问它。它还有一个迭代器方法```itertor()```,也可以使用迭代器访问。
normalize() //返回格式化路径,一般使用方式为调用toAbsolutePath()后调用此方法
resolve() //相当于拼接两个路径
resolveSibling() //从this的父路径拼接此路径
relativize(Path other) //返回此路径到给定路径的相对路径
toRealPath(LinkOption... options)//相当于File.getCanonicalFile() 也就是toAbsolutePath()+normalize()
值得一提的是NIO Path
中新添加了一个非常有用的方法便是
“`register(WatchService watcher, WatchEvent.Kind>… events)“`,它能够注册监控文件,当文件被修改,新建,删除的时候,都能够第一时间被发现。
Demo
public static void main(String[] args) throws IOException, InterruptedException {
WatchService watchService = FileSystems.getDefault().newWatchService();
String filePath = "D:/test";
Paths.get(filePath).register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
while(true){
WatchKey key = watchService.take();
List<WatchEvent<?>> watchEvents = key.pollEvents();
for (WatchEvent<?> event : watchEvents) {
if(StandardWatchEventKinds.ENTRY_CREATE == event.kind()){
System.out.println("创建:[" + filePath + "/" + event.context() + "]");
}
if(StandardWatchEventKinds.ENTRY_MODIFY == event.kind()){
System.out.println("修改:[" + filePath + "/" + event.context() + "]");
}
if(StandardWatchEventKinds.ENTRY_DELETE == event.kind()){
System.out.println("删除:[" + filePath + "/" + event.context() + "]");
}
}
if(!key.reset()){
break;
}
}
}
Files
NIO
中,与Path
配套使用的还有Files
类,下面简单列出几个比较实用的方法:
Files.exists() //文件是否存在
Files.createDiretory() //创建新的文件夹
Files.copy() //复制一个文件到另外一个地方
Files.copy(Path,Path,StandardCopyOption.REPLACE_EXISTING); //复制文件,当目标文件已存在的时候,覆盖目标文件
Files.move() //移动文件
//在之前要完成这个功能,只能使用File#rename()方法
Files.delete() //删除文件
“`Files.walkFileTree()“` //递归遍历文件目录
一般用于查找某个指定文件。看例子:
public static void main(String[] args)throws Exception {
Path startingDir = Paths.get("G:\\test");
List<Path> result = new LinkedList<>();
Files.walkFileTree(startingDir, new FindJavaVisitor(result));
System.out.println(result);
}
private static class FindJavaVisitor extends SimpleFileVisitor<Path>{
private List<Path> result;
FindJavaVisitor(List<Path> result){
this.result = result;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){
if(file.toString().endsWith(".java")){
result.add(file.getFileName());
}
return FileVisitResult.CONTINUE;
}
}