File,IO流,递归详解

news2024/11/17 8:29:52

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.coloradmin.cn/o/1574771.html

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

相关文章

图片批量高效管理,图片像素缩放支持自定义操作,让图像处理更轻松

在数字化时代,图片管理成为了我们生活和工作中不可或缺的一部分。无论是个人用户还是企业用户,都需要对大量的图片进行有效的管理和处理。然而,面对众多的图片,如何进行批量管理并对其进行像素缩放成为了一个挑战,该如…

web学习笔记(五十三)身份认证

目录 1.Web 开发模式 1.1 服务端渲染的 Web 开发模式 1.2 服务端渲染的优缺点 1.3 前后端分离的 Web 开发模式 1.4 如何选择 Web 开发模式 2. 身份认证 2.1 Session 认证机制 3. 在 Express 中使用 Session 认证 3.1 安装express-session 中间件 3.2 配置 express-ses…

JVM内存性能调优思路之:通过GC log、Thread Dump 、Heap Dump分析内存使用说明

文章目录 一. 各日志概述1. Garbage Collection Log - 找到GC规律2. 线程转储(Thread dump) - 分析(快照)线程状态3. 堆转储(Heap dump) - APP某刻内存使用全貌 二. 命令1. 程序的gc日志2. 线程转储3. 堆转储 概述 在 Java 虚拟机中,(GC) Gar…

linux 文件提权|属性修改

文章目录 suid(set uid)添加文件属性查看文件属性i (immutable) umask suid(set uid) 让文件在执行的时候具有属主(对应文件 user )的权限 chmod 7744 temp.txt 第一位的7表示权限位…

软件自动化测试的难点怎么解决

软件自动化测试是一种使用工具或脚本来代替人工执行测试用例的方法,它可以提高测试的效率和质量,但也存在一些挑战和问题。 总结了以下几个常见的难点和解决方案: 接口文档的不完整性:有些接口的文档没有说明清楚必要的字段、参…

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作

二叉树(1):深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 二叉树(2):深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度-CSDN博客 前言…

【前端Vue】Vue3+Pinia小兔鲜电商项目第4篇:静态结构搭建和路由配置,1. 准备分类组件【附代码文档】

Vue3ElementPlusPinia开发小兔鲜电商项目完整教程(附代码资料)主要内容讲述:认识Vue3,使用create-vue搭建Vue3项目1. Vue3组合式API体验,2. Vue3更多的优势,1. 认识create-vue,2. 使用create-vue创建项目,1. setup选项的写法和执行…

C语言解决汉诺塔问题

背景 首先带大家了解一下汉诺塔问题 汉诺塔是一个典型的函数递归问题,汉诺塔描述了这样的场景,有三个柱子,A,B,C,A柱为起始柱,在A柱上面有若干大小不同的盘子,最下面的最大,最上面的最小&#x…

Linux系统下安装ElasticSearch

一、228环境ES使用安装 1、检验ES服务是否安装成功的方法 (1)查看Elasticsearch进程是否成功 ps -ef|grep elasticsearch (2)linux elasticsearch下访问(curl带认证访问) curl --user elastic:Zhes.13…

CSS面试题常用知识总结day03

大家好我是没钱的君子下流坯,用自己的话解释自己的知识 前端行业下坡路,甚至可说前端已死,我还想在前段行业在干下去,所以从新开始储备自己的知识。 从CSS——>Javascript——>VUE2——>Vuex、VueRouter、webpack——>…

STM32F103C8T6-CAN

本文内容 HAL库下printf重定向解决问题:Keil下调试可以正常运行,而下载后运行不了CAN总线的回环测试,自发自收 printf重定向 实现printf重定向的目的是方便调试,通过UART查看打印的调试信息。 下面以STM32F103C8T6为例&#xf…

【前沿模型解析】潜在扩散模 1 | LDM第一阶段-感知图像压缩总览

文章目录 0 开始~1 感知压缩的目的2 自回归编码器-解码器生成模型一览2.1 AE 自编码器2.2 VAE 变分自编码器2.3 VQ-VAE2.4 VQ-GAN 3 代码部分讲解总览 0 开始~ 从今天起呢,我们会剖析LDM(潜在扩散模型) 从去年开始,大量的生成模…

数学建模-------MATLAB分支循环断点调试

1.if语句 (1)分段函数的引入(这里的数据表示的是分数的不同区间对应的等级) (1)这个就是一个十分简单的if语句,无论是if还是elseif后面都是不能添加任何分号的,这个例子就是一个分段的函数,在不…

基础总结篇:Activity生命周期

private int param 1; //Activity创建时被调用 Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, “onCreate called.”); setContentView(R.layout.lifecycle); Button btn (Button) findViewById(R.id.…

医药行业痛点以及OKR解决方案

一、背景 随着医药行业的快速发展和市场竞争的加剧,企业面临着前所未有的挑战和机遇。为了在激烈的市场竞争中立于不败之地,某知名医药企业决定引入OKR(Objectives and Key Results,目标与关键成果)管理模式&#xff0…

Gradle入门初探

一、Gradle简介: 我们都创建过基于Maven的项目,maven可以很好的管理项目的依赖,编译和打包项目,Gradle是一个和Maven类似的自动化构建工具,Maven是基于xml文件格式,而Gradle是基于Groovy的语言&#xff0c…

dm8数据迁移工具DTS

dm8数据迁移工具DTS DTS工具介绍 DM数据迁移工具提供了主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能。DM数据迁移工具采用向导方式引导用户通过简单的步骤完成需要的操作。 DM数据迁移工具支持: ◆ 主流大型数据库Oracle、SQLServer、MyS…

Advanced RAG 01:讨论未经优化的 RAG 系统存在的问题与挑战

编者按: 自 2023 年以来,RAG 已成为基于 LLM 的人工智能系统中应用最为广泛的架构之一。由于诸多产品的关键功能严重依赖RAG,优化其性能、提高检索效率和准确性迫在眉睫,成为当前 RAG 相关研究的核心问题。 我们今天为大家带来的这…

【无标题】【Android】Android中Intent的用法总结

2.显示地图: Java代码 Uri uri Uri.parse(“geo:38.899533,-77.036476”); Intent it new Intent(Intent.Action_VIEW,uri); startActivity(it); 3.从google搜索内容 Java代码 Intent intent new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.pu…

SAP操作教程第16期:SAP B1关于审批模块的设置

工作效率是企业的生存之本,也是员工能够在企业中发展之本。自动化和规范化的审批流程可以减少手动操作以及沟通环节、节约时间和资源从而提高工作效率。 所以,今天我们就一起来了解一下SAP B1中关于审批模块的设置。 01关于审批模块的设置 第一步&#x…