javaEE->IO:

news2025/7/21 10:33:21

文件:

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

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

硬盘:

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.coloradmin.cn/o/2398137.html

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

相关文章

Oracle 用户/权限/角色管理

1. 用户 1.1. 用户的创建和删除 1.1.1. 创建用户 create user user identified {by password | externally} [ default tablespace tablespace ] [ temporary tablespace tablespace ] [ quota {integer [k | m ] | unlimited } on tablespace [ quota {integer [k | m ] | …

工厂方法模式深度解析:从原理到应用实战

作者简介 我是摘星&#xff0c;一名全栈开发者&#xff0c;专注 Java后端开发、AI工程化 与 云计算架构 领域&#xff0c;擅长Python技术栈。热衷于探索前沿技术&#xff0c;包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践&#xff0c;乐于分享实战经验与…

python可视化:端午假期旅游火爆原因分析

python可视化&#xff1a;端午假期旅游火爆原因分析 2025年的旅游市场表现强劲&#xff1a; 2025年端午假期全社会跨区域人员流动量累计6.57亿人次&#xff0c;日均2.19亿人次&#xff0c;同比增长3.0%。入境游订单同比大涨近90%&#xff0c;门票交易额&#xff08;GMV&#…

SOC-ESP32S3部分:28-BLE低功耗蓝牙

飞书文档https://x509p6c8to.feishu.cn/wiki/CHcowZMLtiinuBkRhExcZN7Ynmc 蓝牙是一种短距的无线通讯技术&#xff0c;可实现固定设备、移动设备之间的数据交换&#xff0c;下图是一个蓝牙应用的分层架构&#xff0c;Application部分则是我们需要实现的内容&#xff0c;Protoc…

Git-flow流

Git git是版本控制软件&#xff0c;一般用来做代码版本控制 github是一个免费版本控制仓库是国内外很多开源项目的集中地&#xff0c;其本体是一个git服务器 Git初始化操作 git init 初始化仓库 git status 查看当前仓库的状态 git add . 将改动的文件加到暂存区 gi…

VirtualBox给Rock Linux9.x配置网络

写这篇文章之前&#xff0c;先说明一下&#xff0c;我参考的是我之前写的《VirtualBox Linux网络配置》 我从CentOS7转到了Rock9&#xff0c;和配置Centos7一样&#xff0c;主流程没有变化&#xff0c;变化的是Rock9.x中的配置文件和使用的命令。 我再说一次&#xff0c;因为主…

知识图谱增强的大型语言模型编辑

https://arxiv.org/pdf/2402.13593 摘要 大型语言模型&#xff08;LLM&#xff09;是推进自然语言处理&#xff08;NLP&#xff09;任务的关键&#xff0c;但其效率受到不准确和过时知识的阻碍。模型编辑是解决这些挑战的一个有前途的解决方案。然而&#xff0c;现有的编辑方法…

.NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想

在当今数据驱动的时代&#xff0c;向量数据库&#xff08;Vector Database&#xff09;作为一种新兴的数据库技术&#xff0c;正逐渐成为软件开发领域的重要组成部分。特别是在 .NET 生态系统中&#xff0c;向量数据库的应用为开发者提供了构建智能、高效应用程序的新途径。 一…

【claude+deepseek+gemini】基于李群李代数和螺旋理论工业机器人控制系统软件UI设计

claude的首次设计html是最佳的。之后让deepseek和gemini根据claude的UI设计进行改进设计。。。当然可以尝试很多次&#xff0c;也可以让他们之间来回不断改进…… claude deepseek-r1 0528 上图为deepseek首次设计&#xff0c;下面为改进设计 …… Gemini 2.5 Pro 0506 &#x…

阿里云国际站,如何通过代理商邀请的链接注册账号

阿里云国际站&#xff1a;如何通过代理商邀请链接注册&#xff0c;解锁“云端超能力”与专属福利&#xff1f; 渴望在全球化浪潮中抢占先机&#xff1f;想获得阿里云国际站的海量云资源、遍布全球的加速节点与前沿AI服务&#xff0c;同时又能享受专属折扣、VIP级增值服务支持或…

乾坤qiankun的使用

vue2 为主应用 react 为子应用 在项目中安装乾坤 yarn add qiankun # 或者 npm i qiankun -Svue主应用 在main.js中新增 &#xff08;需要注意的是路由模型为history模式&#xff09; registerMicroApps([{name: reactApp,entry: //localhost:3011,container: #container,/…

PH热榜 | 2025-06-03

1. Knowledge 标语&#xff1a;像认识朋友一样去销售给潜在客户&#xff0c;因为你其实了解他们&#xff01; 介绍&#xff1a;Knowledge 是一个针对个人的销售智能平台&#xff0c;它利用行为数据和心理测评来识别市场上的潜在买家&#xff0c;并指导销售团队以最真实、最有…

论文略读: STREAMLINING REDUNDANT LAYERS TO COMPRESS LARGE LANGUAGE MODELS

2025 ICLR 判断模型层的重要性->剪去不重要的层&#xff08;用轻量网络代替&#xff09; 这种方法只减少了层数量&#xff0c;所以可以用常用的方法加载模型 层剪枝阶段 通过输入与输出的余弦相似度来判断各个层的重要性 具有高余弦相似度的层倾向于聚集在一起&#xff0c…

mapbox高阶,生成并加载等时图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️Fill面图层样式1.4 ☘️symbol符号图层…

DeepSeek眼中的文明印记:山海经

一、山海经到底是怎么回事&#xff1f; 《山海经》是中国古代一部极具神秘色彩的文化典籍&#xff0c;成书时间跨度较大&#xff08;大致从战国至汉代&#xff09;&#xff0c;内容庞杂&#xff0c;涉及神话、地理、物产、巫术、医学、民俗等多个领域。关于它的性质&#xff0…

在Mathematica中实现Newton-Raphson迭代

为了寻找方程 可以使用Newton-Raphson迭代方法&#xff1a; NRIter[func_, xzero_, n_ : 5] :Module[{pointlist {}, x, xold xzero, xnew, f, df, xl, xr, k},f[x_] func[x];df[x_] D[func[x], x];Do[(pointlist Join[pointlist, {{xold, 0}}, {{xold, f[xold]}}];xnew …

【Ragflow】25.Ragflow-plus开发日志:excel文件解析新思路/公式解析适配

引言 RagflowPlus v0.3.0 版本中&#xff0c;增加了对excel文件的解析支持&#xff0c;但收到反馈&#xff0c;说效果并不佳。 以下测试文件内容来自群友反馈提供&#xff0c;数据已脱敏处理。 经系统解析后&#xff0c;分块效果如下&#xff1a; 可以看到&#xff0c;由于该…

Python数据可视化科技图表绘制系列教程(一)

目录 创建多个坐标图形&#xff08;坐标系&#xff09; 图表的组成 创建图形与子图 创建子图1 创建子图2 创建子图3 创建子图4 创建子图5 添加图表元素 极坐标图1 极坐标图2 【声明】&#xff1a;未经版权人书面许可&#xff0c;任何单位或个人不得以任何形式复制、…

移除3D对象的某些部分点云

1&#xff0c;目的 移除3D对象指定区域的点云。效果 2&#xff0c;原理。 通过投影剔除指定区域外的点云数据。 3&#xff0c;主要的算子。 3.1&#xff0c;gen_image_gray_ramp 是 Halcon 中用于生成‌线性灰度渐变图像‌的算子 功能概述‌ 数学原理‌ 生成的图像灰度值…

阿里云为何,一个邮箱绑定了两个账号

阿里云“幽灵账号”之谜&#xff1a;同一个邮箱注销后仍有两个账号&#xff1f;深度揭秘成因与终极解决方案&#xff01; 你是否曾在阿里云上使用同一个邮箱注册过多个账号&#xff0c;明明已经**“彻底”注销了其中一个**&#xff0c;却惊愕地发现系统里依然**“幽灵般”挂着…