文件操作File类,OutputStream、InputStream、Reader、Writer的用法

news2025/2/27 7:29:25

文章目录

  • File 类
  • OutputStream、InputStream
    • InputStream
    • OutputStream
  • Reader、Writer
    • Reader
    • Writer
  • 注意事项
  • 简单模拟实战

File 类

Java标准库中提供的File类是对硬盘上的文件的抽象,每一个File对象代表了一个文件,因为文件在硬盘上存储,而直接操作硬盘太过麻烦,所以我们就在内存中抽象一个文件对象,通过改变这个对象间接改变硬盘上的文件。

在构造对象时我们可以使用绝对路径或者相对路径,构造的文件对象可以真实存在也可以不存在,标准库中也为我们提供了很多的方法:

返回值类型方法名说明
String getParent()返回 File 对象的父目录文件路径
String getName()返回 FIle 对象的纯文件名称
String getPath()返回 File 对象的文件路径
String getAbsolutePath()返回 File 对象的绝对路径
String getCanonicalPath()返回 File 对象的修饰过的绝对路径
boolean exists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 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(Filedest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
boolean canRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

下面我们来简单的示范使用一下:

此时我们创建File对象使用的是相对路径,此时项目所在的目录就是工作目录,我们通过调用一些方法获取到了文件的相关信息。

在这里插入图片描述

此时我们使用一个不存在的文件去创建File对象,同样可以成功,因为创建File对象是不要求文件一定存在,此时我们通过方法去判断File对象是否是一个文件或者目录,肯定返回的是false,我们可以调用createNewFile()去创建该文件,创建后再次进行判断。

在这里插入图片描述

使用mkdir()可以创建目录,想要创建多级目录使用mkdirs()

在这里插入图片描述

list可以返回File对象下的所有文件名,listFiles返回时包含自己,此时根据上图我们创建的多级目录可以看出,test目录下的文件只有一个aa。

在这里插入图片描述
以上就是Java中File类的简单介绍。

OutputStream、InputStream

我们可以创建文件删除文件之后,是不是要向文件当中写入一些东西,或者从文件中读取一些东西。此时Java也为我们提供很对类:

针对文本文件,可以使用:Reader Writer去读和写,他们读写的基本单位是字符,称为字符流。

针对二进制文件,可以使用InputStream OutputStream,他们读写的基本单位是字节,称为字节流。

我们有了一个新的概念叫做流,这该怎么理解呢?
在这里插入图片描述

InputStream

返回值类型项目Value
int read()读取一个字节的数据,返回 -1 代表已经完全读完了
int read(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了
intread(byte[] b,int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表已经读完了
void close()关闭字节流

在这里插入图片描述

此时我们创建一个txt文件,通过InputStream对象去读取这个文件里面的内容:

在这里插入图片描述

OutputStream

返回值类型项目Value
void write(int b)写入要给字节的数据
void write(byte[]b)将 b 这个字符数组中的数据全部写入 os 中
intwrite(byte[]b, int off,int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。

我们通过OutputStream向刚才创建的txt文件中写入一些数据:
在这里插入图片描述

此时我们发现,文件中的内容从abc变为了我们输入的内容

Reader、Writer

Reader

在这里插入图片描述

Writer

在这里插入图片描述
同样使用Writer对象向txt文件中写入一些数据。

注意事项

1、上述的类OutputStream、InputStream都是抽象类,实现的时候需要使用具体的类,他们的实现类有很多,目前我们只关心从文件中读写,所以使用FileInputStream。Reader、Writer也是一样,都是抽象类,实现需要具体的类。

2、每次使用完必须要使用close()进行关闭,在一个进程中,当我们打开一个文件就会有一个文件描述符记录我们打开了哪些文件,这些文件描述符多了之后会生成一个文件描述符表,每次打开会在这个表中申请一个位置,但是这个表的大小是有限制的,如果不进行关闭释放,表满了再打开文件就会失败。

有的兄弟会说了,上述代码你一个close()也没有啊!!!正常来说我们打开文件和关闭文件可以这样写:
在这里插入图片描述
但是这样会导致如果代码很复杂有可能close()方法执行不到,我们进行优化:
在这里插入图片描述
这样写可以保证close()方法一定被执行到,但是这样写不够优雅,我们再次优化,Java给我们提供了一个语法叫做try with resources
在这里插入图片描述
因为InputStream实现了一个特定的接口Closeable,所以带有资源的try操作,会在try代码块结束,自动执行close操作。

简单模拟实战

需求:扫描指定目录,找到包含相关内容的的普通文件

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;

public class IOTestMyself {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("请输入你要查找的目录:");
            File rootDir = new File(scanner.next());
            if (!rootDir.isDirectory()) {
                System.out.println("您输入的目录不存在,请重新输入");
            }else {
                System.out.println("请输入你要查找的内容:");
                String word = scanner.next();
                scanDir(rootDir,word);
                break;
            }
        }
    }

    private static void scanDir(File rootDir,String word) {
        File[] files = rootDir.listFiles();
        if(files == null) {
            return;
        }
        for (File f: files) {
            System.out.println("当前查找目录" + f.getAbsolutePath());//打印一下日志
            if(f.isFile()) {
                //是文件就查找
                String ret = readFile(f);
                if(ret.contains(word)) {
                    System.out.println(f.getAbsolutePath() + "包含查找内容");
                }
            }else if(f.isDirectory()) {
                //是目录递归查找下级目录
                scanDir(f,word);
            }else {
                //啥也不是跳过
                continue;
            }
        }
    }

    private static String readFile(File f) {
        StringBuilder stringBuilder = new StringBuilder();
        try (Reader reader = new FileReader(f)){
            while (true) {
                int c = reader.read();
                if(c == -1) {
                    break;
                }
                stringBuilder.append((char)c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}

在这里插入图片描述

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

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

相关文章

4月11日作业修订

A.这主要看你互斥锁锁的资源是那部分的,如果是进程内资源,则可以实现同一进程不同线程之间的互斥,而如果将共享内存作为互斥锁进行操作则可以实现不同进程之间的互斥。 B.这是必然的,加锁是为了防止数据的二义性 C.信号量同时使…

代码规范(以后会补充)

目录 为什么要规范代码 不规范的代码有什么特点 ​编辑 不规范的坏处 规范代码是什么样的 如何规范代码 1.代码中不要出现莫名其妙的数字 2.深度嵌套 3.注释 4.避免创建大函数 5.重复代码 6.变量命名 7.函数命名 8.命名时注意动词的使用 9. 常量值所有都大写 10. 避免变…

Bossies 2016:最佳开源大数据工具

导读在今年的 Bossie开源大数据工具中,你会发现最新最好的方法是利用大型集群进行索引、搜索、图形处理、流处理、结构化查询、分布式OLAP和机器学习,因为众多处理器和RAM可降低工作量级。 处理大数据可能会遇到各种各样的问题,目前没有任何工…

SpringMVC简介及入门

SpringMVC SpringMVC简介 一、三层架构和MVC 1、三层架构概述 (1)开发架构:一是 C/S 架构 (客户端/服务器),二是B/S架构(浏览器/服务器)。在JavaEE开发中,几乎全部是基于 B/S架构的开发。在B/S 架构中&…

最简单IDEA社区版构建SpringBoot项目

一、环境准备 IDEA Community Edition jdk8 maven 二、下载SpringBoot项目 https://start.spring.io/ 项目名称自己修改下。 点击ADD DEPENDENCIES,添加Web依赖。 下载构建好的SpringBoot项目的压缩包 三、idea中打开SpringBoot项目 使用maven加载依赖。 四、测…

【数据库原理 • 三】关系数据库标准语言SQL

前言 数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前…

4.7 AOP底层源码原理

4.7.1 AOP源码 进入到这里 F8跳过assertBeanFactoryActive方法,因为spring它方法调用太乱了,如果不挑“核心”去看,很快你就会被绕晕, 那么我们怎么判断这个assertBeanFactoryActive不是核心,注意前面getbean方法返回…

《淘宝网店》:计算总收益

目录 一、题目 二、思路 1、当两个年份不一样的时候 (1)from年剩余之后的收益 (2)中间年份的全部收益 (3)to年有的收益 2、同一个年份 三、代码 详细注释版本: 简化注释版本&#xff…

RC滤波器

前阶段,因项目解干扰问题,和同事聊起来RC滤波。所以,今日借此机会,通过文章的方式再一次给大家简单的普及一下RC滤波的知识。 关于滤波,其目的还是为了尽可能多的让有用信号做到无衰减,无用信号衰减至近乎…

云南计算机专升本经验分享

一、概述 经验分享 越早准备越好,切勿过分迷信同学的学习进度。 英语(97) 在云南专升本里面,英语在90以上已经是不错了,我由于自身基础不好原因,导致我刚开始一度想放弃英语,所以对英语的学习也是极尽节俭&#xff0…

Python每日一练(20230416)

目录 1. 有效数字 🌟🌟🌟 2. 二叉树的最大深度 🌟 3. 单词搜索 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 …

【RabbitMQ】图解RabbitMQ是如何保证消息可靠性的

目录 一、概述 1、消息可靠性 2、SpringBoot整合RabbitMQ配置文件 二、生产者---RabbitMQ服务器如何保证信息不丢失 1、confirm确认模式 1.说明 2.SpringBoot代码实现 2、return退回模式 1.说明 2.SpringBoot代码实现 三、RabbitMQ服务器如何保证消息不丢失 四、Ra…

Logstash:使用自定义正则表达式模式

有时 Logstash Grok 没有我们需要的模式。 幸运的是我们有正则表达式库:Oniguruma。在很多时候,如果 Logstash 所提供的正则表达不能满足我们的需求,我们选用定制自己的表达式。 定义 Logstash 是一种服务器端数据处理管道,可同时…

zabbix客户端配置

一、zabbix客户端配置 1.实验环境:关闭防火墙和安全模块 systemctl disable --now firewalld setenforce 0 2.服务端和客户端都要时间同步 yum install -y ntpdate #注意安装需要用网络源安装,不能用本地源 ntpda…

电子器件系列34:tvs二极管(2)

一、基本原理: 二、重要产数: 不同的资料对于相同的参数可能有不同的命名,要根据实际情况来确定参数的意义 这里以上图表格里的参数名称进行解析,以其他资料作为参考。 结合图表和伏安特性曲线,再结合下面的图我是…

你认为的.NET数据库连接池,真的是全部吗?

一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接被收拢到配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是开箱即用的Connection对象。 DBA能在对业务方无侵入的情况下,让大规模微服务实例切换…

第二周P9-P22

文章目录第三章 系统总线3.1、总线的基本概念一、为什么要用总线二、什么是总线三、总线上信息的传送四、总线结构的计算机举例1、单总线结构框图2、面向CPU的双总线结构框图3、以存储器为中心的双总线结构图3.2、总线的分类1、片内总线2、系统总线3、通信走线3.3、总线特性及性…

基于多目标粒子群优化算法的计及光伏波动性的主动配电网有功无功协调优化(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Vivado中ILA(集成逻辑分析仪)的使用

Vivado中ILA(集成逻辑分析仪)的使用一、写在前面二、ILA(Integrated Logic Analyzer)的使用2.1 ILA查找2.2 ILA配置2.2.1 General Options2.2.2 Probe Ports三、ILA调用四、ILA联调4.1 信号窗口4.2 波形窗口4.3 状态窗口4.4 设置窗口4.5 触发条件设置窗口…

Segment Anything论文详解(SAM)

论文名称:Segment Anything 论文地址:https://arxiv.org/abs/2304.02643 开源地址:https://github.com/facebookresearch/segment-anything demo地址:Segment Anything | Meta AI 主要贡献:开发一个可提示的图像分…