第17章 文件类
2019-04-16 本文已影响144人
yangsg
Java提供了对操作系统中文件进行操作的文件类,其类名是java.io.File类,其中包含了对文件和目录(文件夹)操作的一系列API方法。
需要注意的是,
- java.io.File类可以指向一个尚不存在的文件或目录
- File类不操作文件中的内容,只操作文件或目录自身
1. 静态属性
主要用于表示系统中路径分隔符,在不同的系统中有不同的分隔符。比如“C:\Program Files\Java”路径中的“\”就是路径分隔符。
- static String pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
- static char pathSeparatorChar
与系统有关的路径分隔符。
- static String separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
- static char separatorChar
与系统有关的默认名称分隔符。
2.构造方法
- File(String path)
创建一个path路径表示的文件或者目录对象
- File(String parent, String child)
创建一个在parent路径下名字为child的文件或者目录对象
- File(File parent, String child)
创建一个在parent对象表示的路径下名字是child的文件或者目录对象
- File(Uri uri)
通过给定的uri对象创建一个文件或者目录对象
3. API方法
- canRead()和canWrite()
返回值:boolean
测试某个文件是否可读或可写
比如某个文件是“只读”的,其测试结果如下
File f = new File("c:/1.txt"); //只读文件
boolean b1 = f.canRead(); // true
boolean b2 = f.canWrite(); // false
- createNewFile()
返回值:boolean
创建新文件,这个方法只能创建文件,不能用于创建目录(文件夹)
File f = new File("c:/1.txt"); //文件不存在
f.createNewFile(); //创建文件
如果想通过该方法在c盘下创建一个abc目录,执行下面的代码是不成功的,只能建立一个没有扩展名的,名字是abc的文件
File f = new File("c:/abc");
f.createNewFile();

如果想创建一个在c盘xyz目录下1.txt文档,执行下面的代码是不成功的,因为c盘中没有xyz目录。createNewFile()方法不会创建中间所需的目录
File f = new File("c:/xyz/1.txt");
f.createNewFile();

- mkdir()
返回值boolean
创建一级目录,这个方法只能用于创建一级目录,不能用于创建文件或多级目录
示例:在c盘下创建目录abc,成功
File f = new File("c:/abc");
f.mkdir();
示例:在c盘下创建目录abc/xyz,成功。因为c盘刚刚在上一个示例中创建了abc目录,所以可以在abc中创建xyz目录
File f = new File("c:/abc/xyz");
f.mkdir();
示例:在c盘下创建目录x/y/z,失败。因为c盘在创建目录z时没有找到前置的父目录x/y,但程序不会出现异常。
File f = new File("c:/x/y/z");
f.mkdir();
- mkdirs()
返回值boolean
mkdirs()可以理解为是mkdir()的加强版,它可以将路径中缺失的目录一并创建出来
示例:在c盘下创建目录x/y/z,成功。因为c盘在创建目录z时可以将缺失的x/y目录一并创建出来
File f = new File("c:/x/y/z");
f.mkdirs();
- exists()
返回值:boolean
判断对象所表示的文件或目录是否存在
File f = new File("c:/x/y/z");
boolean b = f.exists() //true
如果想在c:/1/2/3/中创建haha.txt,比较好的做法是
File path = new File("c:/1/2/3");
if(!path.exists()){// 先判断目录是否存在
path.mkdirs();
}
File file = new File(path, "haha.txt"); //在path对象表示的路径(c:/1/2/3)中创建haha.txt文件
file.createNewFile();
- delete()
返回值:boolean
删除对象所表示的文件或目录,文件或目录不存在也不会报错
File f = new File("c:/1.txt");
f.delete();
- getName()
返回值:String
得到对象所表示的文件或目录最后一级的名字
File f1 = new File("c:/1.txt");
File f2 = new File("c:/a/b/c");
String a = f1.getName(); // 1.txt
String b = f2.getName(); // c
- getParent()
返回值:String
得到对象所表示的文件或目录所在的父级目录(字符串形式)
File f1 = new File("c:/1.txt");
File f2 = new File("c:/a/b/c");
String a = f1.getParent(); // c:/
String b = f2.getParent(); // c:/a/b
- getParentFile()
返回值:File
得到对象所表示的文件或目录所在的父级目录(File形式)
File f1 = new File("c:/1.txt");
File f2 = new File("c:/a/b/c");
File a = f1.getParentFile(); /* c:/ */
File b = f2.getParentFile(); /* c:/a/b */
- getPath()
返回值:String
得到对象所表示的文件或目录的完整路径
File f1 = new File("c:/1.txt");
File f2 = new File("c:/a/b/c");
String a = f1.getPath(); // c:/1.txt
String b = f2.getPath(); // c:/a/b/c
- length()
返回值:long
得到文件的大小(Byte)
File f = new File("c:/abc");
System.out.println(f.length());

- isFile()
返回值:boolean
判断对象是否为文件
File f1 = new File("c:/1.txt");
File f2 = new File("c:/a/b/c");
boolean a = f1.isFile(); // true
boolean b = f2.isFile(); // false
- isDirectory()
返回值:boolean
判断对象是否为目录(文件夹)
File f1 = new File("c:/1.txt");
File f2 = new File("c:/a/b/c");
boolean a = f1.isDirectory(); // false
boolean b = f2.isDirectory(); // true
- isHidden()
返回值:boolean
判断对象是否为隐藏文件
设置1.txt为隐藏
File f1 = new File("c:/1.txt");
File f2 = new File("c:/a/b/c");
boolean a = f1.isHidden(); // true
boolean b = f2.isHidden(); // false
- list()
返回值:String[]
返回某个路径下所有的子目录和子文件的字符串数组(只有直属于该目录的目录和文件才会被统计)
File f = new File("C:/Program Files/Java/jdk1.8.0_101");
String[] fs = f.list();
for(String t : fs) {
System.out.println(t);
}
运行结果

- listFiles()
返回值:File[]
返回某个路径下所有的子目录和子文件的文件对象数组(只有直属于该目录的目录和文件才会被统计)
File f = new File("C:/Program Files/Java/jdk1.8.0_101");
File[] fs = f.listFiles();
for(File t : fs) {
System.out.println(t.getName()+"\t"+t.length()+"Byte");
}
运行结果

4. 练习
在控制台上模拟windows系统的cmd窗口,并实现以下指令
- cd xx
进入当前路径下的子目录xx,如果xx不存在则提示错误
- cd..
返回上一级目录,如果已经到达盘符根目录,则执行后没有效果
- dir
显示当前路径下的所有子目录和文件,需要显示文件名,大小,文件/文件夹
所有的指令都是忽略大小写都可以执行的