文件操作/IO

news2024/11/22 22:49:41

文件

文件是一种在硬盘上存储数据的方式,操作系统帮我们把硬盘的一些细节都封装起来了,程序员只需要了解文件相关的接口即可,相当于操作文件就是间接的操作硬盘了
硬盘用来存储数据,和内存相比硬盘的存储空间更大,访问速度更慢,成本更低,持久化存储,操作系统通过“文件系统”这样的模块来管理硬盘
在这里插入图片描述
不同的文件系统管理文件的方式都是类似的
通过目录(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这个文件,应该是false
        System.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. 如果当前文件是目录文件, 就递归执行 scanDir
                scanDir(f, word);
            }
        }
    }

    private static void dealFile(File f, String word) {
        // 1. 先判定当前文件名是否包含 word
        if (!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.coloradmin.cn/o/879975.html

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

相关文章

代码运行出现:No module named ‘torch_geometric‘

这是没有torch_geometric库导致的&#xff0c;但是不能像一般库安装‘pip install 库名’或者‘conda install 库名’进行安装&#xff0c;经常会报错!!! 需要先安装四个小部件再安装torch_geometric&#xff0c;具体安装步骤如下&#xff1a; step 1&#xff1a;查看自己环境…

简约时尚的健康手表,智能守护每一刻,dido Y60上手

智能手表是现在很流行的一种智能设备&#xff0c;很多品牌都推出了各种各样的产品&#xff0c;但是大部分都更侧重功能和运动的方面&#xff0c;健康监测往往只是配角&#xff0c;而随着人们对自己的健康越来越重视&#xff0c;有些朋友只是单纯的需要一块专业的健康监测手表。…

SIFT 算法 | 如何在 Python 中使用 SIFT 进行图像匹配

介绍 人类通过记忆和理解来识别物体、人和图像。你看到某件事的次数越多,你就越容易记住它。此外,每当一个图像在你的脑海中弹出时,它就会将该项目或图像与一堆相关的图像或事物联系起来。如果我告诉你我们可以使用一种称为 SIFT 算法的技术来教机器做同样的事情呢? 尽管…

部署私有知识库项目FastGPT

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景。 项目源码&#xff1a; GitHub - c121914yu/FastGPT: A platform that uses the Open…

【推荐】7个可以改变我们在3dMax中工作方式的插件

​以下给大家介绍的这些插件&#xff0c;将改变我们在3d Max中的工作方式&#xff0c;让生活更加轻松。 Glue Utility&#xff08;粘合实用程序&#xff09; 这些年来&#xff0c;这个工具改变了我的游戏规则。它使我能够执行许多任务&#xff0c;否则这些任务要么是不可能…

在矩池云使用 ChatGLM2-6B ptuning

本文参考 ChatGLM2-6B 官方文档&#xff0c;在矩池云复现了对于 ChatGLM2-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%&#xff0c;再通过模型量化、Gradient Checkpoint 等方法&#xff0c;最低只需要 7GB 显存即可运行。 官方文档地址…

一百五十六、Kettle——Linux上安装的Kettle9.3连接ClickHouse数据库(亲测,附流程截图)

一、目标 kettle9.3在Linux上安装好后&#xff0c;需要与ClickHouse数据库建立连接 二、前提准备 &#xff08;一&#xff09;在Linux已经安装好kettle并可以启动kettle &#xff08;二&#xff09;已知kettle和ClickHouse版本 1、kettle版本是9.3 2、ClickHouse版本是21…

深度学习优化器

1、什么是优化器 优化器用来寻找模型的最优解。 2、常见优化器 2.1. 批量梯度下降法BGD(Batch Gradient Descent) 2.1.1、BGD表示 BGD 采用整个训练集的数据来计算 cost function 对参数的梯度&#xff1a; 假设要学习训练的模型参数为W&#xff0c;代价函数为J(W)&#xff0c;…

项目管理工具探析:详细介绍四种常用选择

市场上的项目管理工具&#xff0c;主要是解决项目计划制定、任务协作、文档协作这几方面的问题&#xff0c; 下面简单聊聊一些自己用过的工具&#xff1a; 1、Excel/在线协作表格 如果项目简单&#xff0c;任务数少&#xff0c;没什么依赖&#xff0c;那么就可以用Excel来做项目…

静电放电发生器的操控模式和释放模式有哪些方式

静电放电是一种自然现象 &#xff0c;当两种不同介电强度的材料相互摩擦时&#xff0c;就会产生静电电荷&#xff0c;当其中一种材料上的静电荷积累到一定程度&#xff0c;在与另外一个物体接触时&#xff0c;就会通过这个物体到大地的阻抗而进行放电。静电放电及影响是电子设备…

四大运营商的大流量卡测评,看完您会选哪个运营商?

很多朋友都说网上的流量卡资费是真的便宜&#xff0c;但是小编认为资费便宜归便宜&#xff0c;但是运营商的小心思也有不少。 ​ 今天小编就带大家看一看三大运营商推出的正规流量卡都有哪些小心思&#xff1f; 首先&#xff0c;移动推出的线上大流量卡数量是最少的&#xff…

算法|Day37 动态规划5

LeetCode 1049- 最后一块石头的重量 II 题目链接&#xff1a;力扣 题目描述&#xff1a;有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量…

Blazor : Component parameter should be auto property,无法修改get;set;

文章目录 Blazor 无法在get;set;里面定义方法 Blazor 无法在get;set;里面定义方法 Blazor Component组件 其实原因就是微软觉得你在get;set;里面放自定义逻辑&#xff0c;太容易出现无限父子回调的问题。如果你要在get时候进行某种逻辑&#xff0c;那你就在OnParameterSetAs…

归并排序 与 计数排序

目录 1.归并排序 1.1 递归实现归并排序&#xff1a; 1.2 非递归实现归并排序 1.3 归并排序的特性总结: 1.4 外部排序 2.计数排序 2.1 操作步骤: 2.2 计数排序的特性总结: 3. 7种常见比较排序比较 1.归并排序 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种…

Qgis统计面要素内点的数量,不同类型点的数量

简单&#xff1a; 统计面要素内点的数量。 工具栏直接搜索&#xff1a;统计点在多边形中的数量 统计面要素内不同类型点的数量。 查看QGIS-11 “按位置连接属性工具”——“按类别统计工具”——pandas透视表统计 数据透视表参考链接 参考链接&#xff1a; QGIS入门-9 统计面…

leetcode375. 猜数字大小 II(动态规划-java)

猜数字大小 II lc - 375 猜数字大小 II题目描述暴力递归 记忆化搜索代码演示动态规划 动态规划 lc - 375 猜数字大小 II 题目描述 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字&…

开学季 | 新生入学必备好物,快来看看你漏掉了哪些!

一转眼年就过完了&#xff0c;又到了开学季。有很多学生又要重新走进校园&#xff0c;开始自己的学生宿舍生活。作为一个从初中就开始住宿舍的过来人&#xff0c;有一些东西确实是我当时在学校里用过的&#xff0c;非常好用的神器&#xff0c;可以非常好的帮助我们生活、学习或…

界面组件DevExpress Reporting——支持图表本地化和可绑定属性

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 在最近的更新(v23.1)中&#xff0c;官方扩展了…

无脑入门pytorch系列(三)—— nn.Linear

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

智能设备管理系统对企业设备管理效果有作用吗?

智能设备管理系统对企业设备管理效果具有显著的作用和积极的影响。它可以提高设备管理的效率、准确性和可靠性&#xff0c;帮助企业降低运营成本、提高生产效率&#xff0c;并为企业提供更好的决策支持。以下是智能设备管理系统对企业设备管理效果的几个方面影响&#xff1a; …