File类总结
- 所在包:
java.io
- File类直接继承Object类,实现了两个接口
Serializable
和Comparable<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:\text.txt" ,此时问题出现了,\t代表的是制表符,所以程序会报错。 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() + "\t" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(x.lastModified())) + "\t" + (x.isDirectory()?"文件夹":"文件") + "\t" + (x.isFile()?(new BigDecimal((double)x.length()/1024/1024).divide(new BigDecimal(1),2,BigDecimal.ROUND_HALF_UP) + "M"):"") ; System.out.println(str); }