File类总结

File类总结

  • 所在包:java.io
  • File类直接继承Object类,实现了两个接口 SerializableComparable<File>
  • File类的全局常量:路径分隔符 separator 注意注意注意:全局常量在此处使用了小写字母
public static final String separator
  • 注意:IO部分到处都在抛异常,我们暂时全忽略,主方法上加throws Exception
  • File类最常用的构造函数 public File(String pathname) 举例如下:
File file = new File("d:" + File.separator + "123" + File.separator + "456.txt") ;
// 如果要用当前目录的话,就是 "." + File.separator + ......"
  • File类其它构造函数(没有无参构造)
public File(File parent,String child)  // 在andriod开发上使用比较多,比如先取得系统规划的SD卡父目录,然后再加上自己定义的子目录
public File(String parent,String child)
public File(URI uri)
  • 关于路径的说明:
public File(String pathname)
这里的路径参数使用的是String类型的参数,那举例说明:
1、假设要访问D盘根目录下的text.txt文件,那pathname="d:	ext.txt" ,此时问题出现了,	代表的是制表符,所以程序会报错。
2、假设要访问D盘根目录下的demo.txt文件,那pathname="d:demo.txt" ,此时没有任何问题。
3、基于以上两点,为了保险起见,我们需要将转义,即\ .例如:pathname="d:\text.txt" 或 pathname="d:\demo.txt" 都是正确的。
4、但是,在linux下分隔符是/这样儿的斜线,所以为了统一,就使用到了File类的常量separator 即:pathname="d:" + File.separator + "demo.txt" 
5、当然,linux下也没有d盘,关于这个问题暂时保留,我后面再研究。
  • 创建文件方法:createNewFile() , 返回布尔值 public boolean createNewFile() throws IOException
File file = new File("d:" + File.separator + "123.txt") ;
System.out.println(file.createNewFile()) ;
  • 删除文件方法:delete() 返回布尔值 public boolean delete()
File file = new File("d:" + File.separator + "123.txt") ;
System.out.println(file.createNewFile()) ;
Thread.sleep(2000) ;
System.out.println(file.delete()) ;
  • 判断文件是否存在的方法 exists() 返回布尔值 public boolean exists()
File file = new File("d:" + File.separator + "123.txt") ;
// 如果文件存在,就删除,不存在,就创建
if (file.exists()) {
	System.out.println(file.delete()) ;
} else {
	System.out.println(file.createNewFile()) ;
}
  • 判断是否是文件 isFile() 返回布尔值 public boolean isFile()
// 给出的路径目录或文件不存在的话,那就必然会返回false
File file = new File("d:" + File.separator + "123.txt") ;
System.out.println(file.isFile()) ;
  • 判断是否是文件 isDirectory() 返回布尔值 public boolean isDirectory()
// 给出的路径目录或文件不存在的话,那就必然会返回false
File file = new File("d:" + File.separator + "123.txt") ;
System.out.println(file.isDirectory()) ;
  • 得到父目录 getParent() ,返回值 String public String getParent()
  • 得到父目录 getParentFile() ,返回值 File public File getParentFile()
File file = new File("d:" + File.separator + "123" + File.separator + "456" + File.separator + "789.txt") ;
String str = file.getParent() ;
File file2 = file.getParentFile() ;
System.out.println(str) ;
System.out.println(file2) ;
因为getParentFile() 返回值 File,而取得File类型对象就可以使用File类的很多方法了,所以工作中取得父目录时大部分是要使用getParentFile()方法的。
  • 创建目录方法:mkdir() 返回布尔值 public boolean mkdir()
  • 创建目录方法:mkdirs() 返回布尔值 public boolean mkdirs()
File file = new File("d:" + File.separator + "123" + File.separator + "456" + File.separator + "789.txt") ;
if (!file.getParentFile().exists()) file.getParentFile().mkdirs() ;
if (!file.exists()) file.createNewFile() ;
  • 取得文件大小方法:length() 返回值long public long length()
// 返回结果为原始的long型字节
File file = new File("d:" + File.separator + "1.flv") ;
if (file.isFile()) {
	System.out.println("文件大小:" + file.length() + "Byte");
}
// 字节/1024/1024 得到M
File file = new File("d:" + File.separator + "1.flv") ;
if (file.isFile()) {
	System.out.println("文件大小:" + file.length()/1024/1024 + "M");
}
// 以为因数据类型是long而没有小数,再改造,在第一个long处强制转换为double
File file = new File("d:" + File.separator + "1.flv") ;
if (file.isFile()) {
	System.out.println("文件大小:" + (double)file.length()/1024/1024 + "M");
}
// 以上结果为小数,但小数位数太多,再改造,留两位小数 
File file = new File("d:" + File.separator + "1.flv") ;
if (file.isFile()) {
	System.out.println("文件大小:" + new BigDecimal((double)file.length()/1024/1024).divide(new BigDecimal(1),2,BigDecimal.ROUND_HALF_UP) + "M");
}
  • 取得最近一次修改时间:lastModified() 返回值long public long lastModified()
// 返回结果为原始的long型字节
File file = new File("d:" + File.separator + "1.flv") ;
if (file.isFile()) {
	System.out.println("最近一次修改时间:" + file.lastModified());
}
// long 转 Date
File file = new File("d:" + File.separator + "1.flv") ;
if (file.isFile()) {
	System.out.println("最近一次修改时间:" + new Date(file.lastModified()));
}
// 格式化显示Date
File file = new File("d:" + File.separator + "1.flv") ;
if (file.isFile()) {
	System.out.println("最近一次修改时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
}
  • 可读 canRead() 可写 canWrite() 可执行canExecute()
canExecute() 方法在linux下才有效,windows下没有此属性,在windows下,大部分情况下canExecute()是返回true
windows下的这三种属性与安全权限无关,只与文件属性有关,linux 系统下的情况待测。
  • 取得文件名 getName() 返回 String public String getName()
如果路径中仅有盘符,则返回空
正常则返回最后一个分隔符部分,无论最后一部分是文件还是目录,无论文件存不存在,都会返回其对应的名字
  • 取得路径 getPath() 返回 String public String getPath()
如果路径中仅有盘符,照常返回
无论最后一部分是文件还是目录,无论文件存不存在,都会返回完整路径,包含文件名(如果有)。
  • 列出目录下的目录和文件 list() 返回值 String[] public String[] list()
  • 列出目录下的目录和文件 listFiles() 返回值 File[] public File[] listFiles()
  • 因 listFiles() 方法返回值是File数组,利用File类的很多方法可以继续做很多事情,所以工作中用 listFiles() 的机会很多,用list()方法的情况很少。用list()还有一个非常不好的地方,就是列出来的文件和目录只有名字,没有完整路径,这样儿即使是想增强功能都难了。
//列出 d 盘下所有的文件和文件夹
File file = new File("d:" + File.separator) ;
File[] fileArray = file.listFiles() ;
for (File x : fileArray) {
	System.out.println(x) ;
}
//列出 d 盘下所有的文件和文件夹(包含子目录)
public static void main(String[] args) {
	File file = new File("d:" + File.separator) ;
	if (file.isDirectory() && file.listFiles() != null) print(file) ;
}
public static void print(File x) {
	for (File f : x.listFiles() ) {
		if (f.isDirectory() && f.listFiles() != null) print(f) ;
		System.out.println(f) ;
	}
}

综合练习(做一个资源管理器)

  • 依次显示 名称 -- 修改日期 -- 类型 -- 大小
File file = new File("d:" + File.separator) ;
File[] fileArray = file.listFiles() ;
for (File x : fileArray) {
	String str = x.getName() + "	" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(x.lastModified())) + "	" + (x.isDirectory()?"文件夹":"文件") + "	" + (x.isFile()?(new BigDecimal((double)x.length()/1024/1024).divide(new BigDecimal(1),2,BigDecimal.ROUND_HALF_UP) + "M"):"") ;
	System.out.println(str);
}
原文地址:https://www.cnblogs.com/haixianet/p/8692348.html