【JavaEE初阶】文件IO(上)
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
路径
绝对路径
相对路径
文件类型
文件的操作
File类
文件系统操作
创建文件,获取路径
删除文件
列出所有路径
路径修改
创建目录 mkdir和mkdirs
服务器领域,机械硬盘仍然是一个主流的应用场景
机械硬盘在进行 顺序读写时,效率是相对比较高的,在进行 随机读写时,效率比较低
在一个电脑上,有很多文件,都是需要靠操作系统进行组织管理的(文件系统)
路径
文件系统上的目录结构 是一个"树形结构"(N叉树),基于这种结构,就可以找到某个文件在硬盘上的具体位置 ;
路径中,约定使用 分隔符,分割目录,
- \(反斜杠) 在字符串中,必须通过\\转义字符去表示
- /(斜杠): 绝大部分系统 都是使用/作为目录的分隔符,只有Windows两种都可以使用
路径 也可以认为是文件的一种 身份标识符(区分出唯一的一个文件)
表示路径的两种风格:绝对路径 和 相对路径
绝对路径
从盘符开始,一直到文件名结束
相对路径
相对路径有一个"参考系"("基准路径"或"工作路径"),如果基准目录不同,对应的相对路径也是不同的
- .表示当前路径
- ..表示上一路径
比如约定E:\code_java\java2024\j9_3_Thread为当前路径,要找到Demo3.java文件,其相对路径是 .\thread\Demo3.java
文件类型
文件类型分为 文本文件和二进制文件
文本文件里存储的所有内容都是"文本"(合法的字符),但是本质上内部存的还是二进制,只不过这些二进制数据都有据可查(通过字符集)
- 针对文本文件,Java把文本文件读取出来的时候会自动查询码表,把二进制内容转成一个个字符
- 二进制文件则没有上述的转换过程(word docx这个文件也是二进制文件)
文件的操作
包含两大类:文件系统操作(创建/删除文件 ,创建目录,重命名文件,判定文件存在)和 文件内容操作(读文件,写文件)
Java中提供了File类,进行文件系统操作,这个对象 会使用"路径"进行初始化,从而表示一个具体的文件(这个文件可以是存在的,也可以是不存在的)
File类
下面介绍File类的属性 ,构造方法 和方法
代码中写作 相对路径的基准目录取决于运行程序的方式:
- 直接在idea中运行,此时基准路径就是该项目所在的目录
- 在命令行中,通过Java命令运行,此时基准路径就是Java命令所处的目录
- 某个程序,可能是被其他进程调用的.进程1通过创建子进程的方式,运行进程2(虽然在java中很少见,但是可以做到)进程2的基准路径,就和进程1相同.
- 代码执行过程中,还可以通过一些api修改基准路径,改成我们指定的某个路径
文件系统操作
创建文件,获取路径
File file = new File("C:\\用户\\1\\test.txt");System.out.println(file.getParent());System.out.println( file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());
用相对路径在 该项目的 相对目录下创建文件
File file = new File("./test.txt");//文件可以是不存在的Boolean ok=file.exists();System.out.println(ok);Boolean ok2=file.createNewFile();//表示在当前目录下创建一个test文件System.out.println(ok2);System.out.println(file.exists());System.out.println(file.isFile());System.out.println(file.isDirectory());
创建文件createNewFile时,很可能会抛出异常,有以下原因
- 硬盘空间不够. 尤其是服务器,会存储很多数据(每天都会产生很多内容),会记录很多日志
- 没有权限. 确保你具有的权限,才能进行,文件的权限,典型的两个:读和写
删除文件
deleteteOnExit表示进程结束后删除文件,存在的意义 是可以用来构造"临时文件".
比如使用word创建一个文件,打开"显示隐藏文件",在word文档的同级目录下,存在一个临时文件(用于保存当前正在修改还没有真正保存的内容,程序异常关闭时,临时文件不会消失,而是通过这个文件还原出你正在编辑的内容),一旦你把编辑文档关闭了,这个隐藏文件就会自动消失.
直接使用list/listFiles 只能看到当前目录中的内容
列出所有路径
如果想看到某个目录下所有的目录和文件, 需要使用递归来完成(经典面试题)
import java.io.File;public class Demo2_list {public static void scan(File currentDir){//判断是否是目录if(! currentDir.isDirectory()){return ;}//2.列出目录下的所有内容File[] files=currentDir.listFiles();if(files==null || files.length==0 ){return;//不存在的路径和 空目录返回}//3.打印当前目录的路径System.out.println(currentDir.getAbsolutePath());//4.遍历所有文件,是文件就打印,是目录 就继续递归for (File f:files) {if(f.isFile()){System.out.println(f.getAbsolutePath());}else{scan(f);}}}public static void main(String[] args) {File f=new File("./");scan(f);}
}
路径修改
文件路径的修改 也可以视为是一种"重命名",移动文件 就是修改文件所在的路径
import java.io.File;
import java.io.IOException;public class Demo8 {public static void main(String[] args) throws IOException {File srcFile = new File("./abc1234/def");File destFile = new File("./def");srcFile.createNewFile();boolean ok = srcFile.renameTo(destFile);//将srcFile的名字改为destFile,System.out.println(ok);}
}