文件
Java中使用File类来描述一个文件
内核中需要管理文件:磁盘中有哪些文件以及哪些硬件设备 他的管理方式就是描述+组织
应用程序中也需要管理文件(相当于在管理当前进程打开/关联到的文件): 描述+组织
描述是使用File类描述,包含了文件的各种属性,以及提供了一些方法进行简单的文件操作
组织是用相应的数据结构进行组织
操作系统对于硬件设备进行了进一步的抽象: 把硬件设备都视为一个个文件
.exe .txt都是狭义上的 普通文件
c:windows 这是目录文件
快捷方式是链接文件
有一类特殊的文件,表示硬件设备
这是一切皆文件的思想
例如:通过网卡来传输数据,从网卡接受数据的操作就类似于读文件,从网卡中发送数据的操作就类似于写文件.
构造File对象的时候需要有一个pathname这样的参数.
这个参数叫做"文件的路径"
E:\BaiduNetdiskDownload\test.txt
根据这个路径一定能确定系统上唯一的一个文件
因为同一台主机上不可能存在两个文件的路径是完全相同的
但是路径也有两种表示方式
绝对路径:
以盘符开头的就是绝对路径
E:\
C:\
相对路径:
先指定一个工作目录,然后用.或者…开头的路径,表示一个具体的文件位置
相对路径的参照点就是当前的工作目录
例如:工作目录为:
E:\BaiduNetdiskDownload
此时相对路径就形如:
.\test.txt
" . " 就表示当前目录,(此处的当前目录就是工作目录,从当前目录的下级目录找
如果工作目录为:
E:\
那么此时相对路径就为:
.\BaiduNetdiskDownload\test.txt
所以当工作目录发生变化的时候,此时相对路径的写法,都会发生一些变化
上面的两个相对路径,对应的是同一个文件
“··” 表示工作目录的上一个目录
工作目录为:
E:\BaiduNetdiskDownload
那么相对目录为
..\BaiduNetdiskDownload\test.txt
那么构造File对象时,使用相对路径或者相对路径均可
代码部分
1.File
File file = new File("E:/BaiduNetdiskDownload/test.txt");
但是文件是否存在是不确定的
System.out.println(file.exists());
还可以看看文件的其他属性
File file = new File("E:/BaiduNetdiskDownload/test.txt");
System.out.println("文件是否存在"+ file.exists());
System.out.println("文件是否是普通文件"+ file.isFile());
System.out.println("文件是否是目录"+ file.isDirectory());
输出:
文件是否存在true
文件是否是普通文件true
文件是否是目录false
文件删除操作
File file= new File("E:/BaiduNetdiskDownload/test.txt");
file.delete();
System.out.println("文件是否存在"+ file.exists());
System.out.println("文件是否是普通文件"+ file.isFile());
System.out.println("文件是否是目录"+ file.isDirectory());
输出:
文件是否存在false
文件是否是普通文件false
文件是否是目录false
解释:因为文件已经被删除了,所以使用file描述的文件已经不存在了,也就不是文件了
创建文件
此时需要注意,createNewFile()方法会抛出一个IOException异常,所以我们要处理这个异常,这里我的操作是声明异常.
public static void main(String[] args) throws IOException {
//这样就构造了一个具体的文件对象,他就对应到了这个
File file = new File("E:/BaiduNetdiskDownload/test.txt");
file.createNewFile();
System.out.println("文件是否存在:"+ file.exists());
}
输出:
文件是否存在:true
由此可见,文件已经被创建了
上面的操作什么时候会触发异常呢,当磁盘没有剩余空间的时候,就会触发该异常
补充
在Windows中目录和目录之间使用反斜杠 \ 分割地址 (Windows上也支持使用/)
在其他系统中使用正斜杠/分割地址
Java使用File.separator借助这个变量来自动适应不同的系统.
创建文件夹
File file = new File("E:/BaiduNetdiskDownload/day");
System.out.println("创建文件前:");
System.out.println("文件是否存在:" + file.exists());
System.out.println("文件是否是普通文件:"+file.isFile());
System.out.println("文件是否是目录文件:"+file.isDirectory());
file.mkdir();
System.out.println("创建文件后");
System.out.println("文件是否存在:"+file.exists());
System.out.println("文件是否为普通文件:"+file.isFile());
System.out.println("文件是否为目录文件:"+ file.isDirectory());
输出:
创建文件前:
文件是否存在:false
文件是否是普通文件:false
文件是否是目录文件:false
创建文件后
文件是否存在:true
文件是否为普通文件:false
文件是否为目录文件:true
创建多级目录
此时要使用 mkdirs 而不是mkdir
File file = new File("E:/BaiduNetdiskDownload/day/1/2/3/4");
file.mkdirs();
System.out.println("文件是否存在:"+file.exists());
System.out.println("文件是否为目录文件:"+ file.isDirectory());
输出:
文件是否存在:true
文件是否为目录文件:true
取得上级目录
File file = new File("E:/BaiduNetdiskDownload/day/1/2/3/4");
System.out.println(file.getParent());
输出:
E:\BaiduNetdiskDownload\day\1\2\3
查看当前目录下的内容
File file = new File("E:/BaiduNetdiskDownload");
File[] files = file.listFiles();
for(File f : files) {
System.out.println(f);
}
输出:
E:\BaiduNetdiskDownload\day
E:\BaiduNetdiskDownload\test.txt
但是直接调用file.listFiles()只能看到当前目录下的内容
查看目录中的嵌套内容🌂
递归罗列出一个目录中包含的所有目录和文件
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:/BaiduNetdiskDownload");
listAllFiles(file);
}
private static void listAllFiles(File f) {
if(f.isDirectory()) {
//如果是目录就把目录包含的文件都罗列出来
File[] files = f.listFiles();
//如果是目录的话不会被打印,会一直向下递归到普通文件并打印普通文件
for(File file : files) {
listAllFiles(file);
}
}else {
//如果不是目录文件就把这个普通文件文件的内容打印出来
System.out.println(f);
}
}
}
输出:
E:\BaiduNetdiskDownload\day\1\2\3\4\test2.txt
E:\BaiduNetdiskDownload\test.txt