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. 判断昵称是否做了修改…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
