在IO流中,我们需要对数据流进行输入和输出,而文件是我们存储数据的一大载体,因此在IO流中对文件进行的操作是我们利用IO技术实现输入输出的重要方法。下面来介绍关于File类的操作。
在IO流中主要有五大类和三大接口:
五大类:
1.File类(文件类) 2.InputStream类(文件输入流) 3.OutputStream类(文件输出流) 4.Reader类(字符输入流) 5.Writer类(字符输出流)
三大接口:
1.closeable(关闭流接口) 2.Flushable(刷新流接口) 3.Serializable(序列化接口)
首先要明确一点,File不只指文件,也可能是文件夹,也可能是不存在的文件。因此在学习IO流前,应先对文件类的操作有基本的了解。
了解文件类之前,先了解路径及分隔符。
一.路径,分隔符
1.路径:路径有绝对路径与相对路径之分
绝对路径:带盘符的路径
相对路径:不带盘符的路径(相对路径,都是相对于user.dir)。user.dir:Java项目的最低层文件夹,也就是用户的目录。
下面用一段代码来测试绝对路径与相对路径:
public class TestFile03 {
public static void main(String[] args) {
String path = "D:/JAVA program/4dead99f67999407561e6a041f4c32d8.jpg";
//绝对路径
File src = new File(path);
System.out.println(src.getAbsolutePath()); //获得绝对路径
src = new File("D:/JAVA program/"+"4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println(src.getAbsolutePath()); //获得绝对路径
//创建一个相对路径对象(无盘符)
System.getProperty("user.dir"); //用户的目录
System.out.println(System.getProperty("user.dir"));
src = new File("4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println(src.getAbsolutePath()); //获得绝对路径,相对于user.dir
//构建一个不存在的文件
src = new File("aaa/IO2");
System.out.println(src.getAbsolutePath());
}
}
代码运行结果如下:
D:\JAVA program\4dead99f67999407561e6a041f4c32d8.jpg
D:\JAVA program\4dead99f67999407561e6a041f4c32d8.jpg
D:\JAVA program
D:\JAVA program\4dead99f67999407561e6a041f4c32d8.jpg
D:\JAVA program\aaa\IO2
综上可知:
user.dir输出的是用户的目录,即存储Java程序的根目录D:\JAVA Program
可以通过getAbsolutePath()获取绝对路径
绝对路径时相对于user.dir来说的
也可以构建一个不存在的路径
2.分隔符:分隔符有路径分隔符和名称分隔符
路径分隔符:例如:"D:\JAVA program"中的":"即为路径分隔符。
名称分隔符:例如:"D:\JAVA program"中的"\"即为路径分隔符。
特别注意:当我们指定一个字符串为文件路径时,对于名称分隔符的处理有三种方式:
String path = "D:\\JAVA program\\4dead99f6.jpg";
String path1 = "D:/JAVA program/4dead99f6.jpg"; //推荐这种写法,可以做到跨平台
String path2 = "D:"+ File.separator+"JAVAprogram"+File.separator+"4dead99f6.jpg";
第一种:使用转义字符"\\"进行转义为"\",但无法实现跨平台。因为Java是跨平台的语言,而在别的平台上,"//"可能无法被识别,因此这段路径就不可读,因此无法实现跨平台。
第二种:使用"/",这种是推荐写法,可以做到跨平台。
第三种:也可以采用字符串拼接的方式来表示路径 separator:常量,表示与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。但较为麻烦,不易读。
二.构建File对象
构建File对象的常用方法有三种:
1.利用path构建一个File对象。
2.从父路径名字符串和子路径名字符串创建新的 File实例。
3.从父路径名字符串和子路径名字符串创建新的 File实例。
代码如下:
public class TestFile {
public static void main(String[] args) {
String path = "D:/JAVA program/4dead99f67999407561e6a041f4c32d8.jpg";
//一.利用path构建一个File对象
File src = new File(path);
System.out.println(src.length()); //输出文件的大小(Byte)
//二.从父路径名字符串和子路径名字符串创建新的 File实例。
src = new File("D:/JAVA program/"+"4dead99f67999407561e6a041f4c32d8.jpg");
src = new File("D:/"+"JAVA program/4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println(src.length());
//三.从父抽象路径名和子路径名字符串创建新的 File实例。父对象,子名称
src = new File(newFile("D:/JAVA program/"),"4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println(src.length());
}
}
三.File类的常用方法
第一部分:路径类
1.file.getPath():获取文件路径。传入的是绝对路径,就获取绝对路径。传入的是相对路径,就获取相对路径。
2.file.getName():获取文件名称
3.file.getAbsolutePath():获取文件的绝对路径
4.file.getParent():获得父路径。子路径前没有路径,则返回null。否则子路径前有几层路径就返回几层路径。
5.file.getParentFile():获得父对象
file.getParentFile().getName():获得子路径上一层的路径名称。
file.getParentFile().getPath():父对象,返回上面的路径(包括父对象本身)。
file.getParentFile().getAbsolutePath():获得父对象的绝对路径。
/**
* getName():名称
* getPath():是绝对就返回绝对,是相对就返回相对
* getAbsolutePath():返回绝对路径
* getParent():返回父路径。返回指定文件上面的路径,如果上面的路径不存在,就返回null
* getParent():返回父对象。父对象:上一级对象
*/
public class TestFile {
public static void main(String[] args) {
File file = new File("D:\\JAVA program\\4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println("名称:"+file.getName()); //获取文件名称
System.out.println("路径:"+file.getPath()); //获取文件路径。是绝对路径就获取绝对路径,是相对路径就获取相对路径
file = new File("4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println("路径:"+file.getPath()); //获取相对路径
System.out.println("绝对路径:"+file.getAbsolutePath()); //获取文件的绝对路径
file = new File("D:\\JAVA program\\4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println("父路径:"+file.getParent()); //父路径:D:\JAVA program
file = new File("4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println("父路径:"+file.getParent()); //null 名称分隔符前面没有路径,返回空。有一层就返回一层,有多层就返回多层
file = new File("D:\\JAVA program\\JAVA Pro10[IO01]\\src\\cn\\gjw\\gao\\IO01\\4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println("父对象:"+file.getParentFile().getName()); //父对象,返回上一级的名称:IO01
System.out.println("父对象:"+file.getParentFile()); //获取父对象
System.out.println("父对象:"+file.getParentFile().getPath()); //父对象,返回上面的路径(包括父对象本身)
System.out.println("父对象:"+file.getParentFile().getAbsolutePath()); //同上
运行结果如下:
名称:4dead99f67999407561e6a041f4c32d8.jpg
路径:D:\JAVA program\4dead99f67999407561e6a041f4c32d8.jpg
路径:4dead99f67999407561e6a041f4c32d8.jpg
绝对路径:D:\JAVA program\4dead99f67999407561e6a041f4c32d8.jpg
父路径:D:\JAVA program
父路径:null
父对象:IO01
父对象:D:\JAVA program\JAVA Pro10[IO01]\src\cn\gjw\gao\IO01
父对象:D:\JAVA program\JAVA Pro10[IO01]\src\cn\gjw\gao\IO01
父对象:D:\JAVA program\JAVA Pro10[IO01]\src\cn\gjw\gao\IO01
第二部分:文件状态类
1.file.exists():文件是否存在。
2.file.isFile():是否是文件。
3.file.isDirectory():是否是文件夹。
代码如下:
file = new File("file\\cn\\gjw\\gao\\IO01\\4dead99f67999407561e6a041f4c32d8.jpg");
System.out.println("是否存在:"+file.exists());
System.out.println("是否文件:"+file.isFile());
System.out.println("是否文件夹:"+file.isDirectory());
第三部分:文件大小,创建、删除文件
1.file.length():获取文件,文件夹,不存在的文件的大小。
2.file.createNewFile():创建相关文件,若存在则创建失败。
3.file.delete():删除相关文件,若已删除或不存在则失败。
file.length()代码如下:
public class TestFile {
public static void main(String[] args) {
//文件大小
File file = new File("D:/JAVAprogram/JAVA/Pro10[IO01]/src/cn/gjw/gao/IO01/4d.jpg");
System.out.println("长度:"+file.length());
//文件夹大小:0
file = new File("D:/JAVA program/JAVA Pro10[IO01]/src/cn/gjw/gao");
System.out.println("长度:"+file.length());
//不存在的文件:0
file = new File("D:/JAVA program/JAVA Pro10[IO01]/src/cn/gjw/gao/IO01/4d.jpg/01");
System.out.println("长度:"+file.length());
}
}
file.createNewFile(),file.delete()代码如下:
public class TestFile {
public static void main(String[] args) throws IOException {
File file = new File("D:/JAVA program/io.txt");
boolean flag = file.createNewFile(); //有可能出现异常,创建失败,抛出异常即可
System.out.println(flag);
flag = file.delete();
System.out.println(flag);
//不能创建文件夹
file = new File("D:\\游戏\\DoyoGames\\Download\\10101072"); //由D:\游戏\DoyoGames\Download\10101071将1改为2,则会创建一个无后缀文件,而不会创建一个文件夹
flag = file.createNewFile(); //不能再加boolean,否则会重复声明
System.out.println(flag);
//删除文件
flag = file.delete();
System.out.println(flag);
//con是操作系统的设备名,不能正确创建
file = new File("D:/JAVA program/con");
file.createNewFile();
}
}
特别注意:1.file.createNewFile()不能创建文件夹。
2.当不加文件后缀名时,系统会创建没有后缀名的文件,但不会创建文件夹。
3.不能将文件命名为con,因为con是操作系统的设备名,不能正确创建。
第四部分:对文件夹的操作
1.file.mkdirs():创建整个目录(文件夹)。
2.file.mkdir():上一级目录(文件夹)存在,才会创建下一级目录(文件夹)。
3.file.list():列出下一级文件和目录名称。
4.file.listFiles():列出下一级对象。
5.file.listRoots():列出所有盘符。
代码如下:
public class TestFile {
public static void main(String[] args) {
//mkdirs
File file = new File("D:/JAVA program/dir/file01");
boolean flag = file.mkdirs();
System.out.println(flag);
//mkdir
file = new File("D:/JAVA program/dir/file02");
flag = file.mkdir(); //文件夹dir存在才会创建file02,否则不会创建
System.out.println(flag);
//list只返回下一层文件和目录名称
file = new File("D:/JAVA program");
String[] subNames = file.list();
//增强for循环,输出JAVA program下一级的名称
for (String names : subNames){
System.out.println(names);
}
//listFile:返回下一层目录对象的路径
file = new File("D:/JAVA program");
File[] subFiles = file.listFiles();
for (File files : subFiles){
System.out.println(files.getAbsolutePath());
}
//列出所有盘符
file = new File("D:/JAVA program");
File[] roots = file.listRoots();
for (File temp : roots){
System.out.println(temp.getAbsolutePath());
}
}
}