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

JavaEE初阶学习:文件操作

1.文件

1.认识文件

平时说的文件一般都是指存储再硬盘上的普通文件,形如txt,jpg,MP4,rar等这些文件都可以认为是普通文件,它们都是再硬盘上存储的。

在计算机中,文件可能是一个广义的概念,就不只是包含普通文件,还可以包含目录(把目录称为目录文件)文件可以是文本文档、图片、程序等等。文件通常具有点+三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以JPEG格式保存并且文件扩展名为.jpg)。

普通文件是保存在硬盘上的。

机械硬盘的基本构造:

  1. 盘片,存储数据的介质
  2. 磁头

针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,
往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。

在这里插入图片描述
文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。

在这里插入图片描述
文件的分类(站在程序员的角度)

主要把文件分为两类

  1. 文本文件,里面存储的是字符,文本文件本质上也是存字节的,但是文本文件中相邻的字节在一起正好构成一个个字符。
  2. 二进制文件,里面存储的是字节

在这里插入图片描述

2.树型结构组织和目录

计算机里,保存管理文件,是通过操作系统中“文件系统”这样的模块来负责的。

随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概念。

在这里插入图片描述

在这里插入图片描述

3. 文件路径

如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。

在这里插入图片描述

除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在结点的一条路径。

在这里插入图片描述
在这里插入图片描述

即使是定位到同一个文件,如果基准目录不同,此时相对路径也不同。

2.Java中的操作文件

1.文件系统相关的操作

文件系统相关的操作指的是通过”文件资源管理器“能够完成的一些功能。

功能:

  • 列出目录中有哪些文件
  • 创建文件
  • 创建目录
  • 删除文件
  • 重命名文件

在Java中提供了一个File类,通过这个类来完成上述操作
首先File类就描述一个文件/目录

File的构造方法,能够传入一个路径,来指定一个文件,这个路径可以是绝对路径也可以是相对路径

属性:
在这里插入图片描述

构造方法:
在这里插入图片描述

方法:
在这里插入图片描述

文件操作,也是一种输入输出,File这个东西也就在IO中

在这里插入图片描述
在这里插入图片描述

这样就可以定位到具体的文件,是以绝对路径的方式。
在这里插入图片描述

  1. 如果是通过命令行的方式(java.Demo),此时执行命令所在的目录,就是基准路径
  2. 如果是通过IDEA的方式来运行程序,此时基准路径就是当前Java项目所在的路径
  3. 把一个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提供了三个版本的重载

  1. 无参版本:一次读一个字节
  2. 一个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数
  3. 三个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数,不是从数组的起始位置放置,而是从中间位置放置(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.认识文件 平时说的文件一般都是指存储再硬盘上的普通文件&#xff0c;形如txt&#xff0c;jpg&#xff0c;MP4&#xff0c;rar等这些文件都可以认为是普通文件&#xff0c;它们都是再硬盘上存储的。 在计算机中&#xff0c;文件可能是一个广义的概念&#xff0c;就…...

【外设零基础通用教程】GPIO 下

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

在window上安装python

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

[hive SQL] 预约业务线

这两天有个数据需求&#xff0c;记录一下。 原始需求说明产品写得很乱不清晰确认了半天无语死了&#xff08;开始骂人&#xff09;&#xff0c;直接列转换后的问题了 问题1&#xff1a; 现有一张办事预约服务记录表reservation_order&#xff0c;包含字段用户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领域的知识架构&#xff0c;即具备了较好的数学、编程及专业领域知识后&#xff0c;如果想在AI领域追踪前沿研究&#xff0c;就不能再只看教材了。毕竟AI领域的发展一日千里&#xff0c;教材上的知识肯定不是最新的。此时&#xff0c;应该将关注的重点转向AI领域的…...

【Python OpenCV】第六天:图像的基础操作

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

2022年陕西省职业院校技能大赛“网络搭建与应用”赛项竞赛试题

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

面经-01

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

c/c++:visual studio的代码快捷键,VS设置自定义默认代码,使用快捷键

c&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知道的周边的会c的同学&#xff0c;可手握10多个offer&#xff0c;随心所欲&#xff0c;而找啥算法岗的&#xff0c;基本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对象的优缺点&#xff1a;2. StatefulSet对象的基础知识2.1 StatefulSet对象的定义2.1.1 下表为StatefulSet对象的定义及其属性&#xff1…...

选择排序与堆排序

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

AI绘图体验:想象力无限,创作无穷!(文生图)

基础模型&#xff1a;3D二次元 PIXEL ART &#xff08;1&#xff09;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&#xff08;吉卜力工作室…...

【图片分割】【深度学习】Windows10下SAM官方代码Pytorch实现

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

“我用 ChatGPT 造了一个零日漏洞,成功逃脱了 69 家安全机构的检测!”

一周以前&#xff0c;图灵奖得主 Yoshua Bengio、伯克利计算机科学教授 Stuart Russell、特斯拉 CEO 埃隆马斯克、苹果联合创始人 Steve Wozniak 等在内的数千名 AI 学者、企业家联名发起一则公开信&#xff0c;建议全球 AI 实验室立即停止训练比 GPT-4 更强大的模型&#xff0…...

Compose (14/N) - 附带效应 EffectPI

一、概念 纯函数函数与外界交换数据只能通过形参和返回值进行&#xff0c;不会对外界环境产生影响。副作用函数内部与外界进行了交互&#xff0c;产生了其它结果&#xff08;如修改外部变量&#xff09;。组合函数是用来声明UI的&#xff0c;所以跟UI描述不相关的操作都是副作…...

云日记个人中心项目思路

验证昵称的唯一性 前台&#xff1a; 昵称文本框的失焦事件 blur 1. 获取昵称文本框的值 2. 判断值是否为空 如果为空&#xff0c;提示用户&#xff0c;禁用按钮&#xff0c;并return 3. 判断昵称是否做了修改…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...