File,IO流,递归详解

File类

介绍

java.io.File类是Java语言提供了用来描述文件和目录(文件夹)的

构造

方法

Snipaste_2024-04-05_09-21-24.png
注意

  • 构造方法中通常用的是第一个方法
  • 文件和目录可以通过File封装成对象
  • File封装的对象仅仅是一个路径名,它是可以存在的,也可以不存在

绝对路径和相对路径

Snipaste_2024-04-05_09-29-10.png
绝对路径带盘符,相对路径对于当前工程中写模块名+文件即可

常用方法

创建

Snipaste_2024-04-05_09-31-19.png

删除

Snipaste_2024-04-05_09-35-29.png
注意

  • delete方法直接删除不走回收站(平时电脑上的shift+delete一样)
  • 如果删除的是一个文件,可以直接删除
  • 如果删除的是一个文件夹,需要先删除文件夹中的内容,最后才能删除文件夹

判断和获取

Snipaste_2024-04-05_09-40-59.png
注意
如果创建File对象时输入的是相对录井,同getAbsolutePath()方法还是获取绝对路径

高级获取

Snipaste_2024-04-05_09-56-07.png
注意

  • 当调用者不存在时,返回null
  • 当调用者是一个文件时,返回null
  • 当调用者是一个空文件夹时,返回一个长度为0的数组
  • 当调用者是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
  • 当调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏内容

IO流

概述

I流:将在磁盘文件中的存储的数据读取到内存中(读数据)
O流:将在内存中的数据写入到磁盘文件(写数据)

解决问题

以前存储数据的做法:通过变量,数组,集合存储数据,都不能永久化存储,因为数据是存储在内存中,只要代码运行结束,所有数据就会丢失

  1. 将程序中存储的数据写入到文件中,实现永久化存储
  2. 将文件中的数据读取到内存中(Java程序)

内存在读,内存在写

分类

InputStream:输入流

  • 字节输入流
  • 字符输入流

OutputStream:输出流

  • 字节输出流
  • 字符输出流

字节流:万能流(所有类型的文件都可以读写)
字符流:通常用于针对文本文件进行读写操作

  • 纯文本文件:使用计算机的记事本软件打开能看得懂的文件

书写IO流的套路

  1. 创建
    1. 实例化不同的IO流
  2. 进行操作(读,写)
    1. 读:read()
    2. 写:write()
  3. 关闭
    1. close()

字节输出流

遵循上面的套路

  1. 创建

OutputStream是一个抽象类,得用它的子类来实例化(FileOutputStream)
创建字节输出流的对象的时候,如果文件不存在,就创建;如果文件存在,将该文件中的内容清空

  1. 写数据

Snipaste_2024-04-05_14-42-50.png
要想换行:加换行符

os.write("\r\n".getBytes());

不同的操作系统,换行符各不相同
Snipaste_2024-04-05_14-49-14.png
3.关流
os.close();
注意
要不想在写入时让文件中数据清空,可以在创建时,在文件名后面加true
Snipaste_2024-04-05_14-52-14.png

字节输入流

  1. 创建

InputStream也是抽象类,用其子类进行实例化(FileInputStream)
这里和输出流不同的是,如果文件不存在,就会报错

  1. 读取

读取出来的是文件中数据的码表值;当读取到的值为-1时,说明当前读取到文件末尾
int read();
提高读取效率,可以用int read(byte[] buf);
从输入流读取最多buf.length个字节的数据,返回的是真实读到的数据个数
byte buf = new byte[1024];
int len = is.read(buf);

  1. 关流(释放资源)

is.close();

练习(文件复制)

  1. 创建字节输入流(与源文件关联)
  2. 创建字节输出流(与目标文件关联)
  3. 使用字节输入流,读取源文件中的字节数据
  4. 把读取到的字节数据写入到目标文件
  5. 循环3,4,直到读取到的值为-1时结束循环
  6. 释放资源
 public static void main(String[] args) throws IOException {
        //1.字节输入流
        InputStream is = new FileInputStream("源文件");

        //2.字节输出流
        OutputStream os = new FileOutputStream("目标文件", true);

        //3.读,写
        int data = 0;
        while (data != -1){
            data = is.read();
            os.write(data);
        }

        //释放资源
        is.close();
        os.close();

    }
}

IO资源的处理

在创建和操作的过程中我们都会有编译时异常,在平常练习中进行抛出,而在实际开发中要进行try…catch处理,但是我们释放资源这一步必须要执行,所有,
JDK7之前,增加了个try…catch…finally块,在finally代码块的代码一定会执行,所以可以将释放资源的代码放到finally代码块中
而在JDK7时,对流的释放做了优化,使用try-with-resource语句,确保每个资源在语句结束时自动关闭(不需要写os.close()😉
但是这个有个前提是资源对象有实现AutoCloseable接口

    try ( FileInputStream fis1 = new FileInputStream("day11_demo\\a.txt") ; 
	FileInputStream fis2 = new FileInputStream("day11_demo\\b.txt") ) 
    {
        // 读写数据
    } catch (IOException e) {
        处理异常的代码...
    }

字节流缓冲流(高效流)

Snipaste_2024-04-05_17-15-00.png
剩下的读写和关流与上面的基础流(字节流、字符流)用法一样

//构造方法: public  BufferedInputStream( InputStream  is )

BufferedInputStream bis = new BufferedInputStream( new FileInputStream("关联文件") );
//构造方法: public  BufferedOutputStream( OutputStream  os )

//覆盖写入
BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("关联文件") );


//追加写入 (构造方法的第二个参数为true)
FileOutputStream fos = new FileOutputStream("关联文件" , true); //追加写入
BufferedOutputStream bos = new BufferedOutputStream(  fos );//当前流有具有追加写入能力

Properties类

介绍
  1. 作为Map集合的子类存在(存储的数据:key,value)
  2. 可以结合IO流使用(读,写)

不需要加泛型,默认存储的是Object类型

构造方法

Properties prop = new Properties();

常用方法

Snipaste_2024-04-05_17-24-09.png
Snipaste_2024-04-05_17-24-39.png

作用

读取开发中使用到的.properties配置文件

ResourceBundle工具类

Snipaste_2024-04-05_17-26-01.png

递归

介绍

递归就是方法自己调用自己的结果,是应用是方法上的解决方案
递归=递进+回归

组成

递归前进段,边界条件,递归返回段
当边界条件不满足是,递归前进
当边界条件满足时,递归返回

执行过程

Snipaste_2024-04-05_19-57-08.png

隐患

每次递归方法都会入栈,从而占用栈内存资源,当递归次数太多,栈内存用完时会造成内存溢出错误

案例

查看某个文件中的所有Java文件

    public static void main(String[] args) {
        File file = new File("要查看的文件");

        getJavaFile(file);
    }
    public static void getJavaFile(File file){
        if (file == null){
            throw new RuntimeException("文件不能为空");
        }

        File[] files = file.listFiles();

        for (File f : files) {
            if (f.isFile()){
                if(f.getName().endsWith(".java")){
                    System.out.println(f.getAbsolutePath());
                }
            } else if (f.isDirectory()) {
                getJavaFile(f);
            }

        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux 安装JDK

一、安装jdk mkdir -p /export/servers # 软件安装的目录 0 . 使用rpm -qa | grep java 查看是否已经安装了jdk 使用: rpm -e --nodeps 软件的名称 将jdk进行卸载 执行完成后, 查看是否全部删除: 需要解压jdk的压缩包 tar -zxvf jdk-8u144-linux-x64.tar.gz -C /export/s…

Tcl学习笔记(二)——表达式、字符串

目录 1. 表达式 算数操作符 关系操作符 逻辑操作符 按位操作符 选择操作符 数学函数 字符串操作 2. 字符串 字符串长度、大小写转换、裁剪、重复 字符串类型 字符的获取 字符串的添加、删除、替换 字符串的比较 字符串的简单搜索 字符串的匹配 格式化…

计算机网络 实验指导 实验9

实验9 三层交换机综合实验 1.实验拓扑图 名称相连的接口IP地址网关PC1F0/3172.1.1.2/28172.1.1.1/28PC2F0/4172.1.1.18/28172.1.1.17/28PC3F0/5172.1.1.34/28172.1.1.33/28PC4F0/3172.1.1.3/28172.1.1.1/28PC5F0/4172.1.1.19/28172.1.1.17/28PC6F0/5172.1.1.35/28172.1.1.33/2…

学习天机04(优惠劵)

1.使用Redis和Mq优化领取优惠卷的高并发操作 实现思路: 因为领取优惠券的操作,涉及到操作db的操作很多,比如说查询优惠卷,统计已经领取的数量,更新已经发放的数量和新增用户券。所以了防止在高并发的情况下对我们的数…

如何查询大数据信用报告?查询时需要注意的事项有哪些?

在数字化时代,大数据信用评分对于需要资金周转的个人或企业来说至关重要。许多机构在贷款审批过程中使用大数据信用评分作为风险控制的重要手段。因此,了解自己的大数据信用状况成为了常规操作。本文将详细介绍如何查询大数据信用报告以及查询时需要注意…

物联网实战--入门篇之(十一)安卓QT--前端开发

目录 一、设计思路 二、QML文件结构 三、顶部框 四、中心圆圈 五、泡泡 六、开关栏 七、调速栏 八、安卓编译 一、设计思路 还是再贴一下米家APP的截图,再根据我们之前第九篇的分析,大概可以得出设计思路了。首先一个根页面当底版,然…

SpringBoot属性配置的多种方式

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot属性配置的多种方式 📚个人知识库: Leo知识库,欢迎大家访问 目录 …

突破编程_前端_SVG(概述)

1 什么是 SVG SVG,全称可缩放矢量图形(Scalable Vector Graphics),是一种基于 XML(可扩展标记语言)的矢量图像格式。这种图像格式的主要特点是它描述的是矢量图形,而不是基于像素的位图图像。因…

接口和抽象类的综合案例

题目要求: 代码框架: 代码实现: person类: package www.jsu.com;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name name;this.age age;}public …

【第十二篇】使用BurpSuite实现CSRF(实战案例)

CSRF存在前提:简单的身份验证只能保证请求是发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的 业务场景:新增、删除、收藏、编辑、保存使用Burp发现CSRF漏洞的过程如下。 1、如图,存在修改邮箱的功能点如下: 2、修改邮箱的流量包,此时邮箱已被修改: 思路:是…

Labview如何0基础自学快速入门?(纯干货帖)

大家好,首先声明:本文纯干货,单纯为了帮助大家快速入门。有用的话大家点赞评论加关注即可。谢谢大家 题主是从一个毫无编程基础的Labview小白到现在能独立承担软件开发项目的工程师,作为瑞文的老玩家,题主觉得&#xf…

Git场景运用

git 脚本在开发中应用场景-CSDN博客 Git基础 Git基本运作流程 ​​​​​​​ (1) workspace->index->Repository ​ 本地写代码在workspace,add暂存到index,commit提交到本地Repository。多项目成员,每员对应本地仓库,各自…

uniapp-设置UrlSchemes从外部浏览器H5打开app

需求:外部浏览器H5页面,跳转到uniapp开发的原生app内部。 1、uniapp内部的配置: (1)打开manifest->App常用其他设置,如下,按照提示输入您要设置的urlSchemes: (2&am…

pom.xml文件中的标签认识

周末不卷,研究下pom.xml里的内容。 一般一个pom.xml文件外面一个project包着以下的标签: groupId artifactId repositories properties dependencies build plugins 下面分别来说说这几个标签的含义: 1、groupId:表示项目组的id…

MSOLSpray:一款针对微软在线账号(AzureO365)的密码喷射与安全测试工具

关于MSOLSpray MSOLSpray是一款针对微软在线账号(Azure/O365)的密码喷射与安全测试工具,在该工具的帮助下,广大研究人员可以直接对目标账户执行安全检测。支持检测的内容包括目标账号凭证是否有效、账号是否启用了MFA、租户账号是…

vivado 系统内逻辑设计调试流程

系统内逻辑设计调试流程 Vivado 工具提供了诸多功能 , 用于在真实硬件器件中调试系统内设计。系统内调试流程包含 3 个不同阶段 : 1. 探测阶段 : 确定设计中要探测的信号和探测的方法。 2. 实现阶段 : 完成设计实现 &…

Java学习笔记24(面向对象编程(高级))

1.面向对象编程(高级) 1.1 类变量和类方法 1.类变量 ​ *类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是…

31.2k star, 免费开源的白板绘图工具 tldraw

31.2k star, 免费开源的白板绘图工具 tldraw 分类 开源分享 项目名: tldraw -- 无限画布白板 Github 开源地址: https://github.com/tldraw/tldraw 在线测试地址: tldraw 文档地址: tldraw SDK tldraw 是一款开源免费的无限画布白板&…

网络规划(homework 静态路由 and Rip路由表更新)

1、写出下图路由器1和路由器3中的路由表(按直接交付、特定主机交付、特定网络交付、 默认交付的顺序放置路由项) 2、写出Ri更新后的路由表(rip路由协议) 1、将Rj广播的路由消息全部1 2、直接对照着更新Ri中的路由表

基于java实现的二手车交易网站

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea…