【文件操作与IO】

news2025/1/9 18:11:49

目录

一、文件

1、文件的定义

2、File类

🍅File类中的常见属性

🍅File类中的构造方法

🍅File类中的常用方法

二、文件内容的读取-数据流

🍅InputStream概述

🍅FileInputStream 

🍅OutputStream 概述

🍅FileReader

🍅FileWriter

🍅Scanner

🍅PrintWriter​

🌹综合案例1

🌹综合案例2


一、文件

1、文件的定义

需要知道一些简单的概念:

1、狭义上的文件

        硬盘上保存的数据,都是“文件”来组织的,本质上都是二进制或者字符组织的数据,被打包成一个文件存储在硬盘中。常见的文件有图片(png),文本(txt),可执行文件(exe),音频和视频等(mp3)。其中的文件夹也是一种特殊的文件,也叫作目录。

        通常说的文件都是存储在硬盘上的(实现数据的持久化),原因主要在于硬盘的特点:

(1)硬盘容量大,内存容量小;

(2)硬盘读写速度慢,内存读写速度快;

(3)硬盘造价低,内存成本高;

(4)硬盘上的数据就算断电也不会丢失,内存中的数据断电会丢失。

其中:1byte(1b) = 8bit;

           1kb = 1024b;

           1mb = 1024kb;

           1gb = 1024mb;

2、广义上的文件

        操作系统的主要功能是对计算机资源进行统一管理与分配。对于Linux系统来讲,所有的计算设备都会被描述(抽象为)文件。


3、访问目录

windows中的目录是默认是反斜杠\,但是用/斜杠也支持;在其他的系统中基本都是默认斜杠/。

2、File类

        操作系统的一个重要功能就是对文件的管理,每个操作系统都有自己的一套API调用,Java作为一个跨平台的语言,JVM针对不同的操作系统做了一层封装,因此我们只需要使用JDK提供的关于文件操作的API就可以完成不同系统上的文件操作。

         其中,输入和输出以内存为参照物的,输入指的是从外部输入到内存中,输出指的是将内存的数据输出到外部,比如磁盘,网卡等。

🍅File类中的常见属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String类型的表示
static charpathSeparator依赖于系统的路径分隔符,char类型的表示

🍅File类中的构造方法

🍅File类中的常用方法

(1)获取路径的方法

修饰符及返回值类型方法说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象修饰过的绝对路径

(2)判断方法

修饰符及返回值类型方法说明
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是不是一个目录
booleadisFile()判断File对象代表的文件是否是一个普通文件

(3)创建文件

修饰符及返回值类型方法说明
booleancreatNewFile()根据File对象,自动创建一个空文件。创建成功则返回True
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间目录

 (4)显示文件

修饰符及返回值类型方法说明
String[]list()返回File对象代表的目录下面的所有文件名
File[]listFiles()返回File对象代表的目录下的所有文件,以File文件表示

 (5)删除文件

修饰符及返回值类型方法说明
booleandelete()根据File对象,删除该文件。成功后返回True
booleandeleteOnExit()根据File对象,标注文件将被删除,删除动作等到JVM运行结束后才进行

 (6)判断文件是否可读写

修饰符及返回值类型方法说明
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限
booleanrenameTo(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()关闭字节流

🍅1、FileInputStream 

(构造方法)签名说明
FileInputStream(File file)利用File构建文件输入流
FileInputStream(String name)利用文件路径构建文件输入流

将文件完全读完的两种方式。后一种的IO次数更少,性能更好。

🍅OutputStream 概述

修饰符及返回值类型方法签名说明
voidwrite(int b)写入字节数据(传入的值,最终都会被写入文件中)
voidwrite(byte[] b)将b这个字符数组中的数据全部写入os中(传入的值,最终都会被写入文件中)
voidwrite(byte[] b,int off,int len)

将b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len个

voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。
 

 🍅FileReader

  🍅FileWriter

 注意:无论是输入流还是输出流,用完之后一定要close()。在写入内容之后,强烈建议用输出流的flush来刷新缓冲区。

  🍅Scanner

   🍅PrintWriter


🌹综合案例1

public class Exe01 {
    /**
     * 要求:扫描指定目录,找到目录中包含的所有指定字符的文件(不包含目录),并且后期询问用户是否要删除该文件
     * @param args
     */
    public static void main(String[] args) throws IOException {
        //1、接收用户输入的扫描路径
        System.out.println("请输入要扫描的路径(绝对路径):");
        Scanner sc = new Scanner(System.in);
        String rootPath = sc.next();
        //2、路径的合法性校验
        File root = new File(rootPath);
        //2.1判断路径是否存在
        if(!root.exists()){
            System.out.println("路径不存在");
            //直接结束该方法
            return;
        }
        //2.2判断File是不是一个目录,如果不是目录则不合法
        if (!root.isDirectory()) {
            System.out.println("该指定的路径不是一个有效目录");
            return;
        }
        //3、接收要在目录中查找的文件名:我们把它叫做关键字
        System.out.println("请输入关键字:");
        String key = sc.next();
        if(key == null || key.equals("")){
            System.out.println("关键字不能为空");
            return;
        }
        //4、开始查找 该目录下的所有问津
        scan(root,key);
    }

    /**
     * 输入路径和文件,找到该路径下的所有文件名为key的文件
     * @param root 目录的路径
     * @param key 要在目录中查找的文件
     */
    private static void scan(File root, String key) throws IOException {
        //1、先获取root下的所有文件,包括目录
        File[] files = root.listFiles();
        //2、递归的终止条件
        if(files == null || files.length == 0){
            return;
        }
        //3、开始遍历文件数组中的每个文件
        for (int i = 0; i < files.length; i++) {
            //3.1先取出每个文件
            File tempFile = files[i];
            //3.2判断是文件还是目录
            //如果是文件,判断是不是我们要找的文件(根据关键字判断)
            if(tempFile.isFile()){
                //获取文件的名字
                String fileName = tempFile.getName();
                if(fileName.contains(key)){
                    System.out.println("找到文件"+tempFile.getCanonicalPath()+"是否需要删除(Y/N)");
                }
                //获取用户的选择
                Scanner sc = new Scanner(System.in);
                String choice = sc.next();
                //判断是否要删除
                if(choice.equalsIgnoreCase("y")){
                    //删除文件
                    tempFile.delete();
                    System.out.println(tempFile.getCanonicalPath()+"删除成功");
                }
            }
            //说明是目录:则继续递归寻找文件
            else{
                scan(tempFile,key);
            }
        }
    }
}

🌹综合案例2

 

public static void main(String[] args) {
        //1、接收用户输入的源文件路径->要复制的文件
        System.out.println("请输入源文件路径(绝对路径):");
        Scanner sc = new Scanner(System.in);
        String sourcePath = sc.next();
        //2、路径的合法性校验
        File sourceFile = new File(sourcePath);
        //2.1判断路径是否存在
        if (!sourceFile.exists()) {
            System.out.println("源文件不存在");
            return;
        }
        //2.2判断是不是一个文件
        if (!sourceFile.isFile()) {
            System.out.println("源文件不是一个有效的文件");
            return;
        }
        //3、接收用户输入:要将复制后的文件放在哪个路径下
        System.out.println("请输入目标文件路径(绝对路径):");
        String destPath = sc.next();
        File destFile = new File(destPath);
        //3.1目标文件的合法性校验
        if(destFile.exists()){
            System.out.println("目标文件已存在");
            return;
        }
        //3.2判断目标文件的父目录是否存在
        if (!destFile.getParentFile().exists()) {
            System.out.println("目标文件的父目录不存在");
            return;
        }
        //4、循环读取源文件的内容并写入到目标文件中
        try(FileInputStream inputStream = new FileInputStream(sourceFile);
        FileOutputStream outputStream = new FileOutputStream(sourceFile)) {
            //4.1定义一个byte数组用来作为输出型参数,保存每次读取到的文件内容
            byte[] bytes = new byte[1024];
            //4.2开始循环读取内容
            while (true){
                int len = inputStream.read(bytes);
                //4.3已经读完了
                if(len == -1){
                    break;
                }
                //4.4 开始写入到目标文件中
                outputStream.write(bytes);
                //4.5 强制刷新缓冲区
                outputStream.flush();
            }
            System.out.println("复制成功");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
    }

注意:

  


努力学习,等待下一个火锅日~~

 

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

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

相关文章

真题详解(汇总)-软件设计(八十三)

真题详解&#xff08;include&#xff09;-软件设计&#xff08;八十二)https://blog.csdn.net/ke1ying/article/details/130828203 软件交付后进入维护阶段&#xff0c;采用专门的程序模块对文件或者数据中记录进行增加、删除和修改操作&#xff0c;属于&#xff1f; 解析&a…

Netty重试一定次数后调用System.exit(n)退出应用程序(二)

System.exit()方法 原型&#xff1a;System.exit(int status) 其功能主要是调用Runtime.getRuntime().exit(status); 作用是终止当前正在运行的Java虚拟机&#xff0c;这个status表示退出的状态码&#xff0c;非零表示异常终止。(可以返回给其他进程的调用者一个调用的返回码…

RES 新的数据集 Advancing Referring Expression Segmentation Beyond Single Image 论文笔记

RES 新的数据集 Advancing Referring Expression Segmentation Beyond Single Image 论文笔记 一、Abstract二、引言三、相关工作3.1 Referring Expression Segmentation (RES)3.2 CoSalient Object Detection (CoSOD) 四、提出的方法4.1 概述文本 & 图像编码器TQM & H…

OpenStreetMap实战

介绍 OpenStreetMap&#xff08;OSM&#xff09;是一个由志愿者创建并维护的免费和开源的地图数据库。其目的是为全球任何人提供可自由使用、编辑和分发的地图数据。OpenStreetMap数据库中的地理要素包括道路、建筑、河流、森林、山脉、公共设施等。由于OpenStreetMap是开放的…

数据结构初阶 —— 二叉树链式结构

目录 一&#xff0c;二叉树链式结构 二&#xff0c;二叉树的遍历&#xff08;四种&#xff09; 前序遍历 中序遍历 后序遍历 层序遍历 三&#xff0c;二叉树接口 四&#xff0c;试题 一&#xff0c;二叉树链式结构 普通二叉树的增删查改&#xff0c;意义不大&#xff1b…

JavaScript基础扫盲

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 本篇文章为大家带来JavaScript的学习&#xff0c;一图胜千言~~~ 目录 文章目录 1.1 JavaScript (简称 JS) 1.2 JavaScript发展历史 1.3 JavaScript运行过程 二、JavaScript的基础语法 2.1 …

Linux内核源码分析-进程调度(五)-组调度

出现的背景 总结来说是希望不同分组的任务在高负载下能分配可控比例的CPU资源。为什么会有这个需求呢&#xff0c;假设多用户计算机系统每个用户的所有任务划分到一个分组中&#xff0c;A用户90个任务&#xff0c;而B用户只有10个任务&#xff08;这100个任务假设都是优先级一…

物联网手势控制小车所遇问题与解决方案

LCD1602无法显示问题 问题描述&#xff1a;按照开源社区教程完成LCD1602驱动显示程序的编写&#xff0c;成功点亮屏幕&#xff0c;开启背光&#xff0c;但无法观察到显示数据。 分析过程与解决方案&#xff1a; 1.是否IIC地址不对 使用以下代码扫描IIC总线上的设备&#xf…

Go学习圣经:队列削峰+批量写入 超高并发原理和实操

说在前面&#xff1a; 本文是《Go学习圣经》 的第二部分。 第一部分请参见&#xff1a;Go学习圣经&#xff1a;0基础精通GO开发与高并发架构&#xff08;1&#xff09; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群中&#xf…

K近邻算法实现红酒数据集分类

目录 1. 作者介绍2. K近邻算法介绍2.1 K基本原理2.2 算法优缺点 3. KNN红酒数据集分类实验3.1 获取红酒数据集3.2 KNN算法3.3 完整代码 4. 问题分析参考链接&#xff08;可供参考的链接和引用文献&#xff09; 1. 作者介绍 路治东&#xff0c;男&#xff0c;西安工程大学电子信…

面试问题汇总

最近面试了几家公司&#xff0c;对问到的问题汇总一下。 Unity 是左手坐标系还是右手坐标系? 这个题靠记忆答的答错了&#xff0c;是左手坐标系。 大拇指指的方向是X轴&#xff0c;食指指的方向是Y轴方向&#xff0c;中指指的方向Z轴方向。 场景中游戏物体Activity为false,G…

C语言字符串函数和内存函数的介绍与模拟实现

0.前言 C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数. 1.字符串函数介绍与模拟实现 C语言本身就带有一些库函数&#xff0c;所…

研发工程师玩转Kubernetes——CPU配额

在一个Pod中&#xff0c;可以有多个容器&#xff0c;比如一个主要业务容器和若干辅助业务容器。如果辅助业务容器内程序有问题&#xff0c;导致占用了大量的CPU资源&#xff0c;进而影响了主要业务容器的执行效率&#xff0c;那就需要进行干涉了。本节我们将使用“资源配额”来…

Edgedetect

边缘检测&#xff0c;检测上升沿 对于 8 位矢量中的每个位&#xff0c;检测输入信号何时从一个时钟周期中的 0 变为下一个时钟周期的 1&#xff08;类似于正边沿检测&#xff09;。输出位应在发生 0 到 1 转换后设置周期。 以下是一些示例。为清楚起见&#xff0c;in[1] 和 pe…

Jenkins+GitLab+Docker搭建前端自动化构建镜像容器部署(无本地证书,映射版本)

前言 &#x1f680; 需提前安装环境及知识点&#xff1a; 1、Docker搭建及基础操作 2、DockerFile文件描述 3、Jenkins搭建及基础点 &#x1f680; 目的&#xff1a; 将我们的前端项目打包成一个镜像容器并自动发布部署&#xff0c;可供随时pull访问 一、手动部署镜像及容器 1…

【Linux】线程分离 | 线程库 | C++调用线程 | 线程局部存储

文章目录 1. 线程分离1. 为什么要线程分离&#xff1f;2. 具体使用3. 为什么有时候分离在调用join 会正常运行&#xff1f; 2. 如何理解线程库&#xff1f;如何理解 先描述 在组织&#xff1f; 3. C中使用多线程4. 线程局部存储局部变量全局变量 1. 线程分离 1. 为什么要线程分…

服务器虚拟化部署

服务器虚拟化部署 1、背景2、目的3、环境4、部署4.1、部署VMware ESXi4.1.1、准备工作4.1.2、部署ESXi4.1.3、配置ESXi4.1.4 、部署虚拟机 1、背景 项目上利旧9台服务器&#xff0c;项目需要使用15台服务器&#xff0c;外购已经没有项目硬件采购预算&#xff0c;只能从目前的…

自定义HikariCP连接池

文章目录 一、简介1、概述2、地址 二、配置参数1、Hikari原生参数2、Springboot中参数 三、springboot中使用四、自定义数据源1、各模块2、完整代码3、多数据源 五、多数据源dynamic中使用1、简介2、引入依赖3、参数配置 六、XMind整理 一、简介 1、概述 官方解释&#xff1a…

zabbix 自动发现与自动注册、部署 zabbix 代理服务器及部署 Zabbix 高可用集群

目录 一、zabbix 自动发现二、zabbix 自动注册&#xff08;对于 agent2 是主动模式&#xff09;三、部署 zabbix 代理服务器四、部署 Zabbix 高可用集群五、Zabbix 监控 Windows 系统六、Zabbix 监控 java 应用七、Zabbix 监控 SNMP 一、zabbix 自动发现 zabbix 自动发现&…

Nautilus Chain开启全球行,普及Layer3概念加速其采用

在去年&#xff0c;在 2022 年&#xff0c;Vitalik 进一步提出了 Layer3 的概念与早期形态&#xff0c;期盼弥补目前链体系存在的不足&#xff0c;并为 Layer3 提出了三大目标&#xff0c;即Layer2 用于扩展&#xff0c;Layer3 用于定制功能&#xff0c;如隐私&#xff1b;Laye…