【Java】文件类 File 中的文件操作与文件读写

news2024/9/21 7:32:51

文件操作

File 类

属性

修饰符及类型属性说明
static StringpathSeparator路径分隔符,String 类型表示
static charpathSeparator路径分隔符,char 类型表示

构造方法

方法签名说明
File(File parent, String child)根据父目录 File 对象 + 孩子路径,创建 File 对象
File(String pathname)根据文件的绝对路径或相对路径创建 File 对象
File(String parent, String child)根据父目录路径 + 孩子路径,创建 File 对象

方法

修饰符及返回类型方法签名说明
StringgetParent()返回 File 对象的父目录路径
StringgetName()返回 File 对象的待后缀文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个文件
booleancreateNewFile()根据 File 对象的描述,创建对应文件,创建成功返回 true
booleandelete()

根据 File 对象的描述,删除对应文件,删除成功返回 true

voiddeleteOnExit()根据 File 对象的描述,将对应文件标注为待删除,在 JVM 运行结束时执行删除
String[]list()返回 File 对象代表的目录下所有文件的文件名
File[]listFiles()返回根据 File 对象代表的目录下所有文件所构造的所有对应的 File 对象
booleanmkdir()创建 File 对象代表的目录,无法进行多层目录创建
booleanmkdirs()创建 File 对象代表的目录,可以进行多层目录创建
booleanrenameTo(File dest)进行文件改名,也可以修改路径
booleancanRead()判断用户是否有可读权限
booleancanWrite()判断用户是否有可写权限

get 方法的使用

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("../test.txt");
        System.out.println("所处目录名 " + file.getParent());
        System.out.println("文件名 " + file.getName());
        System.out.println("路径 " + file.getPath());
        System.out.println("绝对路径 " + file.getAbsolutePath());
        System.out.println("经过处理的绝对路径 " + file.getCanonicalPath());
    }
}

运行结果

文件创建删除

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");
        System.out.println("是否存在 " + file.exists());
        System.out.println("是否为文件夹 " + file.isDirectory());
        System.out.println("是否为文件 " + file.isFile());
        System.out.println();
        System.out.println("使用 createNewFile() 创建文件");
        System.out.println(file.createNewFile());
        System.out.println();
        System.out.println("是否存在 " + file.exists());
        System.out.println("是否为文件夹 " + file.isDirectory());
        System.out.println("是否为文件 " + file.isFile());
        System.out.println();
        System.out.println("使用 delete() 删除文件");
        System.out.println(file.delete());
        System.out.println();
        System.out.println("是否存在 " + file.exists());
        System.out.println("是否为文件夹 " + file.isDirectory());
        System.out.println("是否为文件 " + file.isFile());
    }
}

运行结果

文件读写

InputStream

方法

修饰符及返回类型方法签名说明
intread()读取一个字节的数据,当内容读完后再读将返回 -1
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回读到的字节数,返回 -1 表示文件读完
intread(byte[] b, int off, int len)读取 len 个字节,最多读取 b.length - off 个字节,数据从 b[off] 开始储存,返回 -1 表示文件读完
voidclose()关闭字节流输入

InputStream 是一个抽象类,需要使用实现类来调用具体方法,我们这里需要文件相关的Input Stream 实现类 —— FileInputStream 类

FileInputStream

构造方法

方法签名说明
FileInputStream(File file)利用 File 对象构造文件输入流 FileInputStream 对象
FileInputStream(String name)利用文件路径构造文件输入流 FileInputStream 对象

使用 read() 一个一个字节读取

public class Test {
    public static void main(String[] args) throws IOException {
        // test.txt 与 src 在同一层中
        // test.txt 内容为 test
        // 使用 try-with-resources 语句打开 FileInputStream 资源
        // try 语句执行完毕后 自动释放 FileInputStream 资源
        try (InputStream inputStream = new FileInputStream("test.txt")) {
            // 使用 read() 一个一个字节的读取直到文件读取结束
            while (true) {
                int b = inputStream.read();
                if (b == -1) {
                    // 当 read() 返回 -1
                    // 文件读取完毕,break 退出循环
                    break;
                }
                // 将每次读取到的字节值以字符形式输出
                System.out.printf("%c", b);
            }
        }
    }
}

运行结果

  

使用 read(byte[] b) 一次读取所有字节

public class Test {
    public static void main(String[] args) throws IOException {
        // test.txt 与 src 在同一层中
        // test.txt 内容为 test
        // 使用 try-with-resources 语句打开 FileInputStream 资源
        // try 语句执行完毕后 自动释放 FileInputStream 资源
        try (InputStream inputStream = new FileInputStream("test.txt")) {
            byte[] bytes = new byte[4];
            while (true) {
                int len = inputStream.read(bytes);
                if (len == -1) {
                    // 当 read() 返回 -1
                    // 文件读完
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.printf("%c", bytes[i]);
                }
            }
        }
        System.out.println();
    }
}

运行结果

注意:由于中文字符的编码原因,一个字节并不能对应一个字符,使用这种方法读取中文需要将 bytes 数组使用 String 类的构造方法 String(byte bytes[], int offset, int length, String charsetName)  将 bytes[] 转换为字符串 (UTF-8  的一个字符大小为 3 个字节)

for (int i = 0; i < len; i+=3) {
    String s = new String(bytes, i, 3, "UTF-8");
    System.out.print(s);
}

运行结果

Scanner

构造方法

构造方法说明
Scanner(InputStream inputStream, String charset)使用 charset 字符集进行 inputStream 的扫描读取

代码实现

public class Test {
    public static void main(String[] args) throws IOException {
        try (InputStream inputStream = new FileInputStream("test.txt")) {
            try (Scanner scanner = new Scanner(inputStream, "UTF-8")) {
                while (scanner.hasNext()) {
                    String s = scanner.next();
                    System.out.print(s);
                }
            }
        }
    }
}

运行结果

OutputStream

方法

修饰符及返回值类型方法签名说明
voidwrite(int b)写入要给的字节数据
voidwrite(byte[] b)将字节数据中的数据全部写入
intwrite(byte[] b, int off, int len)写入字节数组中从 off 开始的 len 个字节数据
voidclose()关闭字节流
voidflush()刷新缓冲区

缓冲区:对程序来讲 I/O 速度是比较慢的。因此为了减少 I/O 次数,写数据的时候会先将数据写入到一个指定的缓冲区中。缓冲区满了或是满足了某些特定条件的时候,将缓冲区的数据一次性写入到目标中,大大减少 I/O 次数。但可能就会出现写入数据时,数据写入到缓冲区中了,但不满足条件,没有写入真正的目的地,数据被遗留在了缓冲区中。所以我们有时需要使用 flush() 刷新缓冲区,强行将缓冲区的数据写到目的地中

OutputStream 同样是一个抽象类,所以我们应该使用 FileOutputStream 类

OutputStreamWriter

一个一个字节写入

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream outputStream = new FileOutputStream("test.txt")) {
            outputStream.write('H');
            outputStream.write('e');
            outputStream.write('l');
            outputStream.write('l');
            outputStream.write('o');
            outputStream.flush();
        }
    }
}

运行结果

字节数组写入

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("test.txt")) {
            byte[] b = new byte[]{
                    (byte) 'G', (byte) 'o', (byte) 'o', (byte) 'd'
            };
            os.write(b);
            os.flush();
        }
    }
}

运行结果

使用字符串写入

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream outputStream = new FileOutputStream("test.txt")) {
            String s = "Hello 世界";
            byte[] b = s.getBytes(StandardCharsets.UTF_8);
            outputStream.write(b);
            outputStream.flush();
        }
    }
}

运行结果

PintWriter

PintWriter 类的对象,提供了几种我们比较熟悉的输出方法,包括 print/println/printf

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream outputStream = new FileOutputStream("test.txt")) {
            OutputStreamWriter osWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
            PrintWriter writer = new PrintWriter(osWriter);

            writer.print("Hello ");
            writer.println("你好");
            writer.printf("%s: %d\n", "一百", 100);

            writer.flush();
        }
    }
}

运行结果

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

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

相关文章

JavaSE学习进阶day05_01 Collection集合

第九章 Collection集合 9.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合和数组既然都是容器&#xff0c;它们有什么区别呢&#xff…

华特转债上市价格预测

华特转债 基本信息 转债名称&#xff1a;华特转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;6.46亿元。 正股名称&#xff1a;华特气体&#xff0c;今日收盘价&#xff1a;93.75元&#xff0c;转股价格&#xff1a;84.22元。 当前转股价值 转债面值 / …

如何成为一名优秀的自动化测试开发工程师?

目录 前言 精通编程语言 掌握自动化测试框架 熟悉测试方法和流程 熟练使用测试工具 具备团队协作能力 学习新技术和工具 以下是更为具体的建议&#xff1a; 总结 前言 自动化测试作为软件测试领域中发展最快的一个分支&#xff0c;已经成为了许多企业提升软件质量和效…

C语言断言函数的应用

对于断言&#xff0c;相信大家都不陌生&#xff0c;大多数编程语言也都有断言这一特性。简单地讲&#xff0c;断言就是对某种假设条件进行检查。 在 C 语言中&#xff0c;断言被定义为宏的形式&#xff08;assert(expression)&#xff09;&#xff0c;而不是函数&#xff0c;其…

vue element-ui web端 引入高德地图,并获取经纬度

发版前接到一个临时新需求 &#xff0c;需要在web端地址选择时用地图&#xff0c;并获取经纬度。 临阵发版之际加需求&#xff0c;真的是很头疼&#xff0c;于是赶紧找度娘&#xff0c;找api。 我引入的是高德地图&#xff0c;首先要去申请key &#xff0c; 和密钥&#xff0c;…

【Typora-使用手册】Typora使用手册 常用设置 常用快捷键

【Typora-使用手册】Typora使用手册 & 常用设置 & 常用快捷键 1&#xff09;Typora简介1.1.Typora是什么1.2.下载地址1.3.下载注意事项 2&#xff09;Markdown语法总结2.1.标题编写2.1.1.大标题2.1.2.小标题 2.2.单选框2.3.删除线2.4.表情包2.5.字体加粗2.6.斜体2.7.表…

4.HDFS概述

如果说HDFS是存储,则Yarn就是cpu和内存,mapreduce就是程序。 1.HDFS文件块大小 HDFS中的文件在物理.上是分块存储(Block) ,block默认保存3份块的大小可以通过配置参数(dfs blocksize)来规定,默认大小在Hadoop2 .x版本中是128M,老版本中是64M。 解释:块的大小:10ms*100*…

分布式链路追踪—SkyWalking

文章目录 1. 总览2. 为什么要使用分布式链路追踪3. 了解OpenTracingOpenTracing数据模型 4. 使用分布式链路追踪的好处5. SkyWalking相关问题思考5.1 如何自动采集数据5.2 如何跨进程传递5.3 traceId如何保证全局唯一5.4 请求量大&#xff0c;采集数据对性能的影响 1. 总览 2. …

ES6 总结

概述 笔记内容为参考《JavaScript 高级程序设计 (第4版)》相关内容进行 ES6 部分知识的总结。主要涉及的知识是变量声明、对象解构、函数和对象的扩展内容、集合引用类型的扩展和面向对象编程等。 ES6 学习系列笔记 ES6 总结Symbol、Map、SetES6 中的类&#xff08;class&am…

LeetCode刷题集(三)(26 删除有序数组中的重复项)

学习目标&#xff1a; 基本掌握LeetCode中的26删除有序数组中的重复项 学习内容&#xff1a;LeetCode 26删除有序数组中的重复项 题目描述&#xff1a; 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c…

刘二大人《Pytorch深度学习实践》第十一讲卷积神经网络(高级篇)

文章目录 Inception-v1实现Skip Connect实现 Inception-v1实现 Inception-v1中使用了多个11卷积核&#xff0c;其作用&#xff1a; (1)在大小相同的感受野上叠加更多的卷积核&#xff0c;可以让模型学习到更加丰富的特征。传统的卷积层的输入数据只和一种尺寸的卷积核进行运算&…

windows系统本地批量预览svg图标

一、为何需要此操作 目前前端使用图标大致分为两类&#xff1a; iconfont方式&#xff1a;通过引入在线或者下载到本地的iconfont.css类文件实现显示图标第二类是封装图标组件&#xff0c;通过传入指定的svg名称快速生成图标 目前第二种是比较方便的&#xff0c;不需要频…

【记录】Truenas Scale|中危漏洞,需要SMB签名

部分内容参考&#xff1a;等保测试问题——需要SMB签名(SMB Signing not Required) 以及 ChatGPT。 Truenas常用SMB服务&#xff0c;但默认并不开启SMB签名。这样具有中间人攻击的风险。 一、漏洞详情 1.1 漏洞报告 漏洞提示如下&#xff1a; 1.2 漏洞介绍 SMB是一个协议名…

Mybatis-Plus -01 Mybatis-Plus入门

Mybatis-Plus入门 1 Mybatis-Plus1.1 Mybatis-Plus简介1.2 Mybatis-Plus特性1.3 Mybatis-Plus框架结构1.1 Mybatis-Plus简介1.2 Mybatis-Plus特性1.3 Mybatis-Plus框架结构 2 Mybatis-Plus 快速入门2.1 数据库准备2.2 导入mybatis-plus依赖2.3 Spring整合MP2.4 编写实体类2.5 编…

i.MX8MP平台开发分享(gicv3篇)-- set_handle_irq及中断路由过程分析

专栏目录&#xff1a;专栏目录传送门 平台内核i.MX8MP5.15.71 文章目录 set_handle_irqhard中断入口 set_handle_irq(gic_handle_irq);set_handle_irq 这个函数的功能很简单&#xff0c;将gic_handle_irq设置为中断处理函数。在发生中断异常后&#xff0c;内核就会切入到这个…

060201面积-定积分在几何学上的应用-定积分的应用

文章目录 1 平面图形的面积1.1 直角坐标情形1.2 极坐标情形1.2.1 极坐标的定义1.1.2 曲边扇形的面积 结语 1 平面图形的面积 1.1 直角坐标情形 ①平面图形由 y f ( x ) , y 0 , x a , y b yf(x),y0,xa,yb yf(x),y0,xa,yb围成图像的面积&#xff0c;如下图1.1-1所示&#…

防洪决策指挥系统(Axure高保真原型)

使用Axure制作的rp高保真原型防洪决策指挥系统可用于行业参考、实际业务需求开发、学习交流使用&#xff0c;本原型需求可以作为开发使用&#xff0c;业务需求均为作者本人行业经验。本系统包括水系展示系统、城区调度决策系统、实时监测预警和防洪调度四大功能模块的界面。 原…

MICCAI 2023 FLARE国际竞赛:打造腹部泛癌CT分割Foundation Models

竞赛官网 CodaLab - Competitionhttps://codalab.lisn.upsaclay.fr/competitions/12239 背景介绍 腹部器官是相当常见的患癌部位&#xff0c;例如结直肠癌和胰腺癌&#xff0c;分别位列癌症死亡率排名的第二位和第三位。Computed tomography (CT) 成像可以为医生提供重要的诊…

前端错误合集

Uncaught Reference Error: xx is not defined 未捕获的引用错误&#xff1a;未定义xx 原因 1.关键字写错了 解决办法 1.修改成正确的关键字 NAN 计算错误 原因 计算时数据类型不同 解决办法 使用数据类型相同的数据进行计算 Uncaught SyntaxError: Invalid left-h…

计算广告(十四)

营销是一个涉及产品、服务或品牌从概念到消费者的全过程的商业活动。它包括分析市场需求、识别潜在消费者、制定和实施策略以满足他们的需求、创造价值和实现销售。营销的目标是在满足客户需求的同时&#xff0c;实现企业的利润和业务增长。 营销涉及以下几个关键环节&#xf…