Java文件IO操作
- 一、File类
- 1.相对路径和绝对路径
- 2.路径分隔符(同一路径下、多个路径下)
- 3.实例化
- 4.常见方法
一、File类
File类继承自Object类,实现了Serializable接口和Comparable接口;
File类属于java.io包;
File类是文件或者文件目录的一种抽象表示,即可使用File类的具体实例化对象表示文件或者文件目录;
File类只能对文件或文件目录进行一个抽象表示,可对其属性特征进行一定的描述,而如果想要对文件内容进行读写则需要借助IO流(具体地,将File对象作为IO流构造器参数);
1.相对路径和绝对路径
基于参考系不同,文件路径描述可分为相对路径和绝对路径
相对路径:相对于该文件当前位置的路径,比如./hello.java表示当前目录下的hello.java文件;
绝对路径:该文件在文件系统中的详细存储位置,比如C:\javase\hello.java,即包括文件所在根目录的路径;
2.路径分隔符(同一路径下、多个路径下)
1)同一路径下
需要注意,不同操作系统中路径分隔符是不同的,比如Linux下路径分隔符为斜杠/,而Windows系统中为反斜杠\,但在java语言中反斜杠用于特殊字符转义,故在java中Windows系统的路径分隔符为\\。由于Java主打“一次编译,到处运行”,故代码编写时若不统一路径分隔符会导致在不同的操作系统上运行程序时会出现异常。Java官方为解决该问题,在File类中提供一静态属性separator,自动获取当前操作系统的路径分隔符。
使用方法如下:
File.separator
举例:
C:\\javase\\hello.java可在代码中表示为:C:+File.separator+javase+File.separator+hello.java
File.separator为字符串类型,故使用“+”进行字符串拼接操作,这种操作看起来比较繁琐,故我们可直接统一使用斜杠/作为路径分隔符即可。
2)多个路径下
此外,为了方便分隔多个路径,如“./xxx/yyy/c.txt;./xxx/yyy/d.txt”表示两个路径,File类提供静态属性pathSeparator进行此操作;
3)输出Windows系统中这四个属性的值:
System.out.println(File.pathSeparator);
System.out.println(File.pathSeparatorChar);
System.out.println(File.separator);
System.out.println(File.separatorChar);
对应输出:
;
;
\
\
3.实例化
提供以下四种构造器,用于创建File类对象:
1)File(String pathname)
pathname可为:
- 具体文件的相对路径或绝对路径;
- 文件目录的相对路径或绝对路径;
需要注意,此处的相对路径必须是相对于该项目根目录而言,及src目录的父目录;
// 其实此时File对象是一个抽象的路径表示
// 使用路径字符串表示文件路径或文件目录
File f1 = new File("./hello.txt");
System.out.println(f1);
File f2 = new File("F:\\IDEA_WorkSpace\\JavaIO\\JavaIO\\src\\com\\northsmile\\javaio\\hello.txt");
System.out.println(f2);
File f3 = new File("../demo");
System.out.println(f3);
File f4 = new File("F:\\IDEA_WorkSpace\\JavaIO\\JavaIO\\src\\com\\northsmile\\demo");
System.out.println(f4);
对应输出:
.\hello.txt
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\javaio\hello.txt
..\demo
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\demo
2)File(String parent,String child)
- parent为父目录;
- child为父目录下某子目录或文件所在子目录路径;
// 使用父路径(父目录)及子路径(子目录/文件所在子目录路径)构建
File f5 = new File("F:\\IDEA_WorkSpace\\JavaIO\\JavaIO\\src\\com", "northsmile");
System.out.println(f5);
File f6 = new File("F:\\IDEA_WorkSpace\\JavaIO\\JavaIO\\src\\com\\northsmile\\javaio", "hello.txt");
System.out.println(f6);
对应输出:
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\javaio\hello.txt
3)File(File parent,String child)
- parent为File类对象表示的父目录;
- child为父目录下某子目录或文件所在子目录路径;
// 使用File类对象表示父目录,以此结合子路径(子目录/文件所在子目录路径)构建
File f7 = new File(f5, "javaio/hello.txt");
System.out.println(f7);
File f8 = new File(f5, "javaio");
System.out.println(f8);
对应输出:
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\javaio\hello.txt
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\javaio
4.常见方法
方法签名 | 含义 |
---|---|
public String getAbsolutePath() | 获取绝对路径 |
public String getPath() | 获取路径,如创建File对象时填写的pathname |
public String getName() | 获取文件名或文件目录名 |
public String getParent() | 获取当前文件或目录的上级目录 |
public long length() | 获取文件长度,单位为字节数;不能用于获取目录的长度 |
public long lastModified() | 获该文件或目录最近一次修改时间,单位为毫秒 |
public String[] list() | 获取指定目录下所有文件名或子目录的名称数组(只有文件名或子目录名) |
public File[] listFiles() | 获取指定目录下所有文件名或子目录的File数组(路径名均表示为绝对路径形式) |
public boolean renameTo(File dest) | 将File对象表示的路径重命名 |
public boolean isDirectory() | 是否为目录 |
public boolean isFile() | 是否为文件 |
public boolean exists() | 指定路径是否存在 |
public boolean canRead() | 指定路径是否可读 |
public boolean canWrite() | 指定路径是否可写 |
public boolean isHidden() | 是否为隐藏文件 |
public boolean createNewFile() | 如果指定文件不存在,则自动创建该文件 |
public boolean mkdir() | 如果指定目录不存在,则自动创建指定目录。前提是该目录的父目录存在。 |
public boolean mkdirs() | 如果指定目录不存在,则自动创建指定目录。如果其父目录不存在,会自动为其创建父目录 |
public boolean delete() | 删除指定文件或目录(只能删除空目录) |
示例1:
如果指定路径在硬盘中真实存在,则在创建File对象时,则会对其属性进行具体赋值,比如文件长度等;反之如果不存在,则保持默认值。
// 针对文件
File file = new File("F:\\IDEA_WorkSpace\\JavaIO\\JavaIO\\src\\com\\northsmile\\javaio\\hello.txt");
System.out.println(file.getAbsolutePath());
System.out.println(file.getPath());
System.out.println(file.getName());
System.out.println(file.getParent());
System.out.println(file.length());
System.out.println(file.lastModified());
System.out.println("---------------------------");
// 针对文件目录
File dir = new File("F:\\IDEA_WorkSpace\\JavaIO\\JavaIO\\src\\com\\northsmile");
System.out.println(dir.getAbsolutePath());
System.out.println(dir.getPath());
System.out.println(dir.getName());
System.out.println(dir.getParent());
System.out.println(dir.lastModified());
System.out.println("---------------------------");
String[] fileNames=dir.list();
for (String name:fileNames){
System.out.println(name);
}
System.out.println("---------------------------");
File[] files=dir.listFiles();
for (File f:files){
System.out.println(f);
}
输出结果:
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\javaio\hello.txt
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\javaio\hello.txt
hello.txt
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\javaio
26
1677138552240
---------------------------
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile
northsmile
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com
1677138472477
---------------------------
demo
javaio
---------------------------
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\demo
F:\IDEA_WorkSpace\JavaIO\JavaIO\src\com\northsmile\javaio
Process finished with exit code 0
示例2:
// 重命名
File file1=new File("hello.txt");
File file2=new File("hi.txt");
System.out.println(file1.renameTo(file2));
renameTo表示将指定路径重命名为目标路径,重命名成功有两个前提:
- 源路径存在,目标路径不存在;
- 源路径-目标路径有两种对应形式:文件-文件或文件目录-文件目录,即可对文件或文件目录进行重命名;
示例3:
File file=new File("hello.txt");
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.exists());
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.isHidden());
输出结果:
false
true
true
true
true
false
示例4:
File file=new File("hi.txt");
if (!file.exists()){ // 如果该文件不存在
System.out.println("文件创建成功:"+file.createNewFile());
}else{
System.out.println("文件已存在,即将删除该文件。");
System.out.println("删除成功:"+file.delete());
}
File dir = new File("./testMkdir/demo");
if (!dir.exists()){
if (dir.mkdir()){
System.out.println("目录创建成功");
}else{
System.out.println("目录创建失败");
}
}else{
System.out.println("删除该空目录:"+dir.delete());
}
File dir = new File("./testMkdir/demo");
if (!dir.exists()){
if (dir.mkdirs()){
System.out.println("目录创建成功");
}else{
System.out.println("目录创建失败");
}
}else{
System.out.println("删除该空目录:"+dir.delete());
}