javaEE->IO:

article/2025/6/30 5:42:27

文件:

操作系统中会把很多 硬件设备 和 软件资源 抽象成“文件”,统一进行管理。

大部分谈到的文件,都是指 硬盘的文件,文件就相当于是针对“硬盘”数据的一种抽象

硬盘:

1.机械硬盘:便宜

2.固态硬盘:比机械硬盘效率高(类似于内存,cpu)

现在电脑基本都是固态硬盘,想存储更多资料就可以额外添加机械硬盘。

机械硬盘不可拆开!!!会沾满灰尘,撞坏磁头。

机械硬盘适合顺序读写,,不适合随机读写。

在服务器开发中,涉及到硬盘有机械,也有固态。在一些用来存储大规模的机器中,仍然以机械硬盘为主。

内存 VS 硬盘

1.内存速度快,硬盘速度慢

2.内存空间小,硬盘空间大

3.内存贵,硬盘便宜

4.内存数据,断电丢失;硬盘数据,断电存在

以文件的方式操作硬盘

计算机上的文件通过“文件系统”(操作系统提供的模块)来进行组织。

操作系统使用  “目录”这样的结构来组织文件 ----->树形结构

通过目录这样的层次结构,描述文件所在位置--->路径“path”

路径:

1.绝对路径:以C:  D: 盘符开头的

2.相对路径:需要先指定一个目录,作为基准目录   ,从基准目录出发,看看沿着那些路线能找到指定文件。往往以 . (当前目录,可省略)或者 .. (当前目录的上一级目录)开头

如果进行命令行操作,基准目录就是当前所处的目录:

如果是图形化界面,基准目录不好说,对于idea来说,基准目录就是项目目录:

文件的类型:

1.文本:文件中保存的数据,都是字符串,保存内容都是合法字符

2.二进制:文件中保存的数据,仅仅是二进制字符,不要求保存的内容是合法字符

合法字符:字符集/字符编码

Eg:

Utf8

有一个表格列出了什么字符对应什么编码

如果文件是utf8编码,文件中的每个数据都是合法的utf8编码的字符,就可以认为是文本文件。

如果存在一些不是utf8合法字符的情况,就是二进制文件。

计算机本身存储的数据都是二进制

如何判定一个文件是文本文件还是二进制文件?

把这个文件放入到记事本中,看是否出现乱码。

无乱码则是文本文件,有乱码则是二进制文件。

(记事本尝试按照字符的方式来展示内容,这个过程会自动查码表)

写代码时,文本文件和二进制文件,代码编写方式不同。

docx、pptx都都属于二进制

文本文件

Java对于文件操作的api

1.针对文件系统进行操作(右键目录)

:创建文件、删除文件、重命名文件。。。

2.针对文件内容的操作:流对象

:读文件/写文件

Java针对文件系统的操作,使用File类进行操作。

这个类所在的包, 叫java.io。

IO:Input->输入

       Ouput->输出

输入和输出:

pathSeparator:在一个路径中用来分隔目录的符号,开发中建议用 “/”

文件名=前缀+扩展名

使用路径构造File对象时,要把前缀和扩展名都加上。

文件都有权限

删除

package Io;import java.io.File;public class Demo3{public static void main(String[] args) throws InterruptedException {File file = new File("d:/test.txt");
//        boolean ret = file.delete();//删除文件
//        System.out.println("ret = " + ret);file.deleteOnExit();//退出之后再删除Thread.sleep(5000);//5s之后System.out.println("进程结束!");}
}

打印指定路径下的文件和目录

package Io;import java.io.File;
import java.util.Arrays;public class Demo4{public static void main(String[] args) {File file = new File("d:/");String[] list = file.list();System.out.println(Arrays.toString(list));}
}

创建目录

package Io;import java.io.File;public class Demo5 {public static void main(String[] args) {File file = new File("d:/java学习/aaa/bbb/ccc");
//        boolean ret = file.mkdir();//创建file对象代表下的目录boolean ret = file.mkdirs();//创建file对象代表下的多级目录System.out.println("ret = " + ret);}
}

重命名 

package Io;import java.io.File;public class Demo6 {public static void main(String[] args) {File srcfile = new File("D:/test.txt");File destfile = new File("D:/test2.txt");boolean ret = srcfile.renameTo(destfile);//重命名System.out.println("ret = "+ret);}
}

流对象:对文件内容操作

标准库中,提供读写文件的流对象,有多个类。大体分为两个类别:

1.字节流(对应着二进制文件):每次读/写的最小单位,都是“字节”。

代表类:

--》InputStream  输入

--》OutputStream  输出

2.字符流(对应着文本文件):每次读/写的最小单位,都是“字符”。

一个字符可能对应多个字节  -->  看当前的字符集

GBK -> 一个中文字符  =》两个字节

UTF8 ->一个中文字符 =》三个字节

(字符流是对字节流进行的又一层封装。能帮我们把文件中几个相邻的字节,转换成一个字符。帮我们完成一个自动查字符集表)

代表类:

--》Reader

--》Writer

字符流:

Reader

package Io;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class Demo7 {public static void main(String[] args) throws IOException {//文件不存在会抛异常,原本FileReader会抛一个FileNotFoundException,read会抛一个IOException,由于FileNotFoundException是IOException的子类
//      Reader reader = new Reader("d:/test.txt");//Reader是抽象类,不能new实例,只能new子类
//        Reader reader = new FileReader("d:/test.txt");//创建reader的过程就是打开文件的过程//1.一次read一个字符
//        while(true) {
//            int c = reader.read();//由于read方法可能会返回一个-1,char表示不了,所以用int
//            if(c == -1) break;
//            char ch = (char)c;
//            System.out.println(ch);
//        }//        //2.一次read多个字符
//        while(true) {//加while的原因是文件太大,数组长度不够,一次不能将文件读完,多次循环才可
//            char[] cbuf = new char[1024];//创建一个字符数组
//            int n = reader.read(cbuf);//n表示当前读到的字符的个数
//            if(n == -1 ) {//文件为空
//                break;
//            }
//            System.out.println("n = " + n);
//            for (int i = 0; i < n; i++) {
//                System.out.println(cbuf[i]);
//            }
//        }//3.文件用完得close
//        try {
//            while(true) {
//                char[] cbuf = new char[2];
//                int n = reader.read(cbuf);
//                if(n == -1) {
//                    break;
//                }
//                System.out.println("n = " + n);
//                for (int i = 0; i < n; i++) {
//                    System.out.println(cbuf[i]);
//                }
//            }
//        }finally {
//            reader.close();
//        }//try with resources:括号里的reader会在try代码块结束的时候(无论是正常结束还是抛异常),都会自动调用其中的close方法try(Reader reader = new FileReader("d:/test.txt")) {while(true) {char[] cbuf = new char[2];int n = reader.read(cbuf);if(n == -1) {break;}System.out.println("n = " + n);for (int i = 0; i < n; i++) {System.out.println(cbuf[i]);}}}}
}

输出型参数:

释放资源:

方法一:

方法二:

方法三:

Writer

字节流:

InputStream

OutputStream

如果已知字节流对象 实际的数据 是文本数据,可以通过以下的方法将 字节流 转换成 字符流

面试题:

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

package Io;import java.io.File;
import java.util.Scanner;public class Demo13 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//1.先让用户输入一个要扫描的目录System.out.println("请输入要扫描的路径:");String path = scanner.nextLine();File rootPath = new File(path);if(!rootPath.isDirectory()) {//如果此时不是目录// 对用户输入的内容一定要进行合法性验证!!!!!System.out.println("您输入的路径有误!!!");return;}//2.让用户再输入一个查询的关键词System.out.println("请输入要删除文件的关键词:");String word = scanner.nextLine();//3.进行递归扫描scanDir(rootPath,word);}private static void scanDir(File rootPath, String word) {//1.先列出路径中 所有的文件和目录File[] files = rootPath.listFiles();if(files == null) {//当前目录为空,直接返回return;}//2.遍历这里的每个元素,针对不同类型做出处理for(File file : files) {//加个日志,方便观察当前文件递归的执行过程System.out.println("当前扫描的文件:" + file.getAbsolutePath());if(file.isFile()) {//普通文件,检查文件是否需要删除,并执行是删除操作checkDelete(file,word);}else {scanDir(file,word);}}}private static void checkDelete(File file, String word) {if(!file.getName().contains(word)) {//不含关键词return;}//需要删除的System.out.println("当前文件为: " + file.getAbsolutePath() + ", 确定要删除(Y/N): ");Scanner scanner = new Scanner(System.in);String choice = scanner.nextLine();if(choice.equals("Y") || choice.equals("y")) {//真正删除file.delete();System.out.println("删除完毕!");}else {//输入其他值都会取消删除操作System.out.println("取消删除!");}}
}


http://www.hkcw.cn/article/ceyOXMoILM.shtml

相关文章

Python窗体编程技术详解

文章目录 1. Tkinter简介示例代码优势劣势 2. PyQt/PySide简介示例代码(PyQt5)优势劣势 3. wxPython简介示例代码优势劣势 4. Kivy简介示例代码优势劣势 5. PySimpleGUI简介示例代码优势劣势 技术对比总结选择建议 Python提供了多种实现图形用户界面(GUI)编程的技术&#xff0c…

短视频平台差异视角下开源AI智能名片链动2+1模式S2B2C商城小程序的适配性研究——以抖音与快手为例

摘要 本文以抖音与快手两大短视频平台为研究对象&#xff0c;从用户群体、内容生态、推荐逻辑三维度分析其差异化特征&#xff0c;并探讨开源AI智能名片链动21模式与S2B2C商城小程序在平台适配中的创新价值。研究发现&#xff0c;抖音的流量中心化机制与优质内容导向适合品牌化…

线程间和进程间是如何进行通信

进程是由线程组成的&#xff0c;进程所拥有的功能线程全部具有&#xff0c;线程所拥有的功能进程不一定有&#xff0c;所有线程的通信方式&#xff0c;进程不一定有。 线程之间的通信主要有两种&#xff1a;共享内存和信息传递 (端口&#xff0c;方法调用等等) 进程之间的通…

wow Warlock shushia [Dreadsteed]

wow Warlock shushia [Dreadsteed] 克索诺斯恐惧战马坐骑的任务 在《魔兽世界》怀旧服中&#xff0c;术士大马任务&#xff0c;也就是获得克索诺斯恐惧战马坐骑的任务&#xff0c;是一个既充满挑战又极具成就感的系列任务。以下是详细的任务流程&#xff1a; 一、任务起始 ‌…

Axure 基础入门

目录 认识产品经理 项目团队* 基本概述 认识产品经理 A公司产品经理 B公司产品经理 C公司产品经理 D公司产品经理 产品经理工作范围 产品经理工作流程* 产品经理的职责 产品经理的分类 产品经理能力要求 产品工具 产品体验报告 原型设计介绍 原型设计概述 为…

快手可灵视频V1.6模型API如何接入免费AI开源项目工具

全球领先的视频生成大模型&#xff1a;可灵是首个效果对标 Sora 、面向用户开放的视频生成大模型&#xff0c;目前在国内及国际上均处于领先地位。快手视频生成大模型“可灵”&#xff08;Kling&#xff09;&#xff0c;是全球首个真正用户可用的视频生成大模型&#xff0c;自面…

哈工大2024春csapp大作业——程序人生-Hello’s P2P

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 网络空间安全 学   号 2022110717 班   级 2203901 学 生 胡丁鹏     指 导 教 师 史先俊    计算机科学与…

程序人生的学习密码:终身学习促进职业生涯飞跃

程序人生的学习密码:终身学习促进职业生涯飞跃 关键词:终身学习、程序员成长、知识体系构建、学习方法论、技术迭代、职业发展、认知升级 摘要:在技术快速迭代的IT领域,程序员的职业生涯能否实现持续飞跃,核心在于是否构建了高效的终身学习体系。本文从认知科学和职业发展…

软件测试找工作|20道银行项目高频面试题

小编给大家上面试干货啦&#xff01;把前两天整理的银行项目面试题系列汇总给你们复习吼&#xff01; 先来看下面试题的目录叭...... 1、介绍一下贷款的项目&#xff1f; 贷款项目是银行业务中的重要组成部分&#xff0c;它是指银行向客户提供资金&#xff0c;让客户在约定的期…

【老张的程序人生】我命由我不由天:我的计算机教师中级岗之旅

在计算机行业的洪流中&#xff0c;作为一名20年计算机专业毕业的博主&#xff0c;我深知这几年就业的坎坷与辉煌。今天&#xff0c;我想与大家分享我的故事&#xff0c;一段关于梦想、挑战与坚持的计算机教师中级岗之旅。希望我的经历能为大家提供一个发展方向&#xff0c;在计…

程序人生-Hello’s P2P(2025)

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算机与电子通信 学   号 2023111735 班 级 23L0509 学 生 杨祥锐 指 导 教 师 史先俊 …

程序人生-Hello‘s P2P

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 生命科学和医学学院 学   号 2023113108 班   级 2352001 学 生 杜若林 指 导 教 师 刘松波 计算机科学与技术…

2025哈工大计统PA-P2P程序人生

摘 要 作此论文的目的是为了了解程序从输入终端到在终端中显示运行的一系列过程。本文详细分析了计算机在生成hello可执行文件的预处理、编译、汇编、链接、进程管理等整个生命周期&#xff0c;解析了hello程序从初始状态输入到结束执行被回收的全部过程&#xff0c;查看并注…

程序人生Hello’s P2P CSAPP大作业

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算学部 学   号 2023112327 班   级 23L0509 学 生 朱永久      指 导 教 师 …

数据库系统概论(十五)详细讲解数据库视图

数据库系统概论&#xff08;十五&#xff09;数据库视图 前言一、什么是视图&#xff1f;二、视图的作用1. 保护数据安全2. 屏蔽表结构变化3. 简化复杂查询4. 多角度展示数据 三、如何创建视图&#xff1f;语法格式&#xff1a;5种常见视图类型&#xff1a; 四、更新视图的限制…

面向对象进阶 | 深入探究 Java 静态成员与继承体系

个人主页 文章专栏 文章目录 个人主页文章专栏 一、static&#xff08;静态&#xff09;1.static 静态变量代码展示内存图 2.static 静态方法工具类&#xff1a;练习&#xff1a; 3.static注意事项4.重新认识main方法 二、继承1.继承概述2.继承的特点3.子类到底能继承父类中的…

Python趣学篇:用Pygame打造绚烂流星雨动画

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《Python星球日记》 目录 一、项目简介与效果展示二、技术栈与核…

【大模型学习】项目练习:视频文本生成器

&#x1f680;实现视频脚本生成器 视频文本生成器 &#x1f4da;目录 一、游戏设计思路二、完整代码解析三、扩展方向建议四、想说的话 一、⛳设计思路 本视频脚本生成器采用模块化设计&#xff0c;主要包含三大核心模块&#xff1a; 显示模块&#xff1a;处理用户输入和…

BFS每日刷题

目录 P1332 血色先锋队 173. 矩阵距离 P1162 填涂颜色 P1506 拯救oibh总部 P2895 [USACO08FEB] Meteor Shower S P3395 路障 P1332 血色先锋队 #include <iostream> #include <cstring> #include <queue> using namespace std; int dis[600][600]; in…

中国城市规模指数(1992-2023)

1816 中国城市规模指数(1992-2023) 数据简介 中国城市规模指数&#xff0c;参考丁从明等&#xff08;2020&#xff09;的做法&#xff0c;通过中国夜间灯光数据&#xff0c;提取其中各城市夜间灯光值大于等于22的区域取其平均值&#xff0c;再取其自然对数即为城市规模指数数…