当前位置: 首页 > news >正文

Java文件操作:从“Hello World”到“Hello File”

在这里插入图片描述

🔍 开发者资源导航 🔍
🏷️ 博客主页: 个人主页
📚 专栏订阅: JavaEE全栈专栏

文件

什么是文件?

广义:操作系统进行资源管理的一种机制,很多的软件/硬件资源,抽象成“文件”来进行表示。

狭义:保存在硬盘上的文件

文件种类

二进制文件:根据冯诺依曼结构,所有的文件都是二进制的。

文本文件:文本文件是二进制文件中特殊的文件,它的二进制数据恰好可以构成字符,并且翻译过来可以构成有意义的信息。

区分方法:使用笔记本打开,能看懂的就是文本文件。

绝对路径和相对路径

路径是文件在电脑上的存储位置,计算机可以通过路径来找到文件,而路径又分为绝对路径和相对路径。

  • 绝对路径:从根路径到目的文件的完整位置。
D:\Lenovo\Documents
  • 相对路径:以某一个路径为基准的路径,假设你的基准为下述路径中的py_code,那么5.23.py的相对路径就是/5.23.py,code的相对路径就是./
D:\code\py_code\5.23.py

在相对路径中./表示上一层目录,../表示上两层目录(注:没有.../)。

正斜杠与反斜杠

在路径的表达中/\在不同的操作系统作为分隔符来用,在主流的操作系统中/是最常使用的,但是Windos因为历史遗留问题使用的是/来当做路径分隔符,但是现在的Windos系统两种分隔符都可以支持。

Java文件操作

java针对文件操作:

  1. 文件系统操作(删除、新建、重命名)
  2. 文件内容操作(针对一个文件的内容进行读和写)
方法说明常用场景
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♪(・ω・)ノ,如果觉得满意的话留个关注再走吧。

相关文章:

  • 做外贸网站需要多少钱百度大搜推广
  • 自己的网站就可以做app杭州百度seo
  • 真人性做爰video网站seo优化报告
  • 有专业做网站的吗网站公司2023年东莞疫情最新消息
  • 兼职给企业做网站seo怎么弄
  • 做关键词优化需要修改网站标题廊坊关键词排名优化
  • 打卡第28天:装饰器
  • 数据结构第2章绪论 (竟成)
  • CVE-2017-5645源码分析与漏洞复现(反序列化)
  • P1104 生日
  • go1.24 通过汇编深入学习map引入swiss table后的源码
  • MySQL | 比特BIT类型的使用指南
  • 深入剖析 RocketMQ:消息保障、事务处理与负载均衡策略
  • 【数学基础】范数及其应用
  • Python元类(Metaclass)深度解析
  • MCP技术体系介绍
  • 红外光和可见光的图像融合,分为增强和融合两块
  • 【备忘】 windows 11安装 AdGuardHome,实现开机自启,使用 DoH
  • 【数据集】2020年150m分辨率全球城市建筑高度数据集
  • vue3: baidumap using typescript
  • 基于大模型的慢性硬脑膜下血肿诊疗技术方案
  • ROS云课三分钟-阿克曼车式移动机器人倒车入库出库测试实验
  • 台系厂商SSD主控之争:Phison对决SMI
  • xss-labs第15关
  • 2、YOLOv12架构解析:速度与精度的艺术
  • sqli-labs第二十六关——Trick with commentspace