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);}}}

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

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

相关文章

【二分查找】Leetcode x 的平方根

题目解析 69. x 的平方根 这道题表面是没有顺序性,但是我们可以发现如果使用枚举策略,它是包含顺序性质的,因此我们将枚举算法改进成二分算法 算法讲解 我们让left指针指向1, right指针指向x 如果当前的mid计算出来的平方 &g…

什么是商家转账到零钱

商家转账到零钱是什么? 通过商家转账到零钱这个功能,如果我们系统需要对用户支付费用,比如发放佣金、提成、退款之类的,可以直接转账到用户的微信零钱。 【商家转账到零钱】是【企业付款到零钱】的升级版,2022年5月1…

怀俄明探空站数据解算PWV和Tm

1. Matlab 获取代码可关注公众号WZZHHH回复(怀俄明探空站数据解算PWV和Tm),或者咸鱼关注:WZZHHH123 怀俄明探空站数据解算PWV和Tm: 有关 Matlab 获取代码可关注公众号WZZHHH回复(怀俄明多线程下载&#…

语音助手背后的魔法:一文揭秘NLP在智能助手中的应用

自然语言处理(NLP)正逐渐渗透到我们生活的每一个角落。在今天的大盘点中,我们将深入探索NLP在实际生活场景中的多样化应用,以及它在各个案例中所展现出的强大能力。 NLP技术如今已成为智能生活的关键驱动力,它让机器能…

JavaScript笔记 11

目录 01 创建元素的方式 02 BOM概述 03 window 04定时器 05 location对象的使用 07 js特效 08 offset系列相关属性 09 scroll 相关属性 10 client 相关属性 11 window 相关的事件 12 event 相关的属性 01 创建元素的方式 创建元素的三种方式: 1.innerHTML创建元素 …

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--php数组与基本循环

php数组与基本循环 <?php$myName"xixi";$namesarray(xixi1,xixi2,xixi3); ?> <p> Hi ,my name is <?php echo $myName; ?> </p> <p> Hi,my name is <?php echo $names[0] ?> </p> <p> Hi,my name is <?…

Open CASCADE学习|放样建模

在CAD软件中&#xff0c;Loft&#xff08;放样&#xff09;功能则是用于创建三维实体或曲面的重要工具。通过选取两个或多个横截面&#xff0c;并沿这些横截面进行放样&#xff0c;可以生成复杂的三维模型。在CAD放样功能的操作中&#xff0c;用户可以选择不同的选项来定制放样…

创新数智化全场景福利解决方案,打造极致员工体验

众所周知&#xff0c;企业面临两个市场&#xff0c;一个是前端的产品&#xff08;服务&#xff09;市场&#xff0c;面对的是客户&#xff0c;另一个便是后端市场&#xff0c;即愈来愈烈的人才市场。在风云变幻、人潮涌动的知识经济时代&#xff0c;员工已成为企业未来的竞争关…

洛谷 P4554 小明的游戏

思路&#xff1a;双端队列。 其实一开始你可以用BFS进行实验&#xff0c;由于我们需要找最小的费用&#xff0c;所以我们在BFS的时候可以这样想&#xff1a;在我们遍历到第一块板子的时候&#xff0c;在找周围的路时&#xff0c;我们可以改成这样的判断&#xff1a;如果周围的…

【大数据】ETL工具适用场景、常见产品、功能介绍

ETL&#xff08;Extract, Transform, Load&#xff09;工具是用于将数据从源系统抽取出来、进行转换处理&#xff0c;然后加载到目标系统的软件工具。它们在数据仓库、数据湖、数据集成等领域起着至关重要的作用。以下是关于ETL工具的详细介绍&#xff1a; 适用场景&#xff1…

Linux_进程通信_管道_system V共享内存_6

文章目录 一、进程通信分类二、管道1.什么是管道1.原理2.管道的特点 2.匿名管道3.命名管道1.创建命名管道文件 - mkfifo (命令)2.创建命名管道文件 - mkfifo (函数) 三、system V共享内存1.原理2.共享内存函数1.fotk2.shmget1.如何知道有哪些IPC资源 - ipcs &#xff08;命令&a…

河海大学-海洋学院2024年硕士研究生调剂通知

一、调剂专业及计划具体调剂专业及计划可参见河海大学研究生院官网《河海大学2024年硕士研究生调剂通知》和附件。 二、调剂报名与复试要求 1.报名条件&#xff1a;调剂原则见《河海大学202 4年硕士研究生调剂通知》&#xff0c;详细要求见中国研究生招生信息网“全国硕士研究…

Mysql密码修改问题

docker安装mysql&#xff0c;直接拉取镜像&#xff0c;挂载关键目录即可启动&#xff0c;默认3306端口。此时无法直接连接&#xff0c;需要配置密码。docker进入mysql容器中 docker exec -it mysql bash #mysq是容器名称&#xff0c;也可以用容器id通过修改mysql的配置进行免密…

Unity类银河恶魔城学习记录12-7-1 p129 Craft UI - part 1源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftList.cs using System.Collections; using System.Collections.Gen…

Vue基础知识:Vue路由——重定向,以及?(可选符)的使用

当网页打开时&#xff0c;url默认是/路径&#xff08;根路径&#xff09;&#xff0c;未匹配到组件时&#xff0c;会出现空白&#xff0c;为了解决这个问题 就要利用重定向 重定向&#xff1a;匹配path后&#xff0c;强制跳转path路径 重定向的语法&#xff1a; {path:匹配…

【Linux】使用cloudreve搭建个人网盘并传输文件

Cloudreve 是一个开源的个人网盘系统&#xff0c;能够帮助用户搭建属于自己的私有云存储服务。它支持多种存储后端&#xff0c;包括本地存储、远程FTP/SFTP存储、以及云存储服务如阿里云OSS、腾讯云COS和Amazon S3等。Cloudreve具有友好的用户界面和丰富的功能&#xff0c;比如…

bash工具-dir_util.sh

#!/usr/bin/env bash#以pwd和当前脚本路径名$0 结合 给出 当前脚本所在目录名、当前脚本名 #调用者应该在切换目录之前调用本函数, 即 尽可能早的调用本脚本. # 若 调用者 切换到其他目录后&#xff0c;调用本脚本 则结果肯定不对. # 使用例子: getCurScriptDirName $0 #返…

如何使用开源情报跟踪一个人?在线访问网站以及使用方法介绍

如何使用开源情报跟踪一个人&#xff1f;在线访问网站以及使用方法介绍。 开源情报&#xff08;OSINT&#xff09;是一门关于收集和分析公开可用信息的独特技艺&#xff0c;它致力于构建个人或团体的详尽档案。 这一过程中&#xff0c;信息搜集者会利用多元化的信息源&#xff…

SQLite 查询优化器概述(九)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite中的隔离(八&#xff09; 下一篇&#xff1a;SQLite下一代查询规划器(十&#xff09; 1. 引言 本文档概述了查询规划器和优化器如何 用于 SQLite 工作。 给定一个 SQL 语句&#xff0c;可能有几十个、几百…

Java: LinkedList的模拟实现

一、双向链表简介 上一篇文章我介绍了单向链表的实现&#xff0c;单向链表的特点是&#xff1a;可以根据上一个节点访问下一个节点&#xff01;但是&#xff0c;它有个缺点&#xff0c;无法通过下一个节点访问上一个节点&#xff01;这也是它称为单向链表的原因。 那么&#x…