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.pswp.cn/diannao/84449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025第三届黄河流域网络安全技能挑战赛--Crypto--WriteUp

2025第三届黄河流域网络安全技能挑战赛–Crypto–WriteUp Crypto sandwitch task from Crypto.Util.number import * import gmpy2 flag bflag{fake_flag} assert len(flag) 39 p getPrime(512) q getPrime(512) n p * q e 0x3 pad1 beasy_problem pad2 bHow_to_so…

三重天理论

第一重天&#xff1a;公理层&#xff08;形而上地基&#xff09; 这里构建的是人类理性的"操作系统"&#xff0c;公理作为不证自明的逻辑起点&#xff08;如矛盾律/同一律&#xff09;&#xff0c;恰似海德格尔所说的"存在之镜"。黑格尔辩证法在此显现为动…

2025年第八届广西大学生程序设计大赛(正式赛)题解(更新中)

知乎评价&#xff1a;如何评价2025年第八届GXCPC广西大学生程序设计大赛暨中国-东盟国际大学生程序设计大赛&#xff1f; 榜单&#xff1a;牛客比赛排名 题目链接&#xff1a;第八届广西大学生程序设计大赛暨2025邀请赛 TIP&#xff1a;提交处可查看别人过题代码 难度签到题普通…

WHAT - 兆比特每秒 vs 兆字节每秒

文章目录 Mbps 解释Mbps 和 MB/s&#xff08;兆字节每秒&#xff09;换算总结网络场景1. 在路由器设置中的 Mbps2. 在游戏下载时的 Mbps / MB/s总结 Mbps 解释 首先&#xff0c;Mbps 是一个常见的网络带宽单位&#xff0c;意思是&#xff1a; Megabits per second&#xff08;…

[C语言实战]C语言内存管理实战:实现自定义malloc与free(四)

[C语言实战]C语言内存管理实战&#xff1a;实现自定义malloc与free&#xff08;四&#xff09; 摘要&#xff1a;通过实现简化版的内存管理器&#xff0c;深入理解动态内存分配的核心原理。本文包含内存块设计、分配算法、空闲合并策略的完整实现&#xff0c;并附可运行的代码…

YOLOv8源码修改(5)- YOLO知识蒸馏(下)设置蒸馏超参数:以yolov8-pose为例

目录 前言 1. 不同蒸馏算法资源占用 2. 不动态调整蒸馏损失 2.1 训练定量化结果 2.1 训练结果可视化结果 3. 动态调整蒸馏损失权重及实验分析 3.1 余弦衰减和指数衰减 3.2 CWD蒸馏损失 3.3 MGD蒸馏损失 3.4 AT蒸馏损失 3.5 SKD和PKD蒸馏损失 4. 调权重心得总结 5…

历年华东师范大学保研上机真题

2025华东师范大学保研上机真题 2024华东师范大学保研上机真题 2023华东师范大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school?classification1 简单一位数代数式计算 题目描述 给一个小学生都会算的1位数与1位数运算的代数式&#xff0c;请你求出这个表…

Oracle 中 SHRINK 与 MOVE 操作的比较

Oracle 中 SHRINK 与 MOVE 操作的比较 在 Oracle 数据库中&#xff0c;SHRINK 和 MOVE 都是用于重组表和索引以减少空间碎片的重要操作&#xff0c;但它们在实现方式和适用场景上有显著区别。 SHRINK 操作 基本语法 ALTER TABLE table_name SHRINK SPACE [COMPACT] [CASCAD…

展锐 Android 15 锁定某个App版本的实现

Android 15 系统锁定Antutu版本的实现方法 在Android系统开发中,有时需要锁定特定应用的版本以确保系统稳定性或测试一致性。本文将介绍如何通过修改Android源码来锁定Antutu跑分软件的版本。 修改概述 这次修改主要涉及以下几个方面: 禁用产品复制文件的检查添加指定版本…

视频剪辑SDK定制开发技术方案与报价书优雅草卓伊凡

视频剪辑SDK定制开发技术方案与报价书-优雅草卓伊凡 一、项目概述 客户需求&#xff1a;开发一套跨平台&#xff08;Android/iOS/Uni-App&#xff09;视频剪辑SDK&#xff0c;包含AI字幕提取、转场特效、文字叠加、背景音乐、滤镜、背景替换、动态贴纸等功能。 报价范围&#…

BGP为什么要配置对等IP?

本文由deepseek生成&#xff0c;特此声明 一、为什么要配置对等体IP&#xff1f; 1. 明确标识邻居身份 路由协议需求&#xff1a;动态路由协议&#xff08;如BGP、OSPF、RIP&#xff09;需要路由器之间建立邻居关系以交换路由信息。配置对等体IP是为了唯一标识邻居路由器&…

Qt中配置文件读写

1. 保存分组数据到配置文件 #include <QSettings>void saveNetworkConfig() {QSettings settings("network.ini", QSettings::IniFormat);// 网络配置分组settings.beginGroup("Network");// 源地址配置settings.beginGroup("Source");se…

Linux 的编辑器--vim

1.Linux编辑器-vim使⽤ vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;⽽且还有⼀些新的特性在⾥⾯。例如语法加亮&#xff0c;可视化操作不仅可以在终端运⾏&#xff0c;也可以…

SAP Commerce(Hybris)开发实战(二):登陆生成token问题

问题简述 最近处理Hybris框架标准的登陆功能&#xff0c;遇到一个问题&#xff1a;用两个不同的浏览器&#xff0c;同时登陆一个账号&#xff0c;会同时生成两个不同的token和refreshToken。 问题原因 解决了其实非常简单&#xff0c;就是Hybris的Employee表中&#xff0c;有一…

c/c++的opencv椒盐噪声

在 C/C 中实现椒盐噪声 椒盐噪声&#xff08;Salt-and-Pepper Noise&#xff09;&#xff0c;也称为脉冲噪声&#xff08;Impulse Noise&#xff09;&#xff0c;是数字图像中常见的一种噪声类型。它的特点是在图像中随机出现纯白色&#xff08;盐&#xff09;或纯黑色&#x…

LIEDNet: A Lightweight Network for Low-light Enhancement and Deblurring论文阅读

摘要 夜间拍摄的图像常常面临诸如低光和模糊等挑战&#xff0c;这些问题主要是由于昏暗环境和长时间曝光的频繁使用所导致。现有方法要么独立处理这两种退化问题&#xff0c;要么依赖于通过复杂机制生成的精心设计的先验知识&#xff0c;这导致了较差的泛化能力和较高的模型复…

谈谈worldquant中设置的几个意思

Decay 是一个设置&#xff0c;用于确定要反映多少过去的位置。正如我们之前详细介绍的那样&#xff0c;Decay 值越高&#xff0c;Alpha 周转率越低。但是&#xff0c;请注意&#xff0c;Alpha 的夏普比率可能会随着信息延迟而降低。 创建 Alpha 时&#xff0c;头寸可能会集中在…

大模型和AI工具汇总(一)

一、国内可免费使用的大模型&#xff08;持续更新&#xff09; DeepSeek 模型介绍&#xff1a;DeepSeek 系列包括 DeepSeek V3&#xff08;通用场景&#xff09;、DeepSeek R1&#xff08;推理模型&#xff09;&#xff0c;支持高达 64K 上下文长度&#xff0c;中文场景表现优…

HarmonyOS NEXT 技术特性:分布式软总线技术架构

HarmonyOS NEXT 技术特性&#xff1a;分布式软总线技术架构 随着物联网发展&#xff0c;2030 预计全球联网设备达 2000 亿&#xff0c;异构设备互联难题凸显&#xff0c;分布式软总线作为 HarmonyOS 生态核心&#xff0c;以软件虚拟总线打破物理局限&#xff0c;让跨品牌设备即…

什么是VR展馆?VR展馆的实用价值有哪些?

VR展馆&#xff0c;重塑展览体验。在数字化时代浪潮的推动下&#xff0c;传统的实体展馆经历前所未有的变革。作为变革的先锋&#xff0c;VR展馆以无限的潜力&#xff0c;成为展览行业的新宠。 VR展馆&#xff0c;即虚拟现实展馆&#xff0c;是基于VR&#xff08;Virtual Real…