JavaEE初阶学习:文件操作
1.文件
1.认识文件
平时说的文件一般都是指存储再硬盘上的普通文件,形如txt,jpg,MP4,rar等这些文件都可以认为是普通文件,它们都是再硬盘上存储的。
在计算机中,文件可能是一个广义的概念,就不只是包含普通文件,还可以包含目录(把目录称为目录文件)文件可以是文本文档、图片、程序等等。文件通常具有点+三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以JPEG格式保存并且文件扩展名为.jpg)。
普通文件是保存在硬盘上的。
机械硬盘的基本构造:
- 盘片,存储数据的介质
- 磁头
针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,
往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。
文件的分类(站在程序员的角度)
主要把文件分为两类
- 文本文件,里面存储的是字符,文本文件本质上也是存字节的,但是文本文件中相邻的字节在一起正好构成一个个字符。
- 二进制文件,里面存储的是字节
2.树型结构组织和目录
计算机里,保存管理文件,是通过操作系统中“文件系统”这样的模块来负责的。
随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概念。
3. 文件路径
如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。
除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在结点的一条路径。
即使是定位到同一个文件,如果基准目录不同,此时相对路径也不同。
2.Java中的操作文件
1.文件系统相关的操作
文件系统相关的操作指的是通过”文件资源管理器“能够完成的一些功能。
功能:
- 列出目录中有哪些文件
- 创建文件
- 创建目录
- 删除文件
- 重命名文件
- …
在Java中提供了一个File类,通过这个类来完成上述操作
首先File类就描述一个文件/目录
File的构造方法,能够传入一个路径,来指定一个文件,这个路径可以是绝对路径也可以是相对路径
属性:
构造方法:
方法:
文件操作,也是一种输入输出,File这个东西也就在IO中
这样就可以定位到具体的文件,是以绝对路径的方式。
- 如果是通过命令行的方式(java.Demo),此时执行命令所在的目录,就是基准路径
- 如果是通过IDEA的方式来运行程序,此时基准路径就是当前Java项目所在的路径
- 把一个java代码打残war包,放到tomcat上运行
这种情况下基准路径就是tomcat的bin目录
一旦路径指定错了,很容易出现找不到的情况~
import java.io.File;import java.io.IOException;@SuppressWarnings({"all"})public class Demo {public static void main(String[] args) throws IOException {File f = new File("E:/text.txt");// 获取到文件的父目录System.out.println(f.getParent());// 获取到文件名System.out.println(f.getName());// 获取到文件路径System.out.println(f.getPath());// 获取到绝对路径System.out.println(f.getAbsolutePath());// 获取到绝对路径System.out.println(f.getCanonicalPath());System.out.println("===================");File f2 = new File("./test.txt");// 获取到文件的父目录System.out.println(f2.getParent());// 获取到文件名System.out.println(f2.getName());// 获取到文件路径System.out.println(f2.getPath());// 获取到绝对路径System.out.println(f2.getAbsolutePath());// 获取到绝对路径System.out.println(f2.getCanonicalPath());}
}
2.文件内容的相关操作
- 打开文件
- 读文件
- 写文件
- 关闭文件
针对文件内容的读写,java标准库提供了一组类~
首先按照文件的内容,分为两个系列
字节流对象,针对二进制文件,是以字节为单位进行读写的,读:InputStream,写:OutputStream。
字符流对象,针对文本文件,是以字符为单位进行读写的,读:Reader,写:Writer。
InputStream
read提供了三个版本的重载
- 无参版本:一次读一个字节
- 一个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数
- 三个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数,不是从数组的起始位置放置,而是从中间位置放置(off这个下标的位置)len表示最多能放多少个元素(字节)
IO操作失败的可能性是非常大的,另外硬盘也容易出现“坏道”
public class Demo2 {public static void main(String[] args) {// 构造方法中需要指定打开文件的路径try {// 1. 创建对象,同时也是在打开文件InputStream inputStream = new FileInputStream("E://test.txt");// 2. 尝试一个一个字节的读,把整个文件读完while (true) {int b = inputStream.read();if (b == -1)break;System.out.println(b);}// 3. 读完之后要记得关闭文件,释放资源inputStream.close();} catch (IOException e) {throw new RuntimeException(e);}}
}
更好的做法是把close放到finally里面
改进之后的代码
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;@SuppressWarnings({"all"})
public class Demo3 {public static void main(String[] args) {// 构造方法中需要指定打开文件的路径InputStream inputStream = null;try {// 1. 创建对象,同时也是在打开文件inputStream = new FileInputStream("E://test.txt");// 2. 尝试一个一个字节的读,把整个文件读完while (true) {int b = inputStream.read();if (b == -1)break;System.out.println(b);}} catch (IOException e) {throw new RuntimeException(e);} finally {// 3. 读完之后要记得关闭文件,释放资源try {inputStream.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}
try (InputStream inputStream = new FileInputStream("E:/test.txt")){// 一次读取若干个字符while (true) {byte[] buffer = new byte[1024];int len = inputStream.read(buffer);if (len == -1) {// 如果返回-1 就读完了break;}for (int i = 0; i < len; i++) {System.out.println(buffer[i]);}}
} catch (IOException e) {throw new RuntimeException(e);
}
OutputStream
public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("E:/test.txt")) {
// outputStream.write(97);
// outputStream.write(98);
// outputStream.write(99);byte[] buffer = new byte[]{97, 98, 99};outputStream.write(buffer);} catch (IOException e) {throw new RuntimeException(e);}}
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;@SuppressWarnings({"all"})
public class Demo4 {public static void main(String[] args) {try (Reader reader = new FileReader("E/test.txt")){// 按照字符来读while (true) {char[] buffer = new char[1024];int len = reader.read(buffer);if (len == -1) {break;}for (int i = 0; i < len; i++) {System.out.println(buffer[i]);}String s = new String(buffer, 0, len);System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;// 按照字符来写
@SuppressWarnings({"all"})
public class Demo5 {public static void main(String[] args) {try (Writer writer = new FileWriter("E:?test.txt")){writer.write("yjx");} catch (IOException e) {throw new RuntimeException(e);}}
}
3.文件操作案例
扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)
import java.io.*;
import java.util.Scanner;public class IODemo1 {//扫描指定目录,并找到名称或者内容包含指定字符的所有普通文件public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//1.先让用户指定一个要搜索的根目录System.out.println("请输入要扫描的根目录: ");File rootDir = new File(scanner.next());if(!rootDir.isDirectory()) {System.out.println("输入有误,您输入的目录不存在!");return;}//2.让用户输入一个人要查询的词System.out.println("请输入要查询的词: ");String word = scanner.next();//3.递归的进行目录/文件的遍历scanDir(rootDir,word);}private static void scanDir(File rootDir, String word) {//列出当前rootDir 中的内容,没有内容,直接递归结束File[] files = rootDir.listFiles();if(files == null) {//当前rootDir是一个空的目录,这里啥也没有//没必要往里面递归了return;}//目录里面有内容,就遍历目录中的每个元素for (File f : files) {if (f.isFile()) {//是普通文件//打开文件,读取内容,比较看是否包含上述关键词String content = readFile(f);if(content.contains(word)) {System.out.println(f.getAbsolutePath() + "包含要查找的关键字!");}}else if(f.isDirectory()) {//是目录//进行递归操作scanDir(f,word);}else {//不是普通文件,也不是目录文件,直接跳过continue;}}}private static String readFile(File f) {//读取文件的整个内容,返回出来//使用字符流读取,由于匹配的是字符串,就只能按照字符流处理StringBuilder stringBuilder = new StringBuilder();try(Reader reader = new FileReader(f)) {//一次读一个字符,把读到的结果给拼装到StringBuilder中,统一转成Stringwhile (true) {int c = reader.read();if(c == -1) {break;}stringBuilder.append((char) c);}} catch (IOException e) {e.printStackTrace();}return stringBuilder.toString();}
}
相关文章:

JavaEE初阶学习:文件操作
1.文件 1.认识文件 平时说的文件一般都是指存储再硬盘上的普通文件,形如txt,jpg,MP4,rar等这些文件都可以认为是普通文件,它们都是再硬盘上存储的。 在计算机中,文件可能是一个广义的概念,就…...

【外设零基础通用教程】GPIO 下
【外设零基础通用教程】GPIO 下使用方法GPIO 值输入读取值输出设置值GPIO输入输出应用GPIO输入应用GPIO输出应用文档使用理论补充输出方式推挽输出开漏输出上篇连接:【外设零基础通用教程】GPIO 上,主要是在做视频的时候,发现上篇理论很多&am…...

在window上安装python
在Windows上安装python 1.进入python官网https://www.python.org/ 下载配置环境,点击上方downloads,根据系统选择python环境下载(选择windows) 往下拉查找需要的版本并下载 下载后双击就可以安装python了 如何检验是否安装成功 通过【winr】调出【运行】弹窗,输…...

[hive SQL] 预约业务线
这两天有个数据需求,记录一下。 原始需求说明产品写得很乱不清晰确认了半天无语死了(开始骂人),直接列转换后的问题了 问题1: 现有一张办事预约服务记录表reservation_order,包含字段用户id、服务名称、服务…...

LNMP架构和论坛搭建以及一键部署
数据流向 一、Nginx服务安装 1、关闭防火墙 [rootking ~]# systemctl stop firewalld [rootking ~]# systemctl disable firewalld [rootking ~]# setenforce 0 2、将所需软件包拖入/opt目录下 3、安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 4、创建运…...

RK3568平台开发系列讲解(设备驱动篇)V4L2程序实现流程
🚀返回专栏总目录 文章目录 一、V4L2 进行视频采集二、命令标识符三、V4L2程序实例3.1、打开设备3.2、查询设备属性3.3、显示所有支持的格式3.4、设置图像帧格式3.5、申请缓冲区3.6、将申请的缓冲帧从内核空间映射到用户空间3.7、将申请的缓冲帧放入队列,并启动数据流3.8、启…...

人工智能中的顶级会议
当搭建好了AI领域的知识架构,即具备了较好的数学、编程及专业领域知识后,如果想在AI领域追踪前沿研究,就不能再只看教材了。毕竟AI领域的发展一日千里,教材上的知识肯定不是最新的。此时,应该将关注的重点转向AI领域的…...

【Python OpenCV】第六天:图像的基础操作
文章目录 一、本期目标二、获取并修改像素值三、获取图像属性(1)img.shape(2)img.size(3)img.dtype四、图像 ROI五、拆分及合并图像通道六、为图像扩边(填充)一、本期目标 获取像素值并修改获取图像的属性(信息)图像的 ROI图像通道的拆分及合并几乎所有这些操作与 Nu…...

2022年陕西省职业院校技能大赛“网络搭建与应用”赛项竞赛试题
2022年陕西省职业院校技能大赛 “网络搭建与应用”赛项 竞赛试题 竞赛说明 一、竞赛内容发布 “网络搭建与应用”赛项竞赛共分三个部分,其中: 第一部分:网络搭建及安全部署项目(500分) 第二部分:服务器配置及应用项目(480分) 第三部分:职业规范与素养(20分) 二、竞赛…...

面经-01
面试java开发工程师 常用数据结构,区别及使用场景 以下是一些常用的数据结构,它们的区别以及适用场景: 数组 (Array): 区别:数组是一种连续内存空间的数据结构,具有固定的大小,用于存储相同类型…...

c/c++:visual studio的代码快捷键,VS设置自定义默认代码,使用快捷键
c: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg 提…...

mysql基本语法
-- 显示所有数据库 show databases;-- 创建数据库 CREATE DATABASE test;-- 切换数据库 use test;-- 显示数据库中的所有表 show tables;-- 创建数据表 CREATE TABLE pet (name VARCHAR(20),owner VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth DATE,death DATE );-- 查看…...

出苗率相关论文
文章目录2021Automatic UAV-based counting of seedlings in sugar-beet field and extension to maize and strawberry(Computers and Electronics in Agriculture)2022Detection and Counting of Maize Leaves Based on Two-Stage Deep Learning with UAV-Based RGB Image&am…...

【Kubernetes】StatefulSet对象详解
文章目录简介1. StatefulSet对象的概述、作用及优点1.1 对比Deployment对象和StatefulSet对象1.2 以下是比较Deployment对象和StatefulSet对象的优缺点:2. StatefulSet对象的基础知识2.1 StatefulSet对象的定义2.1.1 下表为StatefulSet对象的定义及其属性࿱…...

选择排序与堆排序
全文目录引言选择排序思路实现堆排序思路实现总结引言 从这篇文章开始,将介绍几大排序算法:选择排序、堆排序、直接插入排序、希尔排序、冒泡排序、快速排序、归并排序以及计数排序。 在本篇文章中要介绍的是选择排序与堆排序,它们都属于选…...

AI绘图体验:想象力无限,创作无穷!(文生图)
基础模型:3D二次元 PIXEL ART (1)16-bit pixel art, outside of caf on rainy day, light coming from windows, cinematic still(电影剧照), hdr (2) 16-bit pixel art, island in the clouds, by studio ghibli(吉卜力工作室…...

【图片分割】【深度学习】Windows10下SAM官方代码Pytorch实现
【图片分割】【深度学习】Windows10下SAM官方代码Pytorch实现 提示:最近开始在【图片分割】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录【图片分割】【深度学习】Windows10下SAM官方代码Pytorch实现前言SAM模型运行环境安装打开cmd,执行下面的…...

“我用 ChatGPT 造了一个零日漏洞,成功逃脱了 69 家安全机构的检测!”
一周以前,图灵奖得主 Yoshua Bengio、伯克利计算机科学教授 Stuart Russell、特斯拉 CEO 埃隆马斯克、苹果联合创始人 Steve Wozniak 等在内的数千名 AI 学者、企业家联名发起一则公开信,建议全球 AI 实验室立即停止训练比 GPT-4 更强大的模型࿰…...

Compose (14/N) - 附带效应 EffectPI
一、概念 纯函数函数与外界交换数据只能通过形参和返回值进行,不会对外界环境产生影响。副作用函数内部与外界进行了交互,产生了其它结果(如修改外部变量)。组合函数是用来声明UI的,所以跟UI描述不相关的操作都是副作…...

云日记个人中心项目思路
验证昵称的唯一性 前台: 昵称文本框的失焦事件 blur 1. 获取昵称文本框的值 2. 判断值是否为空 如果为空,提示用户,禁用按钮,并return 3. 判断昵称是否做了修改…...

docker容器的相关环境及创建镜像1
一、容器管理工具介绍 LXC 2008 是第一套完整的容器管理解决方案 不需要任何补丁直接运行在linux内核之上管理容器。创建容器慢,不方便移植 Docker 是在LXC基础上发展起来的。拥有一套容器管理生态系统 生态系统包含︰容器镜像、注册表、RESTFUL API及命令行操作界…...

如何使用ChatGPT在1天内完成毕业论文
如何使用ChatGPT在1天内完成毕业论文 几天前,亲眼见证了到一位同学花了1天时间用ChatGPT完成了他的毕业论文,世道要变,要学会使用黑科技才能混的下去。废话到此结束,下面说明这么用AI生成自己的论文。 使用工具: 1. P…...

Debezium同步之实时数据采集必备工具
目录 简介 基础架构图片 Kafka Connect Debezium 特性 抽取原理 简介 RedHat(红帽公司) 开源的 Debezium 是一个将多种数据源实时变更数据捕获,形成数据流输出的开源工具。 它是一种 CDC(Change Data Capture)工具,工作原理类似大家所熟知的 Canal, DataBus, Maxwell…...

【区块链】走进web3的世界-gas费用
气体单位用于衡量在以太坊上执行交易所需的计算量。由于每笔交易都需要一些计算资源来执行,因此需要一笔费用,通常称为Gas fee或Transaction fee 。 汽油费以以太坊的本地货币——ether或ETH支付。汽油费的计算方式在伦敦升级前后略有不同。 注意&#…...

世界上最大的手工艺品连锁零售商Michaels验厂总结
【世界上最大的手工艺品连锁零售商Michaels验厂总结】 Michaels是世界上最大的手工艺品连锁企业,公司的总部位于美国德克萨斯州的Irving,公司现在有员工12500人。在美国49个州和加拿大经营着1200多家Michaels工艺品的连锁店。每家商店平均销售面积约为18…...

springboot如何优雅的打印项目日志
文章目录如何优雅的打印项目日志原理实现日志打印Filter注入容器如何优雅的打印项目日志 框架 springboot 原理 使用filter拦截请求,打印出请求、响应,及耗时 知识点 1、OncePerRequestFilter Filter base class that aims to guarantee a single …...

【JAVA程序设计】(C00127)基于SSM+vue开发的音乐播放管理系统-有文档
基于SSMvue开发的音乐管理系统-有文档项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架vue以及html前台的开发的音乐管理系统共分为二个角色:管理员、用户 管理员角色包含以下功能: 登录、个人中心(修改密码、个人信息修改&am…...

C#|调用C/C++动态库
参考:C#总结(四)调用C动态库(https://www.shuzhiduo.com/A/A2dmV49qze/) 文章目录C#加载C动态库C#加载C#动态库涉及到的概念知识:托管DLL和非托管DLL的区别(https://www.tinymind.net.cn/articl…...

让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的
最近一直有一个问题,如鲠在喉。争取早一天解决,早一天踏踏实实的睡觉。 问题是:在ES中,一条JSON数据是如何写入到磁盘上的? 如何解决这个问题?我想到了chatGPT,还有lucene的学习资料。这篇文章&…...

chapter-7数据库事务
以下课程来源于MOOC学习—原课程请见:数据库原理与应用 考研复习 DBMS保证系统中一切事务的原子性、一致性、隔离性和持续性 DBMS必须对事务故障、系统故障和介质故障进行恢复 恢复中最经常使用的技术:数据库转储和登记日志文件 恢复的基本原理&#…...