【JavaEE】文件操作与IO

作者主页:paper jie_博客

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《MySQL》《C语言》《javaSE》《数据结构》等

内容分享:本期将会分享文件操作与IO的集合类芝士

目录

认识文件

文件的结构组织和目录

文件路径

 二进制文件与文本文件

 Java中操作文件

File概述

 属性

构造方法

方法

文件的读写 - 数据流

InputStre

FileInputStream

OutputStream

FIleOutputStream

 Scanner

小程序练习

扫描指定目录,找到指定文件

文件复制

扫描指定目录,通过文件内容来寻找指定文件 


认识文件

针对硬盘这种持久化存储的IO存储设备,当我们想要进行数据保存的时候,往往不是一个整体,而是独立成一个一个的单位来存储.这个独立的单位被抽象成文件的概念.文件除了有数据内容外,还有一部分信息,比如:文件名,文件类型,文件大小等并不作为文件的数据而存在,这部分信息称为文件的元信息.

文件的结构组织和目录

随着文件数量的增加,文件的系统管理的需要日益迫切.而我们的操作系统的一个板块就有一个专门管理文件 - 文件系统. 有它将硬件细节封装起来,提供统一的API供我们使用.而此处的文件系统就是按照树型结构来组织文件的.这就是我们平时锁的文件夹或者目录的概念.

文件路径

如何在文件系统中定位到我们的一个唯一的文件就需要使用到我们的路径.路径我们可以从树的角度出发,树的每一个节点都可以被一条从根开始,一直到达叶子节点的路径锁描述.这就是一个文件的绝对路径.

除了可以从根结点开始描述路径我们也可以从任意结点出发,进行路径的描述,而这种描述方式就是相对路径.就是对于当前所在结点的一条路径.

这里:
. 代表当前路径

.. 代表当前路径上的前一个路径

 

 二进制文件与文本文件

文件中,根据其保存的数据不同,也经常被分为不同的类型.我们一般分为文本文件和二进制文件,分别指保存字符集编码的文本和按照标准格式的非被字符集编码过的文件.

这里有一个简单区别他们的方式: 看的懂的文件就是文本文件,看不懂的文件就是二进制文件.

在Windows操作系统上,会按照文件名中的后缀来确定文件类型以及该文件的的默认打开程序.但是这个习俗并不通用.在一些其他系统上比如OSX,Unix,Linux等就没有这种的习惯,一般不会对文件类型做这么精确的分类.

文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地可以认为有可读,可写,可执行权限.

 Java中操作文件

在Java中通过java.io.File类来对一个文件和目录就进行描述.注意,有File对象,并不代表真实存在该文件.

File概述

 属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String
类型的表⽰
static charpathSeparator依赖于系统的路径分隔符,char 类
型的表⽰

构造方法

签名说明
File(File parent, String child)根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实例
File(String pathname)根据⽂件路径创建⼀个新的 File 实例,路径可以是绝
对路径或者相对路径
File(String parent, String child)根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 File 实
例,⽗⽬录⽤路径表⽰ 

方法

返回类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回FIle对象的存文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回FIle对象修饰过的绝对路径
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是一个目录
booleancreateNewFile()根据File对象,自动创建一个空文件.成功创建后返回true
booleandelete()根据File对象,删除文件.成功后返回true
voiddeleteOnExit()根据File对象,标注文件将被删除,删除动作会到JVM运行结束后才会进行
String[]list()返回File对象代表的目录下所有的文件名和子目录
File[]listFiles()

返回File对象代表的目录下的所有文件和子目录,以File对象表示

booleanmkdir()创建FIle对象代表的目录
booleanmkdirs()创建爱你File对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,可以理解为剪切,粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

实例一:

public class IODemo1 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}
}

实例二:

public class IODemo2 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isFile());System.out.println(file.createNewFile()); System.out.println(file.delete());}
}

实例三:

public class IODemo3 {public static void main(String[] args) throws InterruptedException {File file = new File("./test.txt");file.deleteOnExit();Thread.sleep(5000);}
}

实例四:

public class IODemo {public static void main(String[] args) {File file = new File(".");String[] str = file.list();System.out.println(Arrays.toString(str));File[] files = file.listFiles();System.out.println(Arrays.toString(files));}
}

实例五:

public class IODemo4 {public static void main(String[] args) {File file = new File("./test.txt");File file2 = new File("./test2.txt");
//        file.mkdir();
//        file.mkdirs();file.renameTo(file2);}
}

文件的读写 - 数据流

InputStre

修饰符及返回值类型⽅法签名说明
intread()读取⼀个字节的数据,返回-1代表
已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b
中,返回实际读到的数量;-1 代表
以及读完了
intread(byte[] b,int off, int len)最多读取 len - off 字节的数据到 b 
中,放在从 off 开始,返回实际读
到的数量;-1 代表以及读完了
voidclose()关闭字节流 

InputStream只是一个抽象类,要使用还需要具体的实现类.关于InputStream的实现类有很多,基本可以认为不同的输入设备都可以对应一个InputStream类,我们现在只关心从文件中读取,所以使用FileInputStream.

FileInputStream

签名说明
FileInputStream(File file)利⽤ File 构造⽂件输⼊流
FileInputStream(String name)利⽤⽂件路径构造⽂件输⼊流
public class IODemo5 {public static void main(String[] args) {try(InputStream inputStream = new FileInputStream("test2.txt")) {while(true) {//read()/*int n = inputStream.read();if(n == -1) {return;}System.out.printf("%c", n);*///read(byte[])byte[] buffer = new byte[1024];int n = inputStream.read(buffer);if(n == -1) {return;}System.out.println(Arrays.toString(buffer));}} catch (IOException e) {throw new RuntimeException(e);}}
}

OutputStream

修饰符及返回值类型⽅法签名说明
voidwrite(int b)写⼊要给字节的数据
voidwrite(byte[] b)将 b 这个字符数组中的数据全部写
⼊os中
intwrite(byte[] b, int off, int len)将 b 这个字符数组中从 off 开始的
数据写⼊ os 中,⼀共写 len 个
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢
的,所以,⼤多的 OutputStream
为了减少设备操作的次数,在写数
据的时候都会将数据先暂时写⼊内
存的⼀个指定区域⾥,直到该区域
满了或者其他指定条件时才真正将
数据写⼊设备中,这个区域⼀般称
为缓冲区。但造成⼀个结果,就是
我们写的数据,很可能会遗留⼀部
分在缓冲区中。需要在最后或者合
适的位置,调⽤flush(刷新)操
作,将数据刷到设备中。

OutputStream同样是一个抽象类,要使用还需要具体的实现类.我们现在还是只关心写入文件中,所以使用FileoutputStream

FIleOutputStream

实例:

public class IODemo6 {public static void main(String[] args) {try(OutputStream outputStream = new FileOutputStream("test2.txt")) {byte[] buffer = new byte[]{12,65,76,78,90,89};outputStream.write(buffer);} catch (IOException e) {throw new RuntimeException(e);}}
}

 Scanner

Scanner这个类也可以帮助我们进行字符读取

实例:

public class IODemo7 {public static void main(String[] args) {try(InputStream inputStream = new FileInputStream("test2.txt")) {Scanner scanner = new Scanner(inputStream);while(scanner.hasNext()) {String s = scanner.next();System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}

小程序练习

扫描指定目录,找到指定文件路径

import java.io.File;
import java.util.Scanner;
public class IODemo1 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你要扫描的目录: ");String rootPath = scanner.next();System.out.println("请输入你要查找的文件: ");String fileName = scanner.next();File file = new File(rootPath);if(!file.isDirectory()) {System.out.println("输入的目录不合法");return;}scanDir(file, fileName);}private static void scanDir(File file, String fileName) {File[] files = file.listFiles();if(files == null) {return;}for(File f : files) {System.out.println("遍历到: " + f.getAbsolutePath());//如果是普通文件if(f.isFile()) {if(fileName.equals(f.getName())) {System.out.println("需要查找的文件路径: " + f.getAbsolutePath());}//如果是子目录}else if(f.isDirectory()) {scanDir(f, fileName);}else {;}}}
}

文件复制

import java.io.*;
import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: sun杰* Date: 2024-01-19* Time: 15:43*/
public class IODemo3 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入源文件");String srcPath = scanner.next();File srcfile = new File(srcPath);if(!srcfile.isFile()) {System.out.println("你输入的路径不合法");return;}System.out.println("请输入目标文件");String destPath = scanner.next();File destfile = new File(destPath);if(!destfile.getParentFile().isDirectory()) {System.out.println("你输入的路径不合法");return;}try(InputStream inputStream = new FileInputStream(srcfile);OutputStream outputStream = new FileOutputStream(destfile)) {while(true) {//将源文件的内容读取到Buffer数组中byte[] buffer = new byte[1024];int n = inputStream.read(buffer);if(n == -1) {break;}//将读到的内容写到目标文件中outputStream.write(buffer, 0 , n);}} catch (IOException e) {throw new RuntimeException(e);}}
}

扫描指定目录,通过文件内容来寻找指定文件 

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
import java.util.zip.InflaterOutputStream;/*** Created with IntelliJ IDEA.* Description:* User: sun杰* Date: 2024-01-19* Time: 16:08*/
public class IODemo4 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你要扫描的目录: ");String fileName = scanner.next();System.out.println("请输入需要查找的词");String word = scanner.next();File rootFile = new File(fileName);if(!rootFile.isDirectory()) {System.out.println("你输入的路径不合法");return;}scanDir(rootFile, word);}public static void scanDir(File rootFile, String word) {File[] files = rootFile.listFiles();if(files == null) {return;}for(File f : files) {if(f.isFile()) {searcewordFile(f, word);}else if(f.isDirectory()) {scanDir(f, word);}else {;}}}private static void searcewordFile(File f, String word) {try(InputStream inputStream = new FileInputStream(f)) {StringBuilder stringBuilder = new StringBuilder();while(true) {byte[] buffer = new byte[1024];int n = inputStream.read(buffer);if(n == -1) {break;}String s = new String(buffer, 0, n);stringBuilder.append(s);}if(stringBuilder.indexOf(word) == -1) {return;}System.out.println("找到了,路径为: " + f.getAbsolutePath());} catch (IOException e) {throw new RuntimeException(e);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/242928.html

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

相关文章

【QT+QGIS跨平台编译】之三:【OpenSSL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、OpenSSL介绍二、OpenSSL配置三、Window环境下配置四、Linux环境下配置五、Mac环境下配置 一、OpenSSL介绍 OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这…

使用Element中的input组件如何实现文字和输入框在一行显示

利用 <el-form-item label"商品名称&#xff1a;">标签包裹即可&#xff0c;label写提示文字 <el-form ref"form" label-width"100px"><el-form-item label"商品名称&#xff1a;"><el-input v-model"na…

免费的WordPress插件大全

在当今数字化的时代&#xff0c;拥有一个强大的在线存在变得至关重要。而对于使用WordPress建站的用户来说&#xff0c;插件是提高网站功能的关键。在这篇文章中&#xff0c;我们将为您推荐三款免费的WordPress插件&#xff0c;它们不仅是147SEO软件中的佼佼者&#xff0c;而且…

Django(九)

1. 用户登录-Cookie和Session 什么是cookie和session&#xff1f; 发送HTTP请求或者HTTPS请求(无状态&短连接) http://127.0.0.1:8000/admin/list/ https://127.0.0.1:8000/admin/list/http无状态短连接&#xff1a;一次请求响应之后断开连接&#xff0c;再发请求重新连…

华南理工大学数字信号处理实验实验二源码(薛y老师)

一、实验目的 ▪ 综合运用数字信号处理的理论知识进行信号分析并利用MATLAB作为编程工具进行计算机实现&#xff0c;从而加 深对所学知识的理解&#xff0c;建立概念。 ▪ 掌握数字信号处理的基本概念、基本理论和基本方法。 ▪ 学会用MATLAB对信号进行分析和处理。 ▪ 用F…

基于springboot+vue的旅游网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

2.C语言——控制语句

控制语句 1.分支语句/判断语句if 语句if...else 语句if...else if...else语句 switch语句 2.循环语句 while 语句 do...while 语句 for 语句 3.转向语句 break continue go to 1.分支语句/判断语句 if 语句 if(boolean_expression) { /* 如果布尔表达式为真将执行的语句 */ } …

H5112C PWM调光 无频闪 高性价比 支持12V 24V 36V 48V 60V 72V 内置MOS

PWM调光芯片是一种常用于LED调光控制的芯片&#xff0c;其工作原理如下&#xff1a; 脉冲宽度调制&#xff08;PWM&#xff09;&#xff1a;PWM是一种调制技术&#xff0c;通过改变信号的脉冲宽度来控制输出信号的平均功率。在PWM调光中&#xff0c;芯片会以一定的频率产生一系…

ArcGIS Pro 标注牵引线问题

ArcGIS Pro 标注 模仿CAD坐标牵引线问题 右键需要标注的要素&#xff0c;进入标注属性。 选择背景样式 在这里有可以选择的牵引线样式 选择这一个&#xff0c;可以根据调整间距来进行模仿CAD标注样式。 此图为cad样式 此为调整后gis样式 此处可以调整牵引线的样式符号 …

Qt6入门教程 8:信号和槽机制(连接方式)

目录 一.一个信号与槽连接的例子 二.第五个参数 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection 三.信号 四.connect函数原型 五.信号与槽的多种用法 六.槽的属性 一.一个信号与槽连接…

Kotlin 移动端多平台

支持多平台编程是 Kotlin 的主要优势之一。它减少了为不同平台编写和维护相同代码所花费的时间&#xff0c;同时保留了本机编程的灵活性和优势。 1. 基本概念 KMM&#xff1a;Kotlin Multiplatform for mobile&#xff08;移动设备的 Kotlin 多平台&#xff09; KMM 多平台的主…

面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?

文章目录 前言一、什么是IO二、阻塞IO模型三、非阻塞 IO模型四、IO复用模型总结 前言 在《Unix网络编程》一书中提到了五种IO模型&#xff0c;分别是&#xff1a;阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三…

配置DNS主从服务器,实现真反向解析

主服务器 [rootbogon ~]# systemctl stop firewalld.service #关闭防火墙 [rootbogon ~]# setenforce 0 #关闭selinux [rootbogon ~]# systemctl restart named #启动dns服务 [rootbogon ~]# vim /etc/named.conf #进入dns配置文件 options {#监听…

Java-NIO篇章(4)——Reactor反应器模式

前面已经讲过了Java-NIO中的三大核心组件Selector、Channel、Buffer&#xff0c;现在组件我们回了&#xff0c;但是如何实现一个超级高并发的socket网络通信程序呢&#xff1f;假设&#xff0c;我们只有一台内存为32G的Intel-i710八核的机器&#xff0c;如何实现同时2万个客户端…

MySQL索引优化:深入理解索引下推原理与实践

随着MySQL的不断发展和升级&#xff0c;每个版本都为数据库性能和查询优化带来了新的特性。在MySQL 5.6中&#xff0c;引入了一个重要的优化特性——索引下推&#xff08;Index Condition Pushdown&#xff0c;简称ICP&#xff09;。ICP能够在某些查询场景下显著提高查询性能&a…

PPT 编辑模式滚动页面不居中

PPT 编辑模式滚动页面不居中 目标&#xff1a;编辑模式下适应窗口大小、切换页面居中显示 调整视图大小&#xff0c;编辑模式通过Ctrl 鼠标滚轮 或 在视图菜单中点击适应窗口大小。 2. 翻页异常&#xff0c;调整视图大小后&#xff0c;PPT翻页但内容不居中或滚动&#xff0c…

革新区块链:代理合约与智能合约升级的未来

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 代理合约&#xff08;Prox…

WordPress怎么禁用文章和页面古腾堡块编辑器?如何恢复经典小工具?

现在下载WordPress最新版来搭建网站&#xff0c;默认的文章和页面编辑器&#xff0c;以及小工具都是使用古腾堡编辑器&#xff08;Gutenberg块编辑器&#xff09;。虽然有很多站长说这个编辑器很好用&#xff0c;但是仍然有很多站长用不习惯&#xff0c;觉得操作太难了&#xf…

JAVA之常用集合框架

java中的常用集合是对数据进行存储以及相关操作的api。常用的有ArrayList、LinkedList、Vector、HashSet、TreeSet、TreeMap、HashMap ArrayList 数据结构 ArrayList的本质是一个数组 &#xff0c;那么它就具有数组的所有特性 可以根据下标快速查找值 ArrayList是如何实现动…

路由器初始化配置、功能配置

实验环境 拓扑图 Ip规划表&#xff08;各组使用自己的IP规划表&#xff09; 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-2…