文件的概念 + 文件的相对/绝对路径 + 文件IO字符流 / 字节流的读写操作 (java)

news2024/11/17 15:56:51

文章目录

  • 前言
  • 一、文件是什么
    • 1.文件的概念
    • 2.文件路径
      • 1.绝对路径
      • 2.相对路径
  • 二、针对文件的IO
    • 1.File类
    • 2.对文件内容的读写操作
      • 1.针对文本文件—— 字符流
        • 输入流 Reader类
        • 输出流 Writer类
      • 2.针对二进制文件—— 字节流
        • 输入流 InputStream类
        • 输出流 OutputStream类
  • 总结


前言

本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下!

本文与大家分享的是文件与文件路径,以及字符流与字节流,内容较为简单,容易理解吸收,各位加油!✨✨


一、文件是什么

1.文件的概念

✨我们先来认识什么是文件。

针对硬盘这种持久化存储的I/O设备,当我们想要 将数据保存到硬盘时 ,往往不是保存成一个整体,而是 独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念 ,就类似书包里的一本本书一样真实存在。


在这里插入图片描述

上图中,C盘中的每个东西都是一个独立的文件。


文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息🪪。

在这里插入图片描述


2.文件路径

路径是指文件系统上一个文件/目录的具体位置

目录是计算机的专业术语,通俗的说法就是文件夹

🖥️计算机的目录是有层级结构的 文件系统是以树形结构,N叉数来组织文件和目录的


此电脑(根结点)中有一个或多个盘符
在这里插入图片描述


C盘里有这些文件夹
在这里插入图片描述


"music"中有三个文件夹。
在这里插入图片描述


"周杰伦"中有一首歌《晴天》
在这里插入图片描述


这大概是文件系统的一个树状图。
在这里插入图片描述


文件的路径,是通过一个字符串来表示, 每个目录之间使用 ‘/’ 或者 ‘\’ (只在Windows系统中适用, 代码中需要使用转义字符,因此需要写成’\\’ )来分割。

文件的路径非常重要,编程很多地方需要用到路径,尤其是相对路径

1.绝对路径


绝对路径:从根节点开始沿着树杈到达目标文件,中间经过的内容就是绝对路径

Windows系统都是从"此电脑"开始,表示路径时可以把"此电脑"省略直接从盘符开始

就比如这首歌《晴天》的绝对路径为:
“C:\music\周杰伦”

在这里插入图片描述

2.相对路径


相对路径:从给定的某个目录(称之为基准目录/工作目录)查找到目标文件,中间经过的内容就是绝对路径

'.‘与’..'在相对路径中是两个个特殊符号,
'.‘表示当前目录,’..'表示上一级目录

  • 相对路径的重中之重就是明确工作目录(基准目录) 😇😇😇

假设下图是我的工作目录,那么我要如何找到《晴天》呢??
在这里插入图片描述
此时的相对路径为:
“.\..\周杰伦”

在这里插入图片描述


二、针对文件的IO

1.File类

IDEA的默认工作目录为:项目所在文件夹

java标准库中为我们提供了 File这个类来对一个文件(包括目录)进行抽象的描述

  • 注意!!有 File 对象,并不代表该文件真实存在。

文件是存储在硬盘上的,直接通过代码操作不方便,因此就在内存中创建一个对应的对象,操作这个内存中的对象,就可以实现对硬盘中文件的操作。

可以理解为🤖遥控机器人,你使用代码遥控这个内存中的机器人,然后遥控机器人根据你的指令去操作文件。


File类的构造方法:

签名说明
File(File parent, Stringchild)根据父目录 + 孩子文件路径,创建一个新的 File 对象
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, Stringchild)根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

在这里插入图片描述


    public static void main(String[] args) throws IOException {
        // 使用绝对路径表示张杰这个文件夹中名为:"test.txt"的文件
        File file = new File("C:/music/张杰/test.txt");
        
        // 使用绝对路径表示张杰这个文件夹,这个File对象是一个文件夹/目录
        File file1 = new File("C:/music/张杰");
        
        //使用相对路径表示张杰这个文件夹中名为:"test.txt"的文件
        File file2 = new File(file1,"test.txt");
        File file3 = new File("C:/music/张杰","test.txt");

    }

这个文件存在与否都可,但是路径不能错。


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(Filedest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

演示一些方法。

    public static void main(String[] args) throws IOException {
        // 使用绝对路径在张杰这个文件夹中创建一个名为:"test.txt"的文件
        File file = new File("C:/music/张杰/test.txt");

        // 使用绝对路径表示张杰这个文件夹,这个File对象是一个文件夹/目录
        File file1 = new File("C:/music/张杰");

        //使用相对路径表示张杰这个文件夹中名为:"test.txt"的文件
        File file2 = new File(file1,"test.txt");
        File file3 = new File("C:/music/张杰","test.txt");

        System.out.println("File 对象的父目录文件路径: " + file.getParent());
        System.out.println("FIle 对象的纯文件名称: " + file.getName());
        System.out.println("File 对象的文件路径: " + file.getPath());
        System.out.println("File 对象的绝对路径: " + file.getAbsolutePath());
        System.out.println("File 对象的修饰过的绝对路径: " + file.getCanonicalPath());
        System.out.println("File 对象描述的文件是否真实存在: " + file.exists());
        System.out.println("File 对象代表的文件是否是一个目录: " + file.isDirectory());
        System.out.println("File 对象代表的文件是否是一个普通文件: " + file.isFile());
        System.out.println("根据File 对象,自动创建一个空文件。成功创建后返回 true: " + file.createNewFile());
        System.out.println("根据File 对象,删除该文件。成功删除后返回 true: " + file.delete());

        File file4 = new File("C:/music/张杰/情歌");
        System.out.println("在张杰文件夹中创建一个名为情歌的文件夹。成功创建后返回true: " + file4.mkdir());
        File file5 = new File("C:/music/张杰/流行歌/2023年");
        System.out.println("在张杰文件夹中创建一个创建多级目录。成功创建后返回true: " + file5.mkdirs());

    }

运行结果:
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


2.对文件内容的读写操作

可以将文件的内容比作水库。

而对文件内容的读写就是从这个水库的排水口排水水🫗,从这个水库的进水口加水💧。

数据就像水流一样被读出来或者被写进去。
因此文件的读写也被称为 “数据流”

水流有大小,可以每次接取50ml,也可以接取100ml。
那么数据流肯定也可以控制读写的大小,一会为大家讲解。


而这个流的方向也与正常方向不太相同。
大家都知道CPU是计算机大脑的核心,所有操作都靠CPU完成,因此讨论输入输出都是以CPU为基准。

数据存储在硬盘上,数据在CPU上完成运算
因此
将数据从硬盘读入CPU中这个操作,称之为,输入流(将数据输入CPU)
将数据从CPU中写回硬盘这个操作,称之为,输出流(将数据输出到硬盘)

针对不同类型的文件又有不同的读写方法。

针对文本文件—— 字符流
字符流的输入流为Reader类,输出流为Writer类

针对二进制文件—— 字节流
字节流的输入流为InputStream类,输出流为OutputStream类

以上这四个类都是抽象类,都是用来对IO设备的读取,IO设备包括文件,网卡等等。

因此我们要对文件进行读取,就要实例这个抽象类的子类中专属文件读取的类, 在实例化时,需要为构造方法提供参数(String 路径或者File 对象)

  • 实例化出来对象之后就相当于文件被打开, (产生了文件描述符), 使用完文件之后需要调用 close 方法关闭文件, 否则如果文件描述符表满了会产生文件资源泄露的严重bug

这四个抽象类都继承了Closeable接口,因此可以使用try语句,让他自动调用close方法。

try(InputStream inputStream = new FileInputStream("C:/music/test.txt")) {
            //执行完try里的语句会自动调用close方法
        }

1.针对文本文件—— 字符流


基本单位为:字符
字节流中输入流用到的是 Reader类
输出流用到的是 Writer类


输入流 Reader类

输入流 Reader类

在这里插入图片描述
上图是要读文件中的内容。


一个字符一个字符的读

    public static void main(String[] args) throws IOException {
        try(Reader reader = new FileReader("C:/music/test.txt")) {
            StringBuilder str = new StringBuilder();
            while (true) {
                // 无参数时,
                // 会从第一个字符开始读
                int a = reader.read();
                if(a == -1) {
                    break;
                }
                char c = (char)a;
                // 在字符串里拼接
                str.append(c);
            }
            System.out.println(str.toString());
        }
    }

运行结果:
在这里插入图片描述


输出流 Writer类

输出流 Writer类


一个字符一个字符的写

    public static void main(String[] args) {
        try(Writer writer = new PrintWriter("C:/music/test.txt")) {
            // 先清空内容
            // 参数为一个字符时,写入字符
            writer.append('盖');
            writer.append('亚');
            writer.append('来');
            writer.append('啦');

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

在这里插入图片描述


2.针对二进制文件—— 字节流

基本单位为:字节
字节流中输入流用到的是 InputStream类
输出流用到的是 OutputStream类


输入流 InputStream类

输入流 InputStream类

在这里插入图片描述
上图是要读文件中的内容。


一个字节一个字节的读

    public static void main(String[] args) throws IOException {

        try(InputStream inputStream = new FileInputStream("C:/music/test.txt")) {
            while (true) {
                int a = inputStream.read();
                // 无参数时,
                // read方法会从第一个字节开始读,
        		// 并且返回每个字节的ASCII值,都读完了返回-1。
                if(a == -1) {
                    break;
                }
                System.out.println(a);
            }
            

        }
    }
    

utf-8字符集中一个汉字占三个字节,不同的字符集汉字所占字节不同

运行结果:
在这里插入图片描述


全部读完

    public static void main(String[] args) throws IOException {

        try(InputStream inputStream = new FileInputStream("C:/music/test.txt")) {
            while (true) {
                int a = inputStream.read();
                if(a == -1) {
                    break;
                }
                System.out.println(a);
            }
            // available方法,返回文件内容一共有多少字节,返回类型是int
            byte[] bytes = new byte[inputStream.available()];
            // 参数为字节数组时,
            // 将文件所有内容读入字节数组
            int len = inputStream.read(bytes);
            // 第一个参数表示被读的字节数组
            // 第二个参数表示从几下标开始转换
            // 表示要转换多少个字节
            String str = new String(bytes,0,len);
            System.out.println(str);

        }
    }

运行结果:
在这里插入图片描述


输出流 OutputStream类

输出流 OutputStream类

一个字节一个字节的写

    public static void main(String[] args) throws IOException {
        try(OutputStream outputStream = new FileOutputStream("C:/music/test.txt")) {
            
            // 参数为int类型时,该参数表示ASCII值,
            // 会先把文件中的内容清空,
            // 再根据ASCII值往里一个字节一个字节的写入
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);
        }
    }

在这里插入图片描述


全部写完

    public static void main(String[] args) throws IOException {
        try(OutputStream outputStream = new FileOutputStream("C:/music/test.txt")) {
            String str = "炎龙侠好帅啊";
            // 将字符串转换为字节数组
            byte[] bytes = str.getBytes();
            // 参数为字节数组时,
            // 先清空文件内容,再将字节数组全部写入文件中
            outputStream.write(bytes);
        }
    }

在这里插入图片描述

总结

以上就是今天要分享的内容了,本文介绍了两种针对文件的流,字节流与字符流,今天分享的内容比较简单啦啦啦🎉🎉🎉🎉。

路漫漫不止修身,也养性。

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

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

相关文章

《Reinforcement Learning: An Introduction》第7章笔记

Chapter 7 n-step Bootstrapping 本章的n-step TD方法是前两章的Monte Carlo 方法和one-step TD方法的推广。它使自举法在多个时间步内进行,解决了前两章中的更新时间步不灵活的问题。 7.1 n-step TD Prediction 在用策略 π \pi π下生成的采样回合序列来估计 v…

UE5 MetaHuman SDK插件的使用【一、编辑器创建音波与蓝图创建获取音波,音波与嘴唇的同步】

目录 打开插件 创建音频 编辑器这直接创建音频: 蓝图中创建和获取音频: 唇语: 声音与嘴唇同步: 方法一【效果不是很好】: 方法二【效果很好,但有一段时间延迟在处理】: 逻辑&#xff1…

Spring Boot 中的微服务架构:原理和使用

Spring Boot 中的微服务架构:原理和使用 什么是微服务架构? 微服务架构是一种软件架构模式,它将一个应用程序分解成一组小的、松散耦合的服务。每个服务都有独立的进程和数据存储,可以独立地开发、部署、测试和扩展。这种架构模…

最新AI创作系统ChatGPT网站源码+新增GPT联网功能+支持GPT4+支持ai绘画+实时语音识别输入

最新AI创作系统ChatGPT网站源码新增GPT联网功能支持GPT4支持ai绘画实时语音识别输入 一、AI创作系统二、系统介绍三、系统程序下载四、安装教程五、其他主要功能展示六、更新日志 一、AI创作系统 提问:程序已经支持GPT3.5、GPT4.0接口、支持新建会话,上…

常见面试题之ThreadLocal的理解

1. ThreadLocal概述 ThreadLocal是多线程中对于解决线程安全的一个操作类,它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal同时实现了线程内的资源共享 案例:使用JDBC操作数据库时,会将每一个线程的…

常微分方程的解题思路

通解:独立常数的个数等于微分方程的阶数,独立常数的个数实际上就是 c 1 , c 2 , . . . , c n c_1,c_2,...,c_n c1​,c2​,...,cn​是数目 所以补 C C C也是关键的一步,而且未必是 C C C,也可以是 ln ⁡ C \ln C lnC之类的&…

HPM6750系列--第六篇 创建自己的工程

一、目的 细心的朋友可能会发现官方提供了HPM-Sdk仓库,示例代码都是作为一个文件夹的形式放在此仓库下,我们之前都是直接拷贝里面的工程进行演示。 下面我们就具体来分析一下hello_world工程的文件组成,这样我们就可以创建自己的工程。 二、…

vscode里vue文件内<template>标签报错

发现只要把文件名使用驼峰命名法,把Login.vue改为LoginView.vue就不报错了加个大写的View就没有了。 官方参考文档:vue/multi-word-component-names | eslint-plugin-vue

说说@EnableConfigurationProperties那点事

两者的对比 ConfigurationProperties 使用ConfigurationProperties的时候,把配置类的属性与yml配置文件绑定起来的时候,还需要加上Component注解才能绑定并注入IOC容器中,若不加上Component,则会无效。 EnableConfigurationPro…

Mybatis 入门及实践

Mybatis 入门及实践 文章目录 Mybatis 入门及实践前言一. 简介二. 入手案例2.1 前置准备2.1.1 Maven依赖2.1.2 sql准备2.1.3 Log4j2 配置1. Maven引入2. log4j2.xml 2.2 代码流程构建步骤2.2.1 Mybatis前置知识2.2.2 步骤流程2.2.3 代码实现 三. XML映射器前置代码3.1 select3.…

【网络编程】网络编程套接字(一)

文章目录 网络编程预备知识认识端口号理解源端口号和目的端口号认识TCP协议和UDP协议网络字节序sockaddr结构1.socket 常见API2.sockaddr结构 网络编程预备知识 认识端口号 端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系…

Linux :LNMP(源码包安装)

Linux 虚拟机 VMware:安装centos7_鲍海超-GNUBHCkalitarro的博客-CSDN博客 物理机 linux:真机安装centos linux(突发事件:解决卡在安装界面){寻找镜像--u启制作--引导u盘--解决卡在安装界面--安装配置}_安装centos7卡…

Linux--文件/目录权限

看懂权限: 拥有者:文件属于谁 所属组:文件属于哪个组 other:不属于上面两种的任何一个,就是other 图示: 分析: ①第一列: d:目录 -:普通文件 p:管道文件 b:块设备 c:字符设备 l:链接…

数学建模概论

1、从现实对象到数学模型 我们常见的模型 玩具、照片......~实物模型水箱中的舰艇、风洞中的飞机......~物理模型地图、电路图、分子结构图......~符号模型 模型是为了一定目的,对客观事物的一部分进行简缩、抽象、提炼出来的原型的替代物,集中反映了原型…

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket

文章目录 1.函数重载:writetofile(),Ctrue和false,C0和非02.类和对象:vprintf2.1 构造函数:对成员变量初始化2.2 析构函数:一个类只有一个,不允许被重载 3.引用:C中&取地址&…

沁恒CH32V307VCT6最小系统板/开发板开源

沁恒CH32V307VCT6最小系统板,引出了所有IO口,一个Type-C连接到USB2.0全速OTG接口,一个Flash芯片 型号W25Q64 容量64Mbit 连接到SPI2接口,板上还有TL432电压基准1.25V(实测1.246V左右)可通过跳线连接到PC3的AD13,还有3.…

【c++】并行编程:cuda入门

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍cuda入门。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&#x1f95e…

测试在 4090 上运行 vicuna-33b 进行推理

测试在 4090 上运行 vicuna-33b 进行推理 今天尝试在 4090 上运行 vicuna-33b 进行推理,使用的是 8bit 量化。 运行命令如下, python3 -m fastchat.serve.cli --model-path lmsys/vicuna-33b-v1.3 --load-8bit结论,使用 8bit 量化在 4090 上…

HTTP概述以及Tomcat概述

HTTP 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。特点: 基于TCP协议:面向连接、安全基于请求-响应模型的:一次请求对应一次响应HTTP协议是无状态的协议…

Java面试题3

[TOC]目录 1. spring事务 事务简介 事务在逻辑上是一组操作,要么执行,要不都不执行。主要是针对数据库而言的,比如说 MySQL。 为了保证事务是正确可靠的,在数据库进行写入或者更新操作时,就必须得表现出 ACID 的 4 …