文件操作---IO

news2025/7/23 13:36:49

文章目录

  • 什么是文件?
  • 文件的路径
  • 文件的系统操作
  • 文件的内容操作
    • 面向字节流
      • 面向字节流的读操作(InputStream)
      • 面向字节流的写操作(OutputStream)
    • 面向字符流
      • 面向字符流的读操作(Reader)
      • 面向字符流的写操作(Writer)
    • 将字节流操作改造成字符流操作
      • 让InputStream可以读字符流(Scanner)
      • 让OutputStream可以写字符流(PrintWrite)

什么是文件?

  • 狭义的文件:存储在硬盘上的数据,以“文件”为单位,进行组织。比如:
    在这里插入图片描述

  • 广义的文件:操作系统是用来管理软硬件资源的,操作系统往往把这些资源都统一的抽象成“文件”来进行管理。即“一切皆文件”。

    比如:有一个键盘,从键盘读取数据就是读文件;将信息显示在屏幕上就是写文件

文件的路径

文件在电脑中是以“目录结构”的形式存储的,这个“目录结构”其实是一个N叉树。那么我们怎样找到一个具体的文件地址呢?就通过“路径”的概念,来描述一个文件在你电脑上的具体位置。路径又分为两类:绝对路径和相对路径。

  • 绝对路径:

    在这里插入图片描述
    像这样的、完整的路径就是绝对路径。它从盘符开始一直指向你要找的文件。
    通过’\'来分割每一级目录

  • 相对路径:

    首先得先有一个“基准路径”,也叫“工作路径”。
    相对路径就是以基准路径为起点,一直指向你要找的文件。

    如果基准路径是D,则相对路径是 .\program\qq\Bin\qq.exe 通过 '.‘表示当前目录
    如果基准路径是D:\program\qq\Bin,则相对路径是 .\qq.exe
    如果基准路径是D:\program\WeChat,则相对路径是 …\qq\Bin\qq.exe 通过’…'表示返回上级目录

文件的系统操作

文件操作是属于操作系统层面提供的一些API,不同的操作系统提供的API不同。但是Java作为一个跨平台的语言,就在JVM中把这些不同的API进行了封装。我们就可以直接使用库中的类来进行操作了。

我们使用File类来进行文件操作,它里面有一些方法需要我们学习:

  1. 获取文件的基本属性
        //写法一:后三个看起来一样
        File file = new File("D:/test.txt");
        
        //获取父目录文件路径
        System.out.println(file.getParent());            //D:/
        //获取文件名
        System.out.println(file.getName());				//test.txt
        //获取文件路径
        System.out.println(file.getPath());				//D:/test.txt
        //获取文件的绝对路径
        System.out.println(file.getAbsolutePath());		//D:/test.txt
        //获取修饰过的绝对路径
        System.out.println(file.getCanonicalPath());	//D:/test.txt
		//写法二:后三个不一样
        File file = new File("./test.txt");
        
        //获取父目录文件路径
        System.out.println(file.getParent());            //.
        //获取文件名
        System.out.println(file.getName());				//test.txt
        //获取文件路径
        System.out.println(file.getPath());				//./test.txt
        //获取文件的绝对路径
        System.out.println(file.getAbsolutePath());		//D:\Code\Java-Code\java-code\2023-10-31\.\test.txt
        //获取修饰过的绝对路径
        System.out.println(file.getCanonicalPath());	//D:\Code\Java-Code\java-code\2023-10-31\test.txt
  1. 判断文件的状态
		File file = new File("./test.txt");
        //判断文件是否存在
        System.out.println(file.exists());			//false
        //判断文件是否是目录
        System.out.println(file.isDirectory());		//false
        //判断文件是否是普通文件
        System.out.println(file.isFile());			//false
        
        file.createNewFile();
        System.out.println(file.exists());			//true
        System.out.println(file.isDirectory());		//false
        System.out.println(file.isFile());			//true
  1. 文件重命名
        //重命名
        //前提:srcFile必须存在  destFile必须不存在
        File srcFile = new File("./aaa.txt");
        File destFile = new File("./bbb.txt");
        
        System.out.println(srcFile.getName());			//aaa.txt

        srcFile.renameTo(destFile);
        System.out.println(srcFile.getName());			//bbb.txt
  1. 创建目录
        //创建目录
        File file = new File("./testDir");
        file.mkdir();
        

        //创建多级目录
        File file = new File("./testDir/aaa/bbb");
        file.mkdirs();

  1. 文件/目录删除
		//文件删除
		file.delete();

		//在删除目录时,1.创建完多层目录后默认停留在最后一层
					  2.要指定每一级目录然后逐级删除
  1. 得到文件夹下的所有目录名
        //得到文件夹下的所有目录名
        File file = new File("./dir/aaa/bbb");
        file.mkdirs();  // 创建完目录之后  file会自动指向到最低级的目录

        File file1 = new File("./dir");

		//返回值是一个字符串数组
        String[] results = file1.list();
        System.out.println(Arrays.toString(results));
  1. 得到文件夹下的所有文件
        //得到文件夹下的所有文件
        File file = new File("./dir/ccc.txt");
        File file1 = new File("./dir/ddd.txt");
        file.createNewFile();
        file1.createNewFile();

        File file2 = new File("./dir");

		//返回值是一个文件数组
        File[] results = file2.listFiles();
        for (File file3 : results){
            System.out.println(file3.getName());
        }

文件的内容操作

我们通过“流”来进行文件的读写操作。就像“水流“一样,需要使用时打开”流入“,使用中一直在”流“,使用完成后关闭。Java标准库就在”流“的概念上,提供了一组类用来完成读写文件的操作!

我们首先要明白的就是:输入和输出是对于CPU而言的。
将数据送到CPU中执行,就是输入;把运算好的结果从CPU拿走,就是输出。
在这里插入图片描述

面向字节流

面向字节流的读操作(InputStream)

在这里插入图片描述

        //读文件操作
        File file = new File("./aaa.txt");
        file.createNewFile();

        InputStream inputStream = new FileInputStream("./aaa.txt");

        while (true){
            int a = inputStream.read();
            //读到文件末尾时  返回-1
            if (a == -1){
                break;
            }
            System.out.println(a);
        }
        inputStream.close();

面向字节流的写操作(OutputStream)

在这里插入图片描述

        //写文件操作
        //使用OutputStream进行写文件操作的时候   只要文件打开了,文件原有内容就会清空
        //操作的是字节  可以直接传数字或者字符   不能传字符串----》 传字节数组
        OutputStream outputStream = new FileOutputStream("./aaa.txt");

        outputStream.write(97);
        outputStream.write(98);
        outputStream.write(99);

        outputStream.close();

面向字符流

面向字符流的读操作(Reader)

使用的方法和InputStream一样。

        //按字符进行读
        Reader reader = new FileReader("./aaa.txt");
        while (true){
            int ret = reader.read();
            if (ret == -1){
                break;
            }
            char ch = (char)ret;
            System.out.println(ch);
        }
        reader.close();

面向字符流的写操作(Writer)

使用的方法和OutputStream一样。

        //按字符进行写
        Writer writer = new FileWriter("./aaa.txt");
        writer.write("hello world");
        writer.close();

将字节流操作改造成字符流操作

让InputStream可以读字符流(Scanner)

        //使用InputStream读取字符流   借助Scanner
        InputStream inputStream = new FileInputStream("./aaa.txt");
        Scanner scanner = new Scanner(inputStream,"UTF-8");
        while (scanner.hasNext()){
            String s = scanner.next();
            System.out.println(s);
        }
        inputStream.close();

让OutputStream可以写字符流(PrintWrite)

        //使用OutputStream写入字符流   借助PrintWrite
        OutputStream outputStream = new FileOutputStream("./aaa.txt");
        PrintWriter printWriter = new PrintWriter(outputStream);
        printWriter.print("hello");
        printWriter.print("你好");
        printWriter.flush();
        outputStream.close();

注:

  1. 进行文件读写的时候一定要记得调用close()方法,释放资源。因为:
    每个进程都对应着PCB(可能有多个),PCB里有文件描述符表,这些PCB都共用一个文件描述符表。文件描述符表是一个顺序表,是有长度上限的。每次打开一个文件,就会在表里创建一项;关闭一个文件,就销毁对应的那一项。当不关闭文件时,文件描述符表的资源就会被占满,下次就无法打开新的文件,是个大问题。
  2. 如果close()方法前出现了异常,那么可能就无法释放资源。我们可以使用try让close()一定被执行到。
        //把需要释放资源的东西放到try()的括号里  在try执行完之后  会自动调用close
        try (InputStream inputStream = new FileInputStream("./aaa.txt");
             OutputStream outputStream = new FileOutputStream("./aaa.txt")){
            .......
        }

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

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

相关文章

【数智化人物展】途牛旅游网副总裁王树柏:人性化深耕,数智化赋能,合力共促企业可持续发展...

王树柏 本文由途牛旅游网副总裁王树柏投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 数据智能产业创新服务媒体 ——聚焦数智 改变商业 数字经济时代下,科技与信息的红利快速释放。“数智化”是这个时代所有企业都要面对的大趋势、大机遇。“数…

mybatis条件构造器(加强版CURD)

文章目录 1.Wrapper介绍2.QueryWrapper3.UpdateWrapper4.condition5.LambdaQueryWrapper6.LambdaUpdateWrapper 1.Wrapper介绍 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 …

ByteBuffer的原理和使用详解

ByteBuffer是字节缓冲区,主要用户读取和缓存字节数据,多用于网络编程,原生的类,存在不好用,Netty采用自己的ByteBuff,对其进行了改进 1.ByteBuffer的2种创建方式 1.ByteBuffer buf ByteBuffer.allocate(i…

如何利用GPT大语言模型来进行A股投资分析

在当今的金融市场中,投资已经成为了许多人增加财富的重要途径。然而,投资并非易事,需要对市场有深入的理解和精准的判断。在这个过程中,工具的选择和使用就显得尤为重要。今天,我们将介绍一种结合了GPT大语言模型的投资…

基于u-box GPS模块通过串口指令调整输出信息

基于u-box GPS模块通过串口指令调整输出信息 ✨当然借助u-center_v22.07上位机软件,可以很方便的修改和调整输出信息以及配置,本次主要是通过该软件提取对应的配置指令,用于给单片机来配置GPS模块提供方便,从而不依赖通过电脑上位…

任正非说:如此华为公司怎么会垮掉呢?我坚信华为红旗永不倒!

你好!这是华研荟【任正非说】系列的第25篇文章,让我们聆听任正非先生的真知灼见,学习华为的管理思想和管理理念。 一、我们要持续地表彰那些为IT S&P、IPD、ISC、海外ERP、IFS……做出贡献的人。昨天他们努力时,看起来是笨拙的…

快速搭建自己的应用,尽在 YonBuilder:让你的想法瞬间成真!

目录 一、前言 1、一款出色的低代码开发平台是什么样? 2、什么是YonBuilder? 二、使用YonBuilder创建一个可视化应用 1、流程介绍 2、测试思路 3、环境准备 4、应用创建 5、数据建模 6、页面建模 7、数据分析 8、页面发布 三、总结 1、站在…

算法与数据结构-分治算法

文章目录 什么是分治算法分治算法应用举例分析分治思想在海量数据处理中的应用 什么是分治算法 分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问…

Kubuntu安装教程

目录 1.介绍 2.安装 3.配置 更新软件 中文输入法 美化 1.介绍 Kubuntu,是众多Ubuntu分支的一种,它采用KDE Plasma桌面为其默认桌面环境。它和Ubuntu采用同样的底层系统和软件库。基本上,Kubuntu和Ubuntu没有太大的差异,只是…

警惕听力下降的七大因素,一定要当心

随着现代社会的高速发展,工作生活节奏的加快,各种压力增大,再加上熬夜,长期佩戴耳机、饮食油腻辛辣等不良生活习惯的影响,听力损伤人群越来越多,已经不仅仅影响老年人群,近年来,听力…

Avro 如何生成java Bean

作为一种很犀利的序列化的格式,avro在大数据量传输的时候很有优势。记录下。 1: .avsc 文件 {"namespace": "com.avro.bean","type": "record","name": "UserBehavior3","fields&qu…

第17期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

气象学基础知识:城市/大气/对流边界层

气象学基础知识:城市/大气/对流边界层 1 城市边界层(urban boundary layer, UBL)1.1 定义1.2 城市边界层结构的影响因素 2 大气边界层(Atmospheric boundary layers, ABL):2.1 定义2.2 大气动力层分层&…

前端基础之CSS

目录 一、CSS介绍 CSS语法 CSS注释 CSS的几种引入方式 二、CSS选择器 基本选择器 组合选择器 属性选择器 分组和嵌套选择器 伪类选择器 伪元素选择器 选择器的优先级 三、CSS属性相关 宽和高 字体属性 文字属性 背景属性 边框 border-radius display属性 …

【已解决】虚拟机之前能正常上网,重启之后无法连接网络问题的解决方法

虚拟机之前网络正常,重启之后却始终连接不上网络。 找了许多方法,终于发现一种便捷有效的方法。 解决方法如下: 1、将网络模式更改为NAT模式., 2、打开终端窗口,输入如下命令。 sudo service network-manager stopsudo rm /var/l…

R数据分析:反事实框架和因果中介的理论理解

其实很早之前给大家写中介分析的做法的时候我也有思考过当中介变量或者因变量不是连续变量的时候,中介怎么做?或者说这个时候中介的结果如何解释?当时反正是一直没有太想明白这些问题,毕竟这些情况在发表的文献中也较少见&#xf…

作为20年老程序员,我如何使用GPT4来帮我写代码

如果你还在用google寻找解决代码bug的方案,那你真的out了,试试gpt4, save my life. 不是小编危言耸听,最近用gpt4来写代码极大地提高了代码生产力和运行效率,今天特地跟大家分享一下。 https://www.promptspower.comhttps://www.…

.WP、.WL、.WT格式数据转Shp解决方案

下载 http://dt3.8tupian.net/2/29913a52b1000.pg3操作办法:mapgis创建数据库——导入.WP、.WL、.WT格式数据——导出shp数据 (1)安装mapgis10.6高级版(有一个月得试用期); (2)打开mapgis右侧MapGISLocal右键创建数据库&#xff…

Day15力扣打卡

打卡记录 使数组变美的最小增量运算数&#xff08;动态规划&#xff09; 链接 class Solution { public:long long minIncrementOperations(vector<int>& nums, int k) {long long f0 0, f1 0, f2 0;for (int x : nums) {long long inc f0 max(k - x, 0);f0 …

【计算机网络笔记】传输层——可靠数据传输原理之Rdt协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…