文件操作/IO

文件

文件是一种在硬盘上存储数据的方式,操作系统帮我们把硬盘的一些细节都封装起来了,程序员只需要了解文件相关的接口即可,相当于操作文件就是间接的操作硬盘了
硬盘用来存储数据,和内存相比硬盘的存储空间更大,访问速度更慢,成本更低,持久化存储,操作系统通过“文件系统”这样的模块来管理硬盘
在这里插入图片描述
不同的文件系统管理文件的方式都是类似的
通过目录(directory,平常叫文件夹,专业术语叫目录)构成了N叉树的树形结构
我们在文件系统中都是通过路径来确定一个具体的文件
在这里插入图片描述
在这里插入图片描述
同样是一个cat.jpg文件,站在不同的基准目录上,查找的路径是不相同的

文件系统上存储的文件,具体来说又分成两大类
1.文本文件–存储的是字符
字符怎么定义呢?
有个表叫utf8,这个表上数据的组合就是字符
2.二进制文件–存储的是二进制数据
判断文本文件和二进制文件最简单的方式就是
直接用记事本打开,如果打开之后能看懂,就是文本,否则就是二进制

像word文档,ppt,excel这些,如果托到记事本上,都是二进制文件,虽然word文档里存的东西是汉字等可以看懂的内容,但是word文档不仅仅包含我们自己输入的内容,还有行间距,文字格式等众多内容
但是如果把excel的后缀改成csv格式,就是文本文件了
在这里插入图片描述

Java标准库中操作文件(对文件系统操作)

操作文件可以理解成通过java代码把你硬盘的文件删除修改创建等,也就是通过java代码操作文件系统
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意, File 对象可以对应到一个真实存在的文件,也可以对应到一个不存在的文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取文件路径

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());//new File后面的是什么路径,就输出什么System.out.println(file.getAbsolutePath());//工作目录拼接上当前目录   在idea中运行一个程序,工作目录就是项目所在的目录System.out.println(file.getCanonicalPath());//对getAbsolutePath的这个路径进行了修饰,让这个路径没有多余的东西,比如那个.}

在这里插入图片描述

创建文件

public static void main(String[] args) {File file=new File("./test.txt");System.out.println(file.exists());//在当前项目所在的路径下(D:\code\Java\java-related-code\File)没有test.txt这个文件,应该是falseSystem.out.println(file.isFile());//都没有这个文件了,这两行肯定都是false了System.out.println(file.isDirectory());}

在这里插入图片描述
但是我们可以先创建这个文件
在这里插入图片描述
文件跟目录的区别可以认为是文件是这个路径的重点,而目录下面还有别的路径
在这里插入图片描述

删除文件

public static void main(String[] args) {File file=new File("./test.txt");file.delete();}

在这里插入图片描述

public static void main(String[] args) throws InterruptedException {File file=new File("./test.txt");//不是立刻删除,等到程序运行结束再删除file.deleteOnExit();Thread.sleep(2000);//程序运行两秒会结束,所以这个文件在两秒之后删除}

在这里插入图片描述

创建目录

单层目录

public static void main(String[] args) {File file = new File("./testDir");// mk => make    dir => directory// mkdir 一次只能创建一层目录.  mkdirs 可以一次创建多级目录file.mkdir();//file.mkdirs();}

在这里插入图片描述
多层目录

    public static void main(String[] args) {File file = new File("./testDir/111/222");// mk => make    dir => directory// mkdir 一次只能创建一层目录.  mkdirs 可以一次创建多级目录//file.mkdir();file.mkdirs();}

在这里插入图片描述

文件重命名

public static void main(String[] args) {File file = new File("./test.txt");File file2 = new File("./src/test.txt");//本来test.txt跟src是同级别的,现在把test.txt移动到src目录下面了
//因此文件重命名也可以做到移动文件的效果file.renameTo(file2);}

针对文件内容操作

Reader

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

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;// Reader 使用.
public class Demo6
{public static void main(String[] args) throws IOException{// FileReader 构造方法, 可以填写一个文件路径(绝对路径/相对路径都行), 也可以填写一个构造好的 File 对象
//        Reader reader = new FileReader("d:/test.txt");
//        try {
//            // 中间的代码无论出现啥情况, close 都能保证执行到.
//        } finally {
//            // 抛出异常, 或者 return, close 就都执行不到了~~
//            reader.close();
//        }// 上述使用 finally 的方式能解决问题, 但是不优雅.// 使用 try with resources 是更好的解决方案.try (Reader reader = new FileReader("d:/test.txt")){while (true){char buf[] = new char[1024];int n = reader.read(buf);//读到的有效字符的个数if (n == -1){// 读到文件末尾了.break;}//实际只读了n个字符,小于n就行了for (int i = 0; i < n; i++){System.out.print(buf[i] + ",");}}}}
}

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

在这里插入图片描述
文件泄露相当于打开很多文件,使用完之后都不关闭,文件描述符表就满了,再打开新的文件,文件描述符就装不下了,这些文件就不知道上哪里去了,就造成了文件泄露
在这里插入图片描述

InputStream

在这里插入图片描述

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class Demo7 {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("d:/test.txt")) {while (true) {byte[] buf = new byte[1024];int n = inputStream.read(buf);if (n == -1) {break;}for (int i = 0; i < n; i++) {System.out.printf("%x ", buf[i]);}String s = new String(buf, 0, n, "utf8");//把buf数组的从0到n下标在string的构造方法中,通过utf8的编码转换,转换成人能看懂的字符串System.out.println(s);}}}
}

在这里插入图片描述
于是我们可以借助Scanner来完成上述操作
平时我们输入是
Scanner scanner=new Scanner(System.in);

那么system.in的类型也是一个InputStream
在这里插入图片描述
在这里插入图片描述
于是我们就可以

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;public class Demo8 {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("d:/test.txt")) {Scanner scanner = new Scanner(inputStream);// 此时就是从 test.txt 这个文件中读取数据了!!String s = scanner.next();System.out.println(s);}}
}

在这里插入图片描述

write

在这里插入图片描述

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class Demo9 
{public static void main(String[] args) throws IOException {try (Writer writer = new FileWriter("d:/test.txt", true)) {// write 是可以一次直接写一个字符串. 这个是非常方便的.writer.write("hello java");}}
}

在这里插入图片描述

经典面试题

1.扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件

import java.io.File;
import java.util.Scanner;public class Demo10 {private static Scanner scanner = new Scanner(System.in);public static void main(String[] args) {// 1. 让用户输入一个目录. 后续的查找都是针对这个目录来进行的.System.out.println("请输入要搜索的根目录: ");File rootPath = new File(scanner.next());// 2. 再让用户输入要搜索/要删除的关键词.System.out.println("请输入要删除的关键词: ");String word = scanner.next();// 3. 判定一下当前输入的目录是否有效.if (!rootPath.isDirectory()) {System.out.println("您此时输入的路径不是合法目录!");return;}// 4. 遍历目录. 从根目录出发, 按照 深度优先(递归) 的方式, 进行遍历scanDir(rootPath, word);}public static void scanDir(File currentDir, String word) {// 1. 先列出当前目录中都包含哪些内容.File[] files = currentDir.listFiles();if (files == null || files.length == 0) {// 空的目录或者非法的目录return;}// 2. 遍历列出的文件, 分两个情况分别讨论.for (File f : files) {// 加个日志, 方便看程序执行的过程.System.out.println(f.getAbsolutePath());if (f.isFile()) {// 3. 如果当前文件是普通文件, 看看文件名是否包含了 word, 来决定是否要删除.dealFile(f, word);} else {// 4. 如果当前文件是目录文件, 就递归执行 scanDirscanDir(f, word);}}}private static void dealFile(File f, String word) {// 1. 先判定当前文件名是否包含 wordif (!f.getName().contains(word)) {// 此时这个文件不包含 word 关键词. 直接跳过.return;}// 2. 包含 word 就需要询问用户是否要删除该文件?System.out.println("该文件是: " + f.getAbsolutePath() + ", 是否要确认删除? (Y/N)");String choice = scanner.next();if (choice.equals("Y") || choice.equals("y")) {f.delete();}// 如果是其他值, 都忽略.}
}

2.进行普通文件的复制

在这里插入图片描述

import java.io.*;
import java.util.Scanner;// 完成文件复制.
public class Demo11 {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);// 1. 输入路径并且合法性判定System.out.println("请输入要复制的源文件路径: ");String src = scanner.next();File srcFile = new File(src);if (!srcFile.isFile()) {System.out.println("您输入的源文件路径非法!");return;}System.out.println("请输入要复制到的目标路径: ");String dest = scanner.next();File destFile = new File(dest);// 不要求目标文件本身存在. 但是得保证目标文件所在的目录, 得是存在的.// 假设目标文件写作 d:/tmp/cat2.jpg, 就需要保证 d:/tmp 目录是存在的.if (!destFile.getParentFile().isDirectory()) {System.out.println("您输入的目标文件路径非法!");return;}// 2. 进行复制操作的过程. 按照字节流打开.try (InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(destFile)) {while (true) {byte[] buffer = new byte[20480];int n = inputStream.read(buffer);System.out.println("n = " + n);if (n == -1) {System.out.println("读取到 eof, 循环结束. ");break;}outputStream.write(buffer, 0, n);}}}
}

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

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

相关文章

使用FTP文件传输协议的潜在风险

数据&#xff08;事实&#xff0c;数字&#xff0c;价值&#xff09;是当今业务运行的核心要素。但是&#xff0c;如果数据没有得到有效的存储和传输&#xff0c;它们就会成为阻碍业务发展的障碍。如果企业不能及时地把数据送到合适的地方&#xff0c;就会造成严重的经济损失。…

【Linux】Shell脚本之流程控制语句 if判断、for循环、while循环、case循环判断 + 实战详解[⭐建议收藏!!⭐]

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

.bit域名调研

.bit域名研究 问题&#xff1a; .bit域名和ENS域名的相同点&#xff1f;不同点&#xff1f;有什么关系&#xff1f; .bit的定义 .bit 是基于区块链的&#xff0c;开源的&#xff0c;跨链去中心化账户系统.bit 提供了以 .bit 为后缀的全局唯一的命名体系&#xff0c;可用于加密…

安全第二次

一&#xff0c;iframe <iframe>标签用于在网页里面嵌入其他网页。 1&#xff0c;sandbox属性 如果嵌入的网页是其他网站的页面&#xff0c;因不了解对方会执行什么操作&#xff0c;因此就存在安全风险。为了限制<iframe>的风险&#xff0c;HTML 提供了sandb…

分布式应用:Zabbix监控MariaDB

目录 一、理论 1.Zabbix监控MariaDB 二、实验 1.Zabbix监控MariaDB 一、理论 1.Zabbix监控MariaDB &#xff08;1&#xff09;环境 zabbix服务端&#xff1a;192.168.204.214 zabbix客户端&#xff1a;192.168.204.215 &#xff08;2&#xff09;MareaDB安装 安装 za…

做海外游戏推广有哪些条件?

做海外游戏推广需要充分准备和一系列条件的支持。以下是一些关键条件&#xff1a; 市场调研和策略制定&#xff1a;了解目标市场的文化、玩家偏好、竞争格局等是必要的。根据调研结果制定适合的推广策略。 本地化&#xff1a;将游戏内容、界面、语言、货币等进行本地化&#…

使用ip2region获取客户端地区

目录 从gitee拉取ip2region.xdb资源文件 写测试类 注意要写对资源路径 本地测试结果 ​编辑 远端测试结果 从gitee拉取ip2region.xdb资源文件 git clone https://gitee.com/lionsoul/ip2region.git 将xdb放入resources资源文件夹 引入依赖 <dependency><groupId&…

[HDLBits] Exams/m2014 q4d

Implement the following circuit: module top_module (input clk,input in, output out);always(posedge clk) beginout<out^in;end endmodule直接写out^in就行

Vue 使用 vite 创建项目

vite 是新一代前端构建工具&#xff0c;和 webpack 类似。 vite 的启动速度更快。在开发环境中&#xff0c;不需要打包就可以直接运行。 vite 的更新速度更快。当修改内容后&#xff0c;不需要刷新浏览器&#xff0c;页面就会实时更新。 vite 完全是按需编译。它只会编译需要…

【考研数学】高等数学第三模块——积分学 | Part II 定积分(反常积分及定积分应用)

文章目录 前言三、广义积分3.1 敛散性概念&#xff08;一&#xff09;积分区间为无限的广义积分&#xff08;二&#xff09;积分区间有限但存在无穷间断点 3.2 敛散性判别法 四、定积分应用写在最后 前言 承接前文&#xff0c;梳理完定积分的定义及性质后&#xff0c;我们进入…

企业网盘 vs 传统存储设备:为何云存储成为首选?

企业网盘的出现为企业提供了新的存储方式&#xff0c;相较于传统的存储设备&#xff0c;为何越来越多的企业选择了云存储呢&#xff1f; 一、存储成本 在企业数据存储方面&#xff0c;成本是企业重要的考量因素。企业网盘是基于云存储技术的存储工具&#xff0c;因此它比传统的…

基于DBN的伪测量配电网状态估计,DBN的详细原理

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN的伪测量配电网状态估计 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN算法伪测量配电网…

Netty:ByteBuf的资源释放方法

说明 io.netty.buffer.ByteBuf实现了io.netty.util.ReferenceCounted接口&#xff0c;需要显式释放。当ByteBuf被实例化后&#xff0c;它的引用计数是1。 调用ByteBuf对象的release方法释放&#xff1a; ByteBuf的release()方法使引用计数减少1。只有当执行以后引用计数减少…

OpenZFS 2.2 发布 RC3,支持 Linux 6.4

导读之前的 OpenZFS 2.2 候选版本已致力于实现与 Linux 6.4 内核的兼容性&#xff0c;而在 2.2-rc3 中&#xff0c;Linux 6.4 支持的元跟踪器已标记为已完成。 OpenZFS 2.2 发布了第 3 个 RC 版本。 之前的 OpenZFS 2.2 候选版本已致力于实现与 Linux 6.4 内核的兼容性&#x…

Vue3 引用第三方Swiper内容触摸滑动简单应用

去官网查看更多教程→&#xff1a;Swiper官网 → 点击教程在vue中使用Swiper→ 在Vue中使用Swiper cd 到项目 安装Swiper&#xff1a; cnpm install --save swiper 安装指定版本 cnpm install --save swiper8.1.6 9.4.1 10.1.0…

SpringBoot-Hello World

SpringBootWeb快速入门 创建Springboot工程&#xff0c;并勾选web开发相关依赖定义HelloController类&#xff0c;添加方法hello&#xff0c;并添加相关注释运行测试 创建新的SpringBoot项目 几个注意的点&#xff1a; Name&#xff1a;基本上不用管&#xff0c;会根据下面的Ar…

大数据课程I3——Kafka的消息流与索引机制

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Kafka的消息流处理; ⚪ 掌握Kafka的索引机制; ⚪ 掌握Kafka的消息系统语义; 一、Kafka消息流处理 1. Producer 写入消息 流程说明: 1. producer 要向Kafka生产消息,需要先通过…

EditPlus连接Linux系统远程操作文件

EditPlus是一套功能强大的文本编辑器&#xff01; 1.File ->FTP->FTP Settings&#xff1b; 2.Add->Description->FTP server->Username->Password->Subdirectory->Advanced Options 注意&#xff1a;这里的Subdirectory设置的是以后上传文件的默认…

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统 2023/8/14 17:19 win11系统无法跳过联网 https://www.xpwin7.com/jiaocheng/28499.html Win11开机联网跳过不了怎么办&#xff1f;Win11开机联网跳过不了解决方法 Win11开机联网跳过不了怎么办&#xff1f;Win11开机…

Unity框架学习--5 事件中心管理器

作用&#xff1a;访问其它脚本时&#xff0c;不直接访问&#xff0c;而是通过发送一条“命令”&#xff0c;让监听了这条“命令”的脚本自动执行对应的逻辑。 原理&#xff1a; 1、让脚本向事件中心添加事件&#xff0c;监听对应的“命令”。 2、发送“命令”&#xff0c;事件…