文件操作及面试题

news2024/9/26 5:15:19

目录

文本文件和二进制文件

File概述

递归去查看某个目录下的所有文件与目录

InputStream概述

OutputStream 概述

文件操作的应用

面试题:递归文件路径并且删除指定文件

将一个指定路径的文件复制到另一个文件中去


1.文件

此处的文件有多种含义,不仅仅包括硬盘上的文件以及保存文件的目录,还包括许多的硬件设备,软件资源。

2.硬盘

硬盘与内存对比:

1.硬盘的储存空间大大,内存的储存空间小

2.硬盘的速度慢,内存的速度块

3.硬盘的成本低,内存的成本高

4.硬盘能够持久化储存,内存断电后数据消失。

3.文件系统

文件系统上的目录结构是一个树形结构,是N叉树。

4.文件路径

在文件系统中如何定位我们的一个唯一的文件是重要的难题。从文件的分布的树形结构来看,每个节点都可以从一条跟开始,一直到节点所在的路径来描述。这就是绝对路径

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


文本文件和二进制文件

文本文件:当前文件里储存的所有内容都是”文本“都是合法的字符,这些字符的编码方式按照字符集。虽然叫做文本文件但是内部还是二进制,只不过这些二进制有据可查。文本文件底层虽然是二进制储存,但是java在把文本文件读取出来的时候会自动查询码表,把二进制转化成一个个字符。而二进制文件则没有上述转换过程。

二进制文件:顾名思义就是里面储存二进制的文件。一般这种文件不能被直接打开,而是要通过特定的应用程序打开。


File概述
修饰符及返回值类型⽅法签名说明
StringgetParent()返回 File 对象的⽗⽬录⽂件路径
StringgetName()返回 FIle 对象的纯⽂件名称
StringgetPath()返回 File 对象的⽂件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的⽂件是否真实存在
booleanisDirectory()判断 File 对象代表的⽂件是否是⼀个⽬录
booleanisFile()判断 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()判断⽤⼾是否对⽂件有可写权限

说明一下,上述方法有的在使用的时候要声明一下IOException异常

1.因为有可能在使用文件的时候硬盘空间会不够用。

2没有权限,确保有权限操作文件的时候才能进行程序。读权限/写权限等待

通过renameTo(File dest)可以实现文件的转移。


递归去查看某个目录下的所有文件与目录


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

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

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

FileInputStream概述

签名说明
FileInputStream(File file)利⽤ File 构造⽂件输⼊流
FileInputStream(String name)利⽤⽂件路径(绝对/相对路径)构造⽂件输⼊流

此处隐含了一个打开文件,针对文件的读写必须先打开文件。

既然打开文件,那么就要关闭文件。打开文件其实就是打开进程的文件描述符表中,在里面创建一个新的项目。

文件描述符表可以认为是一个数组,描述了进程打开了哪些文件。每打开一项进程描述符表就多处一项信息,但是这个数组的长度是固定,如果打开文件后不及时主动关闭,一直打开不去关闭,,这里的资源就会越来越少,最后数组的空间满了就会打开失败。不及时释放就会造成内存泄漏。

为了防止忘记colse,就可以把InputStream放入try语句中,每次try执行完就会自动调用colse。

因为InputStream继承了Closeable接口,


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


InputStresm 和 OutputStream 是用于读写字节流的,读写数据的基本单位是字节。

Reader 和 Writer 用于读写字符流的,读数据的基本单位是字符。字符流内部做的工作会更多一些,读取到的字符会自动查询码表,把二进制数据转换成字符。

但是是以Rean/Write结尾的就是实现了Read/Write对象,以InputStream/OutStream结尾的就是实现了InputStream/OutputStream的字节流对象。

什么是输入输出?

以cpu的视角来看,数据远离cou就是输出,数据靠近cpu就是输入。


文件操作的应用

1.两中不同的方式读文件

使用InputStream读取文本,一次读取一个字节

一次读取多个字节


使用OutputStream输入字节,一个出入多个


使用Reader读取字符

使用Reader读取多个字符存放在数组里


使用Write写入


利⽤ Scanner 进⾏字符读取

上述例⼦中,我们看到了对字符类型直接使⽤ InputStream 进⾏读取是⾮常⿇烦且困难的,所以,我们使⽤⼀种我们之前⽐较熟悉的类来完成该⼯作,就是 Scanner 类。

构造⽅法说明
Scanner(InputStream is, String charset)使⽤ charset 字符集进⾏ is 的扫描读取


面试题:递归文件路径并且删除指定文件
private static void scan(File srcFilePath,String nameFile){
        if(!srcFilePath.isDirectory()){
            return;
        }
        File[] files = srcFilePath.listFiles();
        if(files == null || files.length == 0){
            return;
        }
        for (File f:files) {
            if(f.isFile()){
                //是否删除文件
                doDelete(f,nameFile);
            }
            else scan(f,nameFile);
        }
    }

    private static void doDelete(File file,String nameFile){
       if(!file.getName().contains(nameFile)){
           return;
       }
       Scanner scanner = new Scanner(System.in);
        System.out.println("是否删除文件? Y/N");
        String answer = scanner.nextLine();
        if(answer.equals("Y") || answer.equals("y")){
            file.delete();
            System.out.println("删除成功");
        }
    }

    public static void main(String[] args) {
        System.out.println("请输入源路径");
        Scanner scanner  = new Scanner(System.in);
        String srcFilePath = scanner.nextLine();
        File srcfilePath = new File(srcFilePath);
        if(!srcfilePath.isDirectory()){
            System.out.println("输入路径错误");
            return;
        }
        System.out.println("请输入文件名称");
        String nameFile = scanner.nextLine();
        File  srcFile = new File(nameFile);
        scan(srcfilePath,nameFile);
    }

将一个指定路径的文件复制到另一个文件中去
 //将一个文件复制到另一个文件中去
    public static void main(String[] args) {
        System.out.println("输入源文件路径");
        Scanner scanner = new Scanner(System.in);
        String srcFilePath = scanner.nextLine();
        File srcfile = new File(srcFilePath);
        if(!srcfile.isFile()){
            System.out.println("源文件路径有误");
            return;
        }

        System.out.println("输入目标文件路径");
        String destFilePath = scanner.nextLine();
        File destfile = new File(destFilePath);
        if(!destfile.isFile()){
            System.out.println("目标文件路径有误");
            return;
        }

        try (InputStream inputStream = new FileInputStream(srcfile);
             OutputStream outputStream = new FileOutputStream(destfile)){

            while (true){
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);
                if(n == -1) return;
                outputStream.write(buffer,0,n);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

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

相关文章

基于京东家电数据分析与价格预测研究【爬虫、Pyecharts、Flask、机器学习】《商品可换》

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍研究背景研究目的研究意义数据获取数据预处理数据分析与可视化大屏可视化基于Flask的系统框架集成价格预测模型每文一语 有需要本项目的代码或文档以及全部资源,或者部署…

去字节面试大模型算法岗,体验极佳!!

最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友…

拳击与格斗杂志拳击与格斗杂志社拳击与格斗编辑部2024年第4期目录

搏击研究 拳击运动员灵敏素质训练策略研究 巫金君; 4-6 拳击运动员体能训练的方法与策略 彭天泽;任安萍;高刚; 7-9 高校武术教学与体能训练的结合研究 黄昊; 10-12《拳击与格斗》投稿:cn7kantougao163.com 拳击运动员核心力量训练研究 宋林董;张钰涵…

漏洞挖掘之再探某园区系统

漏洞挖掘之再探某园区系统 上次提到还有一处可能存在任意用户登录的点,最近没什么研究就写一下,顺便看看还有其他漏洞不 0x01 任意用户登录 1、漏洞分析 通过上次提到的搜索new UserBean()的思路,发现还有一处创建用户的方法 public voi…

FPGA设计之跨时钟域(CDC)设计篇(4)----多bit信号的跨时钟域(CDC)处理方法(手撕代码)

1、为什么多bit信号跨时钟域与单bit不同 ? 跨时钟域的处理可以分为两个大类:单Bit信号跨时钟域处理、多Bit信号跨时钟域处理。分类的原因是多bit信号的传递不光只有亚稳态这一个问题,还可能会因为多个信号之间由于工艺、PCB布局等因素导致的信号传输延时(skew)的存在,从而…

【机器学习第8章——集成学习】

机器学习第8章——集成学习 8.集成学习8.1个体与集成弱分类器之间的关系组合时,如何选择学习器怎么组合弱分类器boosting和Bagging 8.2 BoostingAdaBoost算法步骤训练过程 8.3 Bagging与随机森林随机采样(bootstrap)弱学习器结合策略方差与偏差算法流程随机森林 8.4…

2024华硕迷你主机选购指南:全系列覆盖

在选择迷你主机时,消费者往往面临多种选择,而华硕作为知名的电脑硬件制造商,提供了多款性能各异的迷你主机以满足不同用户的需求。在面对华硕迷你主机的选择时,不同的需求和偏好将带领我们走向不同的选择。对于游戏爱好者&#xf…

谈谈我用BaaS开发应用的一年感受

作为一个独立开发者,我一直在寻找高效、便捷的开发工具,直到遇见了MemFire Cloud。今天,我想和大家分享一下我用这款BaaS(Backend as a Service)开发应用一年的感受。 初识MemFire Cloud 最初接触MemFire Cloud&#…

大模型正在重蹈AI的覆辙?

[ 科技圈这两年什么概念和技术最火?——大模型。 当大模型刚出现的时候,可能谁都不会想到,有一天会如此爆火。 据不完全统计,2020年至2023年间,中国已经发布的参数在10亿规模以上的大模型,就超过80个。 …

8.3 修改mysqld_exporter源码 ,改造成类似blackbox的探针型,实现一对多探测

本节重点介绍 : 官方的mysqld_exporter问题 只能一对一不能像探针一样采集多个实例dsn需要配置环境变量或者配置文件解析 需求说明 改造成类似blackbox的探针型,实现一对多探测改造方案 修改源码prometheus配置文件传参和实例地址获取改造grafana大盘配置成可以切换…

【实用指南】如何选择最适合您的圆形连接器?

圆形连接器是一种电子连接器,其基本结构为圆柱形并且拥有圆形的配合面,这种设计使得它们在物理上区别于矩形或其他形状的连接器。它们通常用于设备之间的互连,属于互连分类中的第5类。 圆形连接器的主要组成部分包括: 插头&#…

引用率全球Top2%大佬耗时几年编写深度学习神书分享!!

介绍 这本深度学习书籍是由一位拥有多重职称和荣誉的顶尖科学家所打造,被评为全球引用率最高的2%科学家之一。这本书被认为是目前最全面系统的深度学习著作,涵盖了深度学习的主流算法模型,对于研究生和博士生具有极高的参考价值。这份完整版…

FPGA的工作本科可以做吗?

在FPGA行业中,这样的偏见一直存在。 很多人认为,只有985、211的硕士才有资格涉足这一领域,甚至有人表示,即使是9、2本硕也难以找到工作,本科生就不要想了。 难到真的只有985,211的研究生才能有机会入行FPG…

人工智能深度学习系列—GANs的对抗博弈:深入解析Adversarial Loss

文章目录 1. 背景介绍2. Adversarial Loss计算公式3. 使用场景4. 代码样例5. 总结 1. 背景介绍 生成对抗网络(GANs)作为深度学习中的一大突破,其核心机制是通过对抗性训练生成逼真的数据。Adversarial Loss,即对抗性损失&#xf…

网站安全证书的作用和申请方法

网站安全证书的作用 网站安全证书,也被称为SSL证书、HTTPS证书或服务器证书,是一个由受信任的数字证书颁发机构(CA)审核颁发的数字文件。它的主要作用体现在以下几个方面: 增强用户信任:未使用HTTPS协议的…

幸福人生之理性决策

人人每天都在做决策,小到穿衣吃饭,大到恋爱工作,决策的正确性决定了人生的幸福指数。虽然有些小决策,依靠经验和感性已经足以达到一个满意的结果;有些决策即使错了,对漫长的人生来说也没有太多的影响。 但追…

win10自带dll修复丢失的几种方法,快速修复错误dll文件的方式

DLL文件,即动态链接库文件,是Windows操作系统中不可或缺的组成部分,它们包含了可由多个程序共享的代码和数据。当这些文件损坏或丢失时,可能会导致程序无法正常运行,甚至系统崩溃。 幸运的是,Windows 10操作…

JeecgBoot 低代码平台快速集成 Spring AI

JeecgBoot 是一款基于代码生成器的低代码开发平台!前后端分离架构 SpringBoot2.x和3.x,SpringCloud,Ant Design Vue3,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成…

Sun Frame:基于 SpringBoot 的轻量级开发框架(个人开源项目)

文章目录 🌞 Sun Frame:基于 SpringBoot 的轻量级开发框架(个人开源项目)🚀 欢迎使用 Sun Frame🌟 项目亮点📦 模块结构🌐 Sun-Cloud📦 Sun-Common 💡 示例与…

云原生的候选应用

提示 该内容摘自电子书《为 Azure 构建云原生 .NET 应用程序》,可在**.NET Docs**上获取,也可以免费下载 PDF并离线阅读。 考虑一下您的组织需要构建哪些应用程序。然后,看看您投资组合中的现有应用程序。其中有多少需要云原生架构&#xff…