🔍 开发者资源导航 🔍 |
---|
🏷️ 博客主页: 个人主页 |
📚 专栏订阅: JavaEE全栈专栏 |
文件
什么是文件?
广义:操作系统进行资源管理的一种机制,很多的软件/硬件资源,抽象成“文件”来进行表示。
狭义:保存在硬盘上的文件
文件种类
二进制文件:
根据冯诺依曼结构,所有的文件都是二进制的。
文本文件:
文本文件是二进制文件中特殊的文件,它的二进制数据恰好可以构成字符,并且翻译过来可以构成有意义的信息。
区分方法:使用笔记本打开,能看懂的就是文本文件。
绝对路径和相对路径
路径是文件在电脑上的存储位置,计算机可以通过路径来找到文件,而路径又分为绝对路径和相对路径。
绝对路径:
从根路径到目的文件的完整位置。
D:\Lenovo\Documents
相对路径:
以某一个路径为基准的路径,假设你的基准为下述路径中的py_code
,那么5.23.py
的相对路径就是/5.23.py
,code的相对路径就是./
。
D:\code\py_code\5.23.py
在相对路径中./
表示上一层目录,../
表示上两层目录(注:没有.../
)。
正斜杠与反斜杠
在路径的表达中/
与\
在不同的操作系统作为分隔符来用,在主流的操作系统中/
是最常使用的,但是Windos因为历史遗留问题使用的是/
来当做路径分隔符,但是现在的Windos系统两种分隔符都可以支持。
Java文件操作
java针对文件操作:
- 文件系统操作(删除、新建、重命名)
- 文件内容操作(针对一个文件的内容进行读和写)
方法 | 说明 | 常用场景 |
---|---|---|
boolean exists() | 检查文件/目录是否存在 | 操作文件前的安全检查 |
boolean isFile() | 判断是否是普通文件 | 区分文件和目录 |
boolean isDirectory() | 判断是否是目录 | 遍历目录时检查 |
String getName() | 获取文件/目录名称 | 获取文件名(不含路径) |
String getPath() | 获取完整路径字符串 | 显示或记录文件路径 |
String getAbsolutePath() | 获取绝对路径 | 需要绝对路径的场景 |
long length() | 获取文件大小(字节数) | 检查文件大小 |
boolean createNewFile() | 创建新空文件 | 需要新建文件时 |
boolean mkdir() | 创建单层目录 | 新建目录 |
boolean mkdirs() | 创建多级目录 | 创建嵌套目录结构 |
boolean delete() | 删除文件/空目录 | 文件清理 |
String[] list() | 列出目录内容 | 遍历目录文件 |
File[] listFiles() | 列出目录内容(返回File对象) | 需要操作子文件时 |
boolean canRead() | 检查是否可读 | 权限检查 |
boolean canWrite() | 检查是否可写 | 权限检查 |
long lastModified() | 获取最后修改时间 | 文件监控/同步 |
代码演示:
public static void main(String[] args) throws IOException {String fileName = "D:/tmp/crashes/a.txt";File file = new File(fileName);//createNewFile如果不存在创建并返回true否则只返回Falseif (file.createNewFile()) {System.out.println(file.exists());System.out.println("创建成功!");} else {System.out.println("文件已存在!");}System.out.println(file.getPath());System.out.println(file.lastModified());}
稍微会用即可,如果工作中有需要再查看API文档。
进阶代码:查看当前目录下的所有的文件
public static void main(String[] args) {File file = new File("D:\\code");dfs(file, 0);}public static void dfs(File file, int cnt) {if (file.isDirectory()) {for (int i = 0; i < cnt * 2; i++) {System.out.printf(" ");}System.out.printf(file.getName() + "{\n");for (File f: file.listFiles()) {dfs(f, cnt + 1);}for (int i = 0; i < cnt * 2; i++) {System.out.printf(" ");}System.out.printf("}\n");}else {for (int i = 0; i < cnt * 2; i++) {System.out.printf(" ");}System.out.println(file.getName() + " ");}}//为了输出好看一些,代码写的有点丑哈哈~
流操作
Java 中的文件流操作是 I/O 系统的核心部分,主要用于读写文件数据。
流类型 | 特点 | 典型类 |
---|---|---|
字节流 | 以字节(8bit)为单位操作 | InputStream /OutputStream |
字符流 | 以字符(16bit)为单位操作 | Reader /Writer |
缓冲流 | 带缓冲区的高效流 | BufferedInputStream 等 |
转换流 | 字节流与字符流转换 | InputStreamReader 等 |
字节和字符
字节!=字符,一个字符占多少字节由编码方式决定。例如一个汉字utf-8中占三个字节,而在gbk中占两个字节。
字节流
// 文件复制(字节流)
try (InputStream in = new FileInputStream("source.txt");OutputStream out = new FileOutputStream("target.txt")) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}
} catch (IOException e) {e.printStackTrace();
}
字符流
// 文本文件读取(字符流)
try (BufferedReader reader = new BufferedReader(new FileReader("text.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}
注意事项
流操作相关的类都需要进行手动关闭,gc虽然能够管理内存,但是不能自动管理文件,需要咱们手动释放。如果不释放就会引起文件资源泄露问题。
因此我们建议使用try-with-resources来进行自动关闭,在try()小括号里面创建并且实现了Closable接口的类都会在结束时自动关闭,而流操作恰好符合这个方式。
try (BufferedReader reader = new BufferedReader(new FileReader("text.txt"))) {//代码逻辑
}
总结
字符流和字节流的两个代码,都是对的,不矛盾的~~字节流读到的是文件中原始的数据,在硬盘上保存文件的时候,就是6 个字节(utf-8)。
如果是文本文件建议使用字符流,二进制文件建议使用字节流。
感谢各位的观看Thanks♪(・ω・)ノ,如果觉得满意的话留个关注再走吧。