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

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♪(・ω・)ノ,如果觉得满意的话留个关注再走吧。

http://www.xdnf.cn/news/8844.html

相关文章:

  • 嵌入式知识篇---热熔胶
  • 22 程序控制语句详解:跳转控制(break、continue、goto)、死循环应用、程序控制编程实战
  • SQL进阶之旅 Day 3:索引基础与应用
  • conda 环境中opencv 报错以及其他报错
  • OD 算法题 B卷【寻找最大价值的矿堆】
  • 匿名内部类与函数式编程
  • MYSQL中的分库分表
  • CQF预备知识:Python相关库 -- NumPy 基础知识 - ndarray 索引
  • MedGemma 简介
  • leetcode3-无重复字符的最长子串
  • Spring Security框架全面解析与应用实践
  • gcc编译优化参数-O0和-Os区别
  • 先知AI打造智能企业引擎
  • kaggle房价预测-0.12619-排名:757
  • ARM架构深度解析:从指令集到内核设计
  • 机械师安装ubantu双系统:二、磁盘分区
  • 小可爬楼
  • 通过 Terraform 构建您的第一个 Azure Linux 虚拟机
  • 湖仓融合的“最后一公里”:StarRocks 存算分离如何优化湖上实时分析?
  • openssl 使用生成key pem
  • 万事如函数
  • Windows File Copy
  • 第11次课 while循环
  • (27)运动目标检测 之 分类(如YOLO) 数据集自动划分
  • 关于多类型数据划分清洗的整理
  • 09_模型训练篇-卷积(上):如何用卷积为计算机“开天眼”?
  • 【C语言】指针全局变量
  • PostGIS使用小结
  • 微雪墨水屏 如何 控制绘制图形(如点、线、矩形等)线条粗细或点的大小
  • ChatGPT+知网,AI如何辅助真实科研写作流程?