【JavaEE】文件操作 —— IO

文件操作 —— IO

1. 文件的属性

  • 文件内容
  • 文件大小
  • 文件路径
  • 文件名称

2. 文件的管理

采用树形结构进行管理。

3. 文件路径

分为两种:相对、绝对路径。

  • 相对路径:相对于当前位置的路径,以“./xxx.xxx”为标志
  • 绝对路径:以从盘符开始到某一级的路径

4. 输入和输出——Input/Output

输入和输出是以CPU的角度进行观察。

输出:

  • 向屏幕上打印,就是打印内容从CPU流出,外设,所以是 输出
  • 向文件中写内容,就是将内容从CPU流出,到文件,所以是 输出

输入:

  • 从键盘上输入字符,就是字符从外设流入到CPU,所以是 输入
  • 从文件中读取内容,就是内容从文件流入到CPU,所以是 输入

5. 字节和字符

按照读取输入的方式不同可以分为按照字符流、字节流两种情况。

  • 字符流,按照字符编码规则,每次读取一个字符,根据指定的编码规则对读取到的字节进行解析,最终正确显示字符
  • 字节流,按照字节进行读取,每次读取一个字节(取决于给的byte[]是多长的,在read方法中传入的参数是多大)
方式问题
字符流只能操作文本文件
字节流操作任意类型的文件
  • 但是字符流如果编码格式与文件不同步,那么也可能造成乱码问题。

6. deleteOnExit

退出时删除文件,常用于临时文件的删除。

会在程序退出时将文件删除。

7. 文件内容的读写 —— 数据流

7.1 数据流的分类

数据流分为两大类,分为字符流(Reader和Writer)、字节流(InputStream和OutputStream)

其中字符流适合使用于纯文本文件(使用记事本打开不是乱码的文件),字节流适用于任何文件。

因为字符流每次读一个字符,**根据编码规则能够自动选取读几个字节,**图像等类文件不适合;

但是字节流不论是什么文件每次就是一个字节,原原本本的进行读出。

7.2 读写文件内容

读写文件存在一种固定套路:

  1. 打开文件、流
  2. 读取文件
  3. 关闭文件、流

代码示例:

import java.io.*;public class test3 {public static void main(String[] args) throws FileNotFoundException {File file = new File(".\\test.txt");// try with resourcestry(FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(file)){// 写入String s = "qyy is the best.";fos.write(s.getBytes());// 读出int len = -1;byte[] bytes = new byte[1024];System.out.println(file.getAbsoluteFile() + "的内容为:");while((len = fis.read(bytes, 0, bytes.length)) != -1) {System.out.println(new String(bytes, 0, len));}} catch (IOException e) {throw new RuntimeException(e);}// 退出时删除——测试文件file.deleteOnExit();}
}

上述代码并没有使用close去关闭流,因为在这里使用了一种try with rescoures的语法,简单来说就是之前只是简单地使用try…catch进行捕获异常,这里的try语法在try后面加上了一堆括号,在里面写上需要释放资源的代码。

释放资源也可以将.close()写在finally{}中,但是上述语法更加简洁。

值得一提的是,只有实现了Closeable接口的类,才能放到try()中。比如上述的InputStream:

在这里插入图片描述

7.3 read方法——输出型参数

输出型参数本来是一个c/c++中常用的概念。输出型参数在c/c++中是将参数的引用写在参数位置,能够在函数运行完毕后不依赖于返回值的方式得到这个变量的值。好处:

  1. 能够携带多个返回值
  2. 避免在调用函数的过程中,函数未能正常返回退栈而导致的资源泄露(资源总是能够在上一级进行释放)

这里的read()方法也需要传入一个输出型参数byte[],用来存放读取到的文件内容。

其有三个参数:

在这里插入图片描述

参数说明
byte[] b存放文件内容的输出型参数
int off从byte[]中第几个位置开始存放,是一个偏移量(offset)
int len读取字节的实际长度,便于构建String变量将文件内容进行输出

7.4 Scanner读取文件

Scanner在之前的使用中,均是以Scanner scanner = new Scanner(System.in)的方式进行,这种方式表示是从键盘读入,数据从键盘流入系统,利用这个原理我们同样可以使得数据从文件流向文件/外设。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;public class test4 {public static void main(String[] args) throws FileNotFoundException {Scanner scanner = new Scanner(new FileInputStream("test.txt"));while (scanner.hasNext()) {System.out.println(scanner.next());}}
}

运行结果:

在这里插入图片描述

7.4 几点说明

  1. write是首先会将文件内容全部都清空,即使你并没有往文件中输入任何内容,除非添加追加参数true在这里插入图片描述

  2. Reader与Writer方法的使用与InputStream和OutputStream相同,不再列出

8. 文件读写基本操作

8.1 文件的查找

因为文件是以“树形”结构构建,所以文件的查找本质上是一种多叉树的遍历。

所以就少不了使用**“递归”**。

代码示例:

import java.io.File;
import java.util.regex.Pattern;public class test5 {public static void main(String[] args) {// 文件的查找// 使用正则表达式进行匹配文件String regex = "qyy.*";Pattern pattern = Pattern.compile(regex);File path = new File("D:\\code\\0java\\J2024_01_19");// 从D:\code\0java\J2024_01_19开始找searchFile(pattern, path);}private static void searchFile(Pattern targetFile, File path) {File[] files = path.listFiles();assert files != null;// 路径不能为空for (File file : files) {if (file.isFile()) {// 是文件——看是否匹配要查找的文件if (targetFile.matcher(file.getName()).matches()) {System.out.println("Found: " + file.getAbsolutePath());}} else if (file.isDirectory()) {// 是目录——递归searchFile(targetFile, file);}else {// null}}}
}

值得一提的是,这段代码中使用了Pattern类,利用这个类可以进行正则表达式的匹配。

compile(String regex): 静态方法,用于将给定的正则表达式编译为 Pattern 对象。

matcher(CharSequence input): 用于创建一个 Matcher 对象,该对象用于在输入字符序列上执行匹配操作。

8.2 文件的复制

import java.io.*;public class test6 {public static void main(String[] args) {// 实现文件复制// 从test.txt复制到同级目录下的test2.txtFile src = new File("./test.txt");File dest = new File("./test2.txt");try(FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(dest)) {int len = -1;byte[] bytes = new byte[1024];while ((len = fis.read(bytes, 0 ,bytes.length)) != -1) {String s = new String(bytes, 0, len);System.out.println(s);// 一边读,一边写fos.write(s.getBytes());}} catch (IOException e) {throw new RuntimeException(e);}}
}

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

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

相关文章

DHCP配置(路由器,交换机)

DHCP接口地址池配置 拓扑 PC配置DHCP点击应用。 路由器配置命令 <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]int g0/0/1[Huawei-GigabitEthernet0/0/1]ip address 10.1.1.1 24[Huawei-GigabitEthernet0/0/1]q[Huawei]dhcp enable Info: T…

Leetcode的AC指南 —— 栈与队列:232.用栈实现队列

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;232.用栈实现队列 **。题目介绍&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a;…

String在VS与Linux下的区别

目录 一、string的成员 1.VS 2.Linux 二、string的扩容机制 1. VS 2.Linux 一、string的成员 string是C标准库中的一个类模板&#xff0c;用于表示和操作字符串 string在 Windows 与 Linux 中的成员不是相同的 1.VS 4个成员&#xff1a;_str , _size , _capacity 和…

力扣白嫖日记(sql)

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1050.合作至少三次的演员和导演 表&#xff1a;ActorDirector 列名类型actor_idintdirector_idinttimestamp…

Dart安装(Winodws)

Dart官网&#xff1a; https://dart.dev/ 一、命令行安装 https://dart.dev/get-dart You can install the Dart SDK using Chocolatey. error Important: These commands require administrator rights. Here’s one way to open a Command Prompt window that has admin …

Java大型企业进销存系统

技术框架&#xff1a; SpringBoot Spring Data Jpa SpringMvc Shiro安全认证 完整权限系统 easyui 运行环境&#xff1a; jdk8 IntelliJ IDEA maven 系统介绍&#xff1a; 导航菜单&#xff1a;系统菜单、销售管理、库存管理、统计报表、基础资料、系统管理 系统菜…

Java多线程并发篇----第二十六篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Executors 框架?二、什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?三、什么是 Callable 和 Future?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

记一次多平台免杀PHP木马的制作过程

注意&#xff1a;本文转载自本作者稀土掘金博客 博客地址&#xff1a; 御坂19008号 的个人主页 - 动态 - 掘金 文章目录 前言声明绕过情况使用方法运行环境绕过点介绍技术原理讲解变量传值覆盖模块代码执行阻断模块InazumaPuzzle程序锁定器PerlinNoise危险函数生成与执行类构造…

红队打靶练习:W34KN3SS: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、gobuster 5、dirsearch WEB web信息收集 目录探测 漏洞利用 openssl密钥碰撞 SSH登录 提权 get user.txt get passwd 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB…

Debian11下编译ADAravis和Motor模块的一条龙过程

Debian11编译EPICS ADAravis记录 一年前整理的上面文&#xff0c;这几天重新走了一遍&#xff0c;有些地方会碰到问题&#xff0c;需要补充些环节&#xff0c;motor模块以前和areaDetector一条龙编译时&#xff0c;总是有问题&#xff0c;当时就没尝试了&#xff0c;这几天尝试…

202312电子学会青少年软件编程等级考试Scratch四级真题

2023年12月电子学会青少年软件编程等级考试Scratch四级真题 单项题 第 1 题 运行下列程序&#xff0c;输入“abcdef”&#xff0c;程序结束后&#xff0c;变量“字符串”是&#xff1f;&#xff08; &#xff09; A&#xff1a;fedcb B&#xff1a;bcdef C&#xff1a;abcde …

【UEFI基础】EDK网络框架(TCP4)

TCP4 TCP4协议说明 相比UDP4&#xff0c;TCP4是一种面向连接的通信协议&#xff0c;因此有更好的可靠性。 TCP4的首部格式如下&#xff1a; 各个参数说明如下&#xff1a; 字段长度&#xff08;bit&#xff09;含义Source Port16源端口&#xff0c;标识哪个应用程序发送。D…