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技术如今已成为智能生活的关键驱动力,它让机器能…

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;员工已成为企业未来的竞争关…

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;比如…

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

如何使用开源情报跟踪一个人&#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…

C++面向对象程序设计 - 共用数据的保护(常对象、常指针和常引用)

C虽然采取了不少有效的措施&#xff08;如设private保护&#xff09;以增加数据的安全性&#xff0c;但是有些数据却往往是共享的&#xff0c;例如实参与形参&#xff0c;变量与其引用&#xff0c;数据与其指针等&#xff0c;人们可以在不同的场合通过不同的途径访问同一个数据…

【QT+QGIS跨平台编译】056:【pdal_arbiter+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_arbiter介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_arbiter介绍 pdal_arbiter是 PDAL 项目的一个库,用于帮助管理应用程序运行在 EC2 实例上的 AWS 凭证。 当应用程序需要调用 AWS API 时,它们必须使用 AWS 凭据对 AP…

AI预测福彩3D第28弹【2024年4月6日预测--第7套算法重新开始计算第1次测试】

今天开始&#xff0c;咱们开始进行第7套算法的测试&#xff0c;第7套算法将综合012路权重、012路直选及012路和值进行预测。好了&#xff0c;先上图后上结果吧~ 2024年4月6日福彩3D的七码预测结果如下 第一套&#xff1a; 百位&#xff1a;1 2 4 5 7 8…

全志 Linux Qt

一、简介 本文介绍基于 buildroot 文件系统的 QT 模块的使用方法&#xff1a; • 如何在 buildroot 工具里编译 QT 动态库&#xff1b; • 编译及运行 qt_demo 应用程序&#xff1b; • 适配过程遇到的问题。 二、QT动态库编译 在项目根路径执行 ./build.sh buildroot_menuc…