JavaEE初阶第二课:文件操作与IO

news2024/9/22 7:31:55

欢迎来到javaee初阶的第二课,这节课我会带大家了解文件的概念和java中如何操作文件。

这里写目录标题

  • 1.了解文件
    • 1.1文件概念
    • 1.2文件存储
    • 1.3文件路径
  • 2.Java中的文件操作(文件系统操作)
    • 2.1File类
      • 2.1.1方法实践
  • 3.Java的文件操作(文件读写操作)
    • 3.1字节流
      • 3.1.1方法实践
      • 3.1.2 close()方法- -重要
    • 3.2字符流
  • 结尾

1.了解文件

1.1文件概念

狭义上来讲,我们在硬盘存储数据时,肯定不存所有数据为一个整体,因为数据是有分类的。我们往往会把这些数据分成不同的单位来保存,这个单位就是文件。
广义上的话…
在linux上,一直有一句话,叫:“一切皆文件”。什么意思呢?linux操作系统为了更好的管理软硬件资源,linux将我们的硬件设备也抽象成了文件,例如我们的键盘:我们敲键盘叫输入数据,计算机从键盘获取我们敲的信息叫做读取数据。

1.2文件存储

随着计算机的发展,我们要存储的文件也就越多,那么文件的存储就成了问题,为了更好的管理文件,文件夹作为一种特殊文件诞生了,通过文件夹将我们的文件以树状结构的形式组织起来,这是一种按照层级结构进行组织
的方法。

这里是引用

1.3文件路径

解决了文件存的问题,还要解决文件取的问题。在这样一种存储方式下,我们要怎么找到我们想要的文件呢?这就需要一条能找到文件的路,这就是文件路径。
那么文件路径分为两种,一种叫绝对路径,另一种叫相对路径。

绝对路径:
绝对路径主要是从根目录出发(windows系统上是从此电脑出发)通过一层一层的向内寻找文件,例如:
C:\Program Files\Git
C:是盘符

相对路径:
要说相对路径,必须要明确一下 基准路径/工作路径 。
什么是基准路径呢?举个例子:
在这里插入图片描述
在这张图下,小刚和小王都是从不同的基准出发找超市的。小刚是相对路口A的角度,而小王是相对路口B。他们给的答案不同,但是目的地都是一样的。相对路径的这个相对就是相对基准路径。所以找相对路径,这个基准就十分重要。

2.Java中的文件操作(文件系统操作)

该节主要介绍文件系统的操作,比如文件的删除等等,不涉及文件的读写。

2.1File类

File类作为我们java文件操作的核心类,其下有很多方法方法:

构造方法
在这里插入图片描述
其他常用方法:
值类型 方法签名 说明
String getParent()
返回 File 对象的父目录文件路径
String getName()
返回 FIle 对象的纯文件名称
String getPath()
返回 File 对象的文件路径,根据构造方法的参数是相对还是绝对决定
String getAbsolutePath()
返回 File 对象的绝对路径
String getCanonicalPath()
返回 File 对象的修饰过的绝对路径
boolean exists()
判断 File 对象描述的文件是否真实存在
boolean isDirectory()
判断 File 对象代表的文件是否是一个目录
boolean isFile()
判断 File 对象代表的文件是否是一个普通文件
boolean createNewFile()
根据 File 对象,自动创建一个空文件。成功创建后返回 true
boolean delete()
根据 File 对象,删除该文件。成功删除后返回 true
void deleteOnExit()
根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行
String[] list()
返回 File 对象代表的目录下的所有文件名
File[] listFiles()
返回 File 对象代表的目录下的所有文件,以 File 对象
表示

boolean mkdir()
创建 File 对象代表的目录
boolean mkdirs()
创建 File 对象代表的目录,如果必要,会创建中间目录
boolean renameTo(File dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操作
boolean canRead()
判断用户是否对文件有可读权限
boolean canWrite()
判断用户是否对文件有可写权限

2.1.1方法实践

1.获取File对象路径:

public void getPath() throws IOException {
        //创建File实例,传入文件路径。注意该文件不一定真的存在
        File file=new File("D:/IO/test.txt");
        System.out.println("文件名称:"+file.getName());
        System.out.println("父路径:"+file.getParent());
        System.out.println("绝对路径:"+file.getAbsolutePath());
        System.out.println("文件路径:"+file.getPath());
        System.out.println("修饰过的绝对路径:"+file.getCanonicalPath());
    }

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

2.判断文件与创建删除:

public void judgeFile() throws IOException {
        File file=new File("./test.txt");
        System.out.println("判断文件是否存在"+file.exists());
        System.out.println("判断file是不是文件"+file.isFile());
        System.out.println("判断file是不是目录"+file.isDirectory());

        System.out.println("创建文件:");
        file.createNewFile();
        System.out.println("创建成功,再次判断:");
        System.out.println("判断文件是否存在"+file.exists());
        System.out.println("判断file是不是文件"+file.isFile());
        System.out.println("判断file是不是目录"+file.isDirectory());

        System.out.println("删除文件:");
        file.delete();
        System.out.println("删除成功,再次判断:");
        System.out.println("判断文件是否存在"+file.exists());
        System.out.println("判断file是不是文件"+file.isFile());
        System.out.println("判断file是不是目录"+file.isDirectory());
    }

在这里插入图片描述

剩下的方法大家可以自己尝试

3.Java的文件操作(文件读写操作)

介绍之前,我们先得了解一下流stream。

这里是引用
流,顾名思义,就是水流。
如果把水换成数据,那么进水就叫输入流,出水就叫输出流。
也就是数据流,java标准库在“流”(字符流和字节流–基本单位不同)这概念的基础上提供了一组类,帮助我们读写文件。

3.1字节流

重要:这里的输入输出是相对于内存来说,从文件到内存叫输入,反之为输出。

在这里插入图片描述
这里的父类是抽象类,具体实现还得看子类,这里只介绍这一种子类。

常用方法:

InputStream:
int read()
读取一个字节的数据,返回 -1 代表已经完全读完了
int read(byte[] b)
最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了
int read(byte[] b,int off, int len)
最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
void close()
关闭字节流
—————————————
FileInputStream的构造方法:
FileInputStream(File file)
利用 File 构造文件输入流
FileInputStream(String name)
利用文件路径构造文件输入流
————————————————————————————
OutputStream:
void write(int b)
写入要给字节的数据
void write(byte[] b)
将 b 这个字符数组中的数据全部写入 os(缩写) 中
int write(byte[] b, int off,int len)
将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
void close()
关闭字节流
void flush()
重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中
——————————————
FileOutputStream的构造方法:
同FileInputStream

3.1.1方法实践

先在与src同级目录下中创建一个.txt文件,接下来读写以该文件为例。

这里是引用

read方法测试

public static void readDemo() throws IOException {
        InputStream ips=new FileInputStream("./test.txt");
        //read()测试 一次读取一个字节
//        int res=0;
//        while((res= ips.read())!=-1){
//            System.out.print(res+" ");
//        }

        //read(byte[] bytes)测试 输出型参数 一次读取一个字节数组的大小
        byte[] bytes=new byte[1024];
        int len=0;
        while((len=ips.read(bytes))!=-1){
            for (int i = 0; i < len; i++) {
                System.out.printf("%c", bytes[i]);
            }
        }
        ips.close();
    }

可以发现这样读取是很麻烦的,我们还有更简单的方法,通过Scanner获取:

		InputStream ips=new FileInputStream("./test.txt");
        Scanner scanner=new Scanner(ips);
        while(scanner.hasNext()){
            System.out.println(scanner.next());
        }
        ips.close();

write方法测试:

	public static void writeDemo() throws IOException {
        OutputStream ops=new FileOutputStream("./test.txt");
        String ss="Java Python C++";
        for(int i=0;i<ss.length();i++){
            ops.write(ss.charAt(i));
        }
        ops.close();
    }

这里是引用

重要:如果你发现write没有及时将你的内容写入文件,很可能是你没有进行flush操作!
flush或者程序运行结束都会将缓冲区内容全部写入

可以发现这样输出也不太方便,这样就可以采用PrintWriter完成输出操作:

		OutputStream ops = new FileOutputStream("./test.txt");
        PrintWriter printWriter=new PrintWriter(ops);
        printWriter.print("金牌讲师");
        printWriter.println(1);
        printWriter.close();
        ops.close();

3.1.2 close()方法- -重要

观察上述代码,我们发现如果程序中间出现问题,很大可能导致无法执行close方法。一般我们自己练习关不关闭也没什么问题,但是如果再服务器上出现这种问题,就会存在风险。因为每次打开文件都会消耗资源(文件描述符表),只开不关就会导致文件资源泄漏问题。
所以我们需要一种稳定的close方式,这里就可以使用我们学过的try-finally处理

public static void writeDemo() throws IOException {
        OutputStream ops= null;
        try {
            ops = new FileOutputStream("./test.txt");
            String ss="Java Python C++";
            for(int i=0;i<ss.length();i++){
                ops.write(ss.charAt(i));
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            ops.close();
        }
    }

这样似乎不太美观,那么也可以将需要关闭的资源防止try()中,多个资源用;分隔:
它会自动帮我们关闭资源的。

public static void writeDemo() throws IOException {
        try(OutputStream ops = new FileOutputStream("./test.txt")) {
            String ss="Java Python C++";
            for(int i=0;i<ss.length();i++){
                ops.write(ss.charAt(i));
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

3.2字符流

字符流和字节流的用法大同小异,方法什么都是差不多的
简单演示:

static void readerDemo() throws IOException {
        Reader reader=new FileReader("./test.txt");
        char[] chars=new char[1024];
        int len = 0;
        while((len = reader.read(chars))!=-1){
            for(int i=0;i<len;i++){
                System.out.print(chars[i]);
            }
        }
        reader.close();
    }

结尾

那么第二课就结束啦,下一节课将进入网络原理的学习,还请大家多多关注点赞,或者订阅我的专栏!

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

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

相关文章

字节青训前端笔记 | Webpack入门

本节课将重点围绕「 Webpack 」这一核心话题展开。简述前端工程化的常用工具webpack 的原理和使用 webpack的作用 webpack的作用是把很多文件打包整合到一起, 缩小项目体积, 提高加载速度&#xff0c;常用的场景是&#xff1a; 代码压缩 将JS、CSS代码混淆压缩&#xff0c;…

25. 迭代器和生成器的详解

1. 迭代器 (1) 迭代是Python最强大的功能之一&#xff0c;是访问集合元素的一种方式。 (2) 迭代器是一个可以记住遍历的位置的对象。 (3) 迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。迭代器只能往前不会后退。 (4) 迭代器有两个基本的方法…

Tkinter的Canvas控件

Canvas控件是Tkinter界面设计的一个画图工具&#xff0c;也可以用它导入外部图案到界面中 创建画布 import tkinter as tk roottk.Tk() #创建界面 root.title(Canvas) #界面命名 root.geometry(500x300) #设置界面大小 canvastk.Canvas(root) …

03_class创建device创建_kobject_uevent发送

总结 根据之前的kobject知道 /sys/目录下的每个文件夹都是一个 kobject的对象 使用class_create() 创建 /sys/class/xxx目录 同时返回class对象 使用device_create() 创建/sys/class/xxx/yyy目录 和创建/dev/yyy的文件节点 同时返回device对象 class和device 都间接继承于kobj…

【老卫搞机】135期:华为开发者联盟社区2022年牛人之星奖品开箱!

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;今天咱们来开箱一件特殊的奖品&#xff0c;来自华为开发者联盟社区的新年祝福——2022年牛人之星。 华为有钱&#xff01;惯例用的是顺丰快递&#xff0c;各位看一下这里面是有很多件的 有这两件。第一…

三、TCP/IP---ARP和ICMP协议

ARP协议 简介&#xff1a;号称TCP/IP中最不安全的协议&#xff0c;安全工具&#xff0c;黑客工具大多数基于ARP协议。它是地址解析协议&#xff0c;用于实现从IP到MAC地址的映射&#xff0c;即询问目标Ip对应的MAC地址是多少&#xff0c;局域网通信不仅需要源目地址封装&#…

学习率衰减、局部最优、Batch归一化、Softmax回归

目录1.学习率衰减(Learning rate decay)在训练初期&#xff0c;梯度下降的步伐大一点&#xff0c;开始收敛的时候&#xff0c;小一些的学习率能让步伐小一些。1 epoch 遍历一遍训练集学习率衰减公式&#xff1a;例&#xff1a;假设衰减率decayrate 1&#xff0c;0.2epochNumα…

蓝桥杯-刷题-补基础

十道入门题 题目来源,题目,简单解析,代码,输入输出 目录 前言 一,汉诺塔 二,判断闰年 三,大写变小写 四&#xff0c;破译密码 五&#xff0c;反向数相加 六&#xff0c;Excel表中的列号 七&#xff0c;饮料兑换 八&#xff0c;角谷猜想 九&#xff0c;数字统计…

小喵2022年的年度总结,啊滴妈呀,开了眼了。

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重…

Qt扫盲- QUdpSocket 类理论总结

QUdpSocket 类理论总结一、概述二、使用流程三、QNetworkDatagram 简述一、概述 UDP (User Datagram Protocol)是一种轻量级的、不可靠的、面向数据报的、无连接的协议。当可靠性不重要时&#xff0c;可以使用它。QUdpSocket是QAbstractSocket的子类&#xff0c;允许发送和接收…

SpringBoot+Vue--token,vue导航守卫,axios拦截器-笔记3

自己学习记录,写的不详细,没有误导,不想误导 大概的登录逻辑,前后端完整实现: 1.用户名,密码验证成功后,后端签发token返回给前端 2.前端把token保存到本地存储 3.每次请求前,通过axios请求拦截器,统一发送token 4.通过Vue导航守卫,和axios响应拦截器,统一保护页面 新建个…

【华为上机真题 2023】事件推送

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

机制设计原理与应用(四)预算可行的拍卖机制

文章目录4 预算可行的拍卖机制4.1 特征4.2 使用案例4.3 拍卖设计问题4.4 单调次模函数&#xff08;Monotone Submodular Function&#xff09;4.4.1 分配算法4.4.2 关键支付计划4.4.3 特性4.5 在线预算可行的拍卖机制4.5.1 Secretary Problem(A Optimal Stopping Problem)4.5.2…

如何与他人交流-第5期

上期我们讲了打破预期,顺应主体这期我们来讲讲如何建立亲和关系(关系侧)我的别人交流,只有在不把别人当成对象(工具人),而是把对方当成主体的情况下(让别人感受到尊重),这是相互尊重的终极本质,也是唯一方法.把别人当人看.认同对方,对方也会认同你.自信从何而来自信本意为相信自…

信息论复习—连续信源、信道及容量

目录 连续信源的熵&#xff1a; 连续信源离散化后的概率空间&#xff1a; 连续信源离散化后的熵&#xff1a; 连续信源的绝对熵&#xff1a; 连续信源的相对熵&#xff1a; 连续信源的条件熵&#xff1a; 连续信源的相对条件熵&#xff1a; 连续信源相对熵的最大化&#…

李宏毅ML-卷积神经网络CNN

李宏毅ML-卷积神经网络CNN 文章目录李宏毅ML-卷积神经网络CNNImage ClassificationConvolutional Layer1. Neural Version StoryReceptive FieldParameter Sharing2. Filter Version StoryFilterParameter Sharing3. Summary of Two VersionsPooling LayerThe Whole CNNDrawbac…

Hyperbolic geometry (双曲几何简介)

ContentsManifolds: A Gentle IntroductionManifoldsTangent SpacesMetric TensorRiemannian Manifolds (黎曼流形)Hyperbolic Geometry and Poincar EmbeddingsCurvature (曲率)Euclidean and Non-Euclidean GeometriesHyperbolic SpaceMinkowski SpaceHyperboloid (双曲面)Th…

树和森林(快来瞧)

森林的定义 森林是由多颗互不相交的树所构成的树的集合&#xff0c;即森林包含多棵树&#xff0c;每一棵树都有自己的根结点。一棵树也可以看成森林。 树的表示及基本操作 1.树&#xff08;一般树&#xff09;的表示方法 1.1树的双亲表示法 树的双亲表示法是将树的各个节点…

现场工程师出手-PCAPHub与云SSH隧道稳妥实现异地LAN工业联测

在去年&#xff0c;因为众所周知的因素影响&#xff0c;项目的甲方主动提出延缓设备的交付。作为乙方&#xff0c;尽管项目延缓是甲方提出的&#xff0c;但依旧希望按期交付&#xff0c;这样才能回款&#xff0c;熬过一年。其实&#xff0c;2022年初&#xff0c;几类传感器、压…

S7-1200PLC与ABB机器人进行PROFINET通信的具体方法和步骤详解

S7-1200PLC与ABB机器人进行PROFINET通信的具体方法和步骤详解 1. TIA博途一侧的配置: 当我们安装好RobotStudio软件后,可以在以下的目录中C:\ProgramData\ABB Industrial IT\Robotics IT\DistributionPackages\ABB.RobotWare-6.08.0134\RobotPackages\RobotWare_RPK_6.08.013…