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

文章目录

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

在这里插入图片描述

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

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

相关文章

网络编程三要素

网络编程三要素 IP、端口号、协议 三要素分别代表什么 ip:设备在网络中的地址,是唯一的标识 端口号:应用程序在设备中的唯一标识 协议:数据在网络中传输的规则 常见的协议有UDP、TCP、http、https、ftp ip:IPv4和…

Java通过继承的方法来实现长方形的面积和体积

目录 前言 一、测试.java类 1.1运行流程(思想) 1.2代码段 二、Changfangxing.java类 1.1运行流程(思想) 1.2代码段 三、Jxing.java类 1.1运行流程(思想) 1.2代码段 1.3运行截图 前言 1.若有选择…

五、Locust之HTTP用户类

HttpUser是最常用的用户。它增加了一个客户端属性,用来进行HTTP请求。 from locust import HttpUser, task, betweenclass MyUser(HttpUser):wait_time between(5, 15)task(4)def index(self):self.client.get("/")task(1)def about(self):self.client.…

Java避免死锁的几个常见方法(有测试代码和分析过程)

目录 Java避免死锁的几个常见方法 死锁产生的条件 上死锁代码 然后 :jstack 14320 >> jstack.text Java避免死锁的几个常见方法 Java避免死锁的几个常见方法 避免一个线程同时获取多个锁。避免一个线程在锁内同时占用多个资源,尽量保证每个锁…

DMDSC问题测试

问题一:手动停止两节点,单独启动节点二测试 集群停库前状态,登录监视器查看 dmcssm INI_PATHdmcssm.ini show 节点一: [dmdbalocalhost ~]$ DmServiceDMSERVER stop Stopping DmServiceDMSERVER: …

亚马逊 CodeWhisperer: 个人免费的类似GitHubCopilot能代码补全的 AI 编程助手

1、官网 AI Code Generator - Amazon CodeWhisperer - AWS 官方扩展安装教程 2、安装VSCode 下载安装VSCode 3、VSCode安装CodeWhisperer插件 安装VSCode插件 - AWS Toolkit主侧栏,点击AWS ,展开CodeWhisperer,点击Start 在下拉菜单中点…

SAR ADC系列24:冗余设计

目录 冗余(Redundancy) 比较器出错:原因 比较器出错:后果 引入冗余:纠错 冗余:容错量 冗余:非二进制CDAC --sub二进制 冗余:提速 另一种冗余设计方法: 下面的关…

【Homebrew】MacBook的第二个AppStore

英文官网:Homebrew — The Missing Package Manager for macOS (or Linux) 中文官网:macOS(或 Linux)缺失的软件包的管理器 — Homebrew 1 简介 Homebrew 由开发者 Max Howell 开发,并基于 BSD 开源,是一…

Java虚拟机内存区域

Java虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器 是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要通过更改这个计数器的值来改变下一条需要执行的字节码。 由于各个线…

如虎添翼,强大插件让ChatGPT更加游刃有余

ChatGPT模型是当前人工智能领域中备受瞩目的存在。作为一款强大的自然语言处理模型,它具备跨时代的意义,将深刻影响我们的未来。而强大的插件不仅可以丰富ChatGPT的功能,提高其应对复杂问题的能力。还也可以解决一些常见的错误,如…

rust的并发以及kv server网络处理和网络安全部分

理解并发和并行 Golang 的创始人之一,对此有很精辟很直观的解释:并发是一种同时处理很多事情的能力,并行是一种同时执行很多事情的手段。 我们把要做的事情放在多个线程中,或者多个异步任务中处理,这是并发的能力。在多…

Moviepy模块之视频添加图片水印

文章目录前言视频添加图片水印1.引入库2.加载视频文件3.加载水印图片4.缩放水印图片大小5.设置水印的位置5.1 相对于视频的左上角5.2 相对于视频的左下角5.3 相对于视频的右上角5.4 相对于视频的右下角5.5 相对于视频的左中位置5.6 相对于视频的正中位置5.7 相对于视频的右中位…

Redis源码之SDS简单动态字符串

Redis 是内存数据库,高效使用内存对 Redis 的实现来说非常重要。 看一下,Redis 中针对字符串结构针对内存使用效率做的设计优化。 一、SDS的结构 c语言没有string类型,本质是char[]数组;而且c语言数组创建时必须初始化大小&#…

uniapp 之 小球根据当前时间 显示位置

目录 效果图 前言 总代码 1. template 代码 2. script 代码 3. js文件 4.样式 注解 1.小球运动代码 2. picker 时间选择器 补充 效果图 前言 最里面的是一张图片&#xff0c;并不是手写的样式&#xff0c; 总代码 1. template 代码 <uni-popup ref"appointm…

反序列化漏洞及PHP魔法函数

目录 1、漏洞原理 2、序列化&#xff08;以PHP语言为例&#xff09; 3、反序列化 4、PHP魔法函数 &#xff08;1&#xff09;__wakeup() &#xff08;2&#xff09;__destruct() &#xff08;3&#xff09;__construct() &#xff08;4&#xff09;__toString() &…

Pytorch基础 - 3. torch.utils.tensorboard

目录 1. 简介 2. 基本步骤 3. 示例1 - 可视化单条曲线 4. 示例2 - 可视化多条曲线 5. 示例3 - 可视化网络结构 1. 简介 Tensorboard是Tensorflow的可视化工具&#xff0c;常用来可视化网络的损失函数&#xff0c;网络结构&#xff0c;图像等。后来将Tensorboard集成到了P…

【Linux】认识协议

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

QT程序退出还占进程

问题情况 程序运行时的样子&#xff1a; 程序退出时的样子&#xff1a; 其跑到了后台进程里面&#xff1a; 程序退出了&#xff0c;但在任务管理器里查看&#xff0c;其从进程里面转移到后台进程了。 这种问题&#xff0c;怎么办&#xff0c;代码里&#xff0c;应该释放的也都…

【我的创作纪念日】恒川的创作一周年

机缘 大家好&#xff0c;我是热爱跑步的恒川&#xff0c;今天是个特殊的日子&#xff08;我的创作纪念日&#xff09;&#xff0c;在去年的今天&#xff0c;我发了第一篇博文。去年的时候&#xff0c;刚接触到CSDN&#xff0c;只想把他当作一个学习的工具&#xff0c;后来&…

浅析时间复杂度与空间复杂度

时间复杂度 何为时间复杂度 算法的时间复杂度&#xff0c;是一个用于度量一个算法的运算时间的一个描述&#xff0c;本质是一个函数&#xff0c;根据这个函数能在不用具体的测试数据来测试的情况下&#xff0c;粗略地估计算法的执行效率&#xff0c;换句话讲时间复杂度表示的…