文件API及其操作

这里介绍两类文件操作、三个文件类。包括文件系统操作(File类)、文件内容操作(操作字节流、操作字符流)

1.文件类File

1.1.认识File类

(1)什么是File类呢?其实就是可以操作文件的一个类。通过File类构造一个文件对象,此时就得到了一个文件对象的引用,通过该引用,可以得到该文件的路径、名字;判断该文件对象是文件目录还是目标文件

(2)构造方法

签名说明
File(File parent,String child)根据父目录+孩子文件路径,创建一个新的File实例
File(String pathname)根据文件路径创建一个新的File实例,路径可以是绝对/相对路径
File(String parent,String child)根据父目录+孩子文件路径,创建一个新的File实例,父目录用路径表示

我们常用第二个,pathname就是一个文件路径,绝对路径或者相对路径都可以。

值得注意的点:以上创造的File对象,里面的文件路径,表示的是目录还是最终文件,无论在你的硬盘中是否存在,都不影响,都可以创造出来。

1.2.认识File类的方法

这个有什么用呢?就是在构建好一个文件对象之后,可以通过File类中的方法去操作文件。

(1)返回路径型

返回值类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
StringgetPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象的修饰过的绝对路径

(2)返回boolean型

返回值类型方法签名说明
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是一个目录
booleanisFile()判断File对象代表的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自带创建一个空文件。成功创建后返回true
booleandelete()根据File对象,删除该文件。成功删除后返回true
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作

(3)其他类型

返回值类型方法签名说明
voiddeleteOnExit()根据File对象,标注文件将删除,删除动作会到JVM运行结束时
String[ ]list()返回File对象代表的目录下的所有文件名
File[ ]listFiles()返回File对象代表的目录下的所有文件,以File对象表示

在标准库中,还有许多方法,这里就不一一展示了。

很多方法在后续也都会使用到,这里也不做使用的展示,我们接着看后续。

1.3.实例化文本对象

下面介绍三种创造File对象的方式,可以说是不同的情况创造File对象 

(1)文件不存在-以相对路径

这个test666.txt文件在实例化对象时,是不存在的,所以最后一行是显示false。其他的路径是因为我们在创造的时候是以一个相对路径,相对路径的现在位置就是该.java文件的位置。

 public static void main(String[] args) throws IOException {File f = new File("./text666.txt");System.out.println("该文件名字:"+f.getName());System.out.println("这级目录的名字:"+f.getParent());System.out.println("文件的路径:"+f.getPath());System.out.println("文件的绝对路径:"+f.getAbsolutePath());System.out.println("文件的绝对路径2:"+f.getCanonicalPath());//这个需要抛出异常System.out.println("文件是否真是存在:"+f.exists());}

(2)文件不存在--以绝对路径

(3)文件存在--以绝对路径

我们先在d盘上面创造一个文件

然后以创造文件类的方式打开

 public static void main(String[] args) throws IOException {File f = new File("d:/test999.txt");System.out.println("该文件名字:"+f.getName());System.out.println("这级目录的名字:"+f.getParent());System.out.println("文件的路径:"+f.getPath());System.out.println("文件的绝对路径:"+f.getAbsolutePath());System.out.println("文件的绝对路径2:"+f.getCanonicalPath());//这个需要抛出异常System.out.println("文件是否真是存在:"+f.exists());}

然后以相对路径打开:

第一个绝对路径就是当前的基准路径(在当前项目运行代码)+相对路径拼接而成

绝对路径2就是:拼接后并进行了一些优化操作。

1.4.创造文件

如果文件不存在,我们创造文件要根据下面的方法 

 

(1)相对路径创造文件

 public static void main(String[] args) throws IOException {File f = new File("./test222.txt");f.createNewFile();//需要抛出异常}

需要抛出异常的原因:(1)给出的路径非法(2)路径权限不足

(2)以绝对路径创造

public static void main(String[] args) throws IOException {File f = new File("d:/tttttt.txt");boolean bool = f.createNewFile();System.out.println(bool);}

程序运行后:

文件被真正的创造了出来,如果再运行一次代码,就是返回false,原因是该文件已经存在,无法再创造。

(3)判断文件是目录还是普通文件

 public static void main(String[] args) throws IOException {File f = new File("d:/tttttt.txt");f.createNewFile();System.out.println("文件是否真实存在:"+f.exists());System.out.println("文件是否代表目录:"+f.isDirectory());System.out.println("文件是否为普通问题:"+f.isFile());}

1.5.删除文件

删除文件有两个方法,下面一一介绍如果使用,及使用后的结果。

(1)直接删除文件

 public static void main(String[] args) throws IOException {File f = new File("d:/tttttt.txt");f.createNewFile();boolean bool = f.delete();System.out.println(bool);}

文件已被删除。

(2)延迟删除

 public static void main(String[] args) throws IOException {File f = new File("d:/tttttt.txt");f.createNewFile();f.deleteOnExit();//等进程结束后再删除文件System.out.println("进程结束前"+f.exists());Scanner in = new Scanner(System.in);in.next();//阻塞进程结束System.out.println("进程结束后:"+f.exists());}

当输入后,进程就会马上结束

文件也就不存在了。这就是延迟删除,当程序彻底结束后文件才会被删除。

接下来的部分是针对文件的内容进行操作。 操作文件内容的三个固定步骤:以二进制/文本方式打开文件--->读文件/写文件--->关闭文件

2.字节流

这样的意思就是:以二进制的方式打开文件,以字节为单位进行读取数据/写数据。

2.1.以字节流读取文件

所谓读取文件,就是读取文件中的数据,但是不会改变里面的内容

(1)打开文件

要读取数据,第一步就是打开文件。这里需要使用两个类,实例化好了对象,就相当于拿到了一个“流”对象,通过流,就可以随时读取文件数据。

 InputStream file = new FileInputStream("d:/dog111.txt");//以二进制打开文件(文件必须存在)

使用到两个类:

InputStream//抽象父类
FileInputStream//子类

注意点:

1)文件路径代表的文件必须真实存在,否则会抛出异常

2)必须在方法后面声明异常

(2)读取文件内容

打开了文件,接下来就读取文件内容的操作,读取文件内容有下面三种方式:

返回值类型方法签名说明
intread()读取一个字节的数据,返回-1代表读取结束(内容已读取完)
intread(byte[ ] b)最多读取b.length字节的数据到b中,返回时机读到的数量;-1代表读取完
intread(byte[ ],int off,int len)最多读取len-off个字节到b中,从b的off位置开始存放;-1读取完

第一种读取方式:每次读取一个字节

 public static void main(String[] args) throws IOException {//1.打开文件InputStream file = new FileInputStream("d:/dog111.txt");//以二进制打开文件(文件必须存在)//2.读文件while (true) {int n = file.read();if(n==-1) {System.out.println("文件读取完毕");break;}System.out.printf("%d ",n);}}

运行结果 

文件内容:

代码解释:我们采取循环读取的方式进行读取,当读取到-1的时候,说明文件里面的内容都已经被读取完毕了,就可以结束循环。

第二种读取方式:每次读取一个字节数组的数据

 public static void main(String[] args) throws IOException{InputStream file = new FileInputStream("d:/dog111.txt");byte[] bytes = new byte[1024];while (true) {int n = file.read(bytes);if(n==-1) break;for (int i = 0; i < n; i++) {System.out.printf("%c ",bytes[i]);}System.out.println();}}

这种方法读取数据会比第一种快,而且效率也高,

第三种方式:特定场景使用

 public static void main(String[] args) throws IOException{InputStream inputStream = new FileInputStream("d:/dog111.txt");byte[] bytes = new byte[1024];while (true) {int n = inputStream.read(bytes,0,1024);if(n==-1) {break;}for (int i = 0; i < n; i++) {System.out.printf("%c ",bytes[i]);}}}

上述都只是打开了流和读取数据,并没有关闭流,下面介绍关闭流。

2.2.关闭流

第一种方式:

使用try finally,目的是防止程序发生特殊情况,导致没有关闭流。但是这样子冗余,不好看。

 public static void main(String[] args) throws IOException{InputStream inputStream = new FileInputStream("d:/dog111.txt");try{byte[] bytes = new byte[1024];while (true) {int n = inputStream.read(bytes,0,1024);if(n==-1) {break;}for (int i = 0; i < n; i++) {System.out.printf("%c ",bytes[i]);}}}finally {inputStream.close();}}

第二种方式:

 public static void main(String[] args) throws IOException{try (InputStream file = new FileInputStream("d:/dog111.txt")){byte[] bytes = new byte[1024];while (true) {int n = file.read(bytes);if(n==-1) break;for (int i = 0; i < n; i++) {System.out.print((char) bytes[i]+" ");}}}}

将打开流的操作,放在try中。当执行完后,会自动关闭流,也就不不需要在后面加上finally了

2.3.以字节流写文件

 (1)第一次写

public static void main(String[] args)  throws IOException{//写文件try(OutputStream outputStream = new FileOutputStream("d:/dog111.txt")) {outputStream.write(97);outputStream.write(98);outputStream.write(99);outputStream.write(100);outputStream.write(101);}}

再写一次:

第二次写时会覆盖掉文件内的内容。

原因是:打开文件就会把文件原有的内容给覆盖掉。为了解决这个问题,可以使用追加的方式进行打开文件。

3.字符流

接下来的读取/写文件,都是以字节为单位的。 

3.1.读文件

对于读文件,依旧是有三种方式,和上述的字节流类似

 (1) 第一种方式:

 public static void main(String[] args) throws IOException {Reader reader = new FileReader("d:/dog111.txt");while (true) {int n = reader.read();if(n==-1) break;System.out.print((char)n+" ");}}

可以读取文字

当去read()的时候,读到的是三个字符的数据,但是返回的时候,会转化成两个字节去接收。

(2)第二种方式: 

3.2.写文件

写文件,和上述是一样的。

 如果直接打开文件,然后去写文件,就会将原有的内容覆盖,所以要使用追加的方式去写。

(1)不追加写

原有内容被覆盖了。也就是第一次写入的时候,接着往下写是不会被覆盖的。

(2)追加写

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

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

相关文章

C# dateTimePicker控件存取数据库问题

存入数据库时&#xff0c;先设置&#xff0c; dateTimePicker1.Format DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat "yyyy-MM-dd HH:mm:ss"; 然后&#xff0c;dateTimePicker1.Text 就和textBox1.Text一样方式存入数据库&#xff1b;…

【Java EE】Mybatis之XML详解

文章目录 &#x1f38d;配置数据库连接和MyBatis&#x1f340;写持久层代码&#x1f338;添加mapper接口&#x1f338;添加UserInfoXMLMapper.xml&#x1f338;单元测试 &#x1f332;CRUD&#x1f338;增(Insert)&#x1f338;删(Delete)&#x1f338;改(Update)&#x1f338;…

低空经济+飞行汽车:eVTOL技术详解

低空经济是以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引&#xff0c;辐射带动相关领域融合发展的综合性经济形态。它广泛体现于第一、第二、第三产业之中&#xff0c;在促进经济发展、加强社会保障、服务国防事业等方面发挥着日益重要的作用。 飞行汽车&#xff0c…

Linux服务器常用命令总结

view查找日志关键词 注意日志级别&#xff0c;回车后等一会儿&#xff0c;因为文件可能比较大加载完需要时间 当内容显示出来后&#xff0c;使用“/关键词”搜索 回车就能搜到&#xff0c;n表示查找下一个&#xff0c;N表示查找上一个 find 查找 find Family -name book …

js APIS part2

什么是事件&#xff1f; 事件是在编程时系统内发生的 动作 或者发生的事情。比如用户在网页上 单击 一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为 绑定事件或者注册…

Python爬取豆瓣电影Top250数据

任务 爬取豆瓣电影top250中的影片名称、影片海报、年份、地区、类型、评分、评价人数、总体评价&#xff0c;并输出到douban_top250.xlsx文件中 环境 Python 3.8 requests bs4 openpyxl 源码 # 创建一个新的Excel工作簿 workbook openpyxl.Workbook() # 获取默认的工作表…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新&#xff0c;以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 精酿啤酒品牌私域执行运营的内容策划&#xff0c;涉及以下几个…

Messari 报告摘要 :Covalent Network(CQT)2024 年第一季度表现

摘要&#xff1a; 尽管 CQT 代币流通供应量增加了 20%&#xff08;新增 1.04 亿枚 CQT&#xff09;&#xff0c;但 CQT 的质押百分比仅从 2023 年第一季度的 22% 增长到了 2024 年第一季度的 29%。 CQT 的市值季度环比增长了 28%&#xff0c;多次达到 2.75 亿美元&#xff0c…

全栈开发之路——前端篇(4)watch监视、数据绑定和计算属性

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 辅助文档&#xff1a;HTML标签大全&#xff08;实时更新&#xff…

Python | Leetcode Python题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; class Solution:def minPathSum(self, grid: List[List[int]]) -> int:if not grid or not grid[0]:return 0rows, columns len(grid), len(grid[0])dp [[0] * columns for _ in range(rows)]dp[0][0] grid[0][0]for i in range(1, r…

All In ai,Oracle 23C没了,等来了Oracle 23ai

今年一月份的Blog介绍Oracle命名规则的时候&#xff0c;说到Oracle的命名是紧紧跟随时代浪潮的前言科技的&#xff0c;在文章的最后还大胆预测也许Oracle的下一个版本就叫25A了&#xff0c;结果Oracle根本等不及&#xff0c;把原来已经海量宣传的Oracle 23C直接改名为23ai&…

分布式与一致性协议之Raft算法(四)

Raft算法 Raft是如何解决成员变更问题的 在日常工作中&#xff0c;你可能会遇到服务器故障的情况&#xff0c;这时你需要替换集群中的服务器。如果遇到需要改变数据副本数的情况&#xff0c;则需要增加或移除集群中的服务器。总的来说&#xff0c;在日常工作中&#xff0c;集…

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验&#xff1a;搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块&#xff0c;如…

AI时代,如何让ChatGPT成为你最好的编程老师|TodayAI

ChatGPT作为生成式预训练变换器&#xff08;GPT&#xff09;系列模型的一种&#xff0c;专门设计用来理解和生成文本&#xff0c;其生成的文本能够高度模仿人类的对话方式。这种能力不仅让它在进行日常对话时表现得像极了真人&#xff0c;还使其在各种专业领域内&#xff0c;比…

TCP四次挥手分析

TCP四次挥手分析 概念过程分析为什么连接的时候是三次握手&#xff0c;关闭的时候却是四次握手&#xff1f;为什么要等待2MSL&#xff1f; 概念 四次挥手即终止TCP连接&#xff0c;就是指断开一个TCP连接时&#xff0c;需要客户端和服务端总共发送4个包以确认连接的断开。 在…

基于深度学习的3D目标检测与跟踪

目标检测和跟踪对于自动驾驶来说是至关重要和基础的任务&#xff0c;旨在从场景中识别和定位出那些预定义类别的对象。在所有形式的自动驾驶数据中&#xff0c;3D点云学习引起了越来越多的关注。目前&#xff0c;有许多用于3D目标检测的深度学习方法。然而&#xff0c;鉴于点云…

【方法】PDF如何取消“限制编辑”?

我们知道&#xff0c;PDF设置“限制编辑”可以用来保护文件&#xff0c;设置后很多功能就会被锁定&#xff0c;比如无法编辑内容&#xff0c;无法打印&#xff0c;另存文件等等&#xff0c;可以看到大多数菜单选项都是灰色状态&#xff0c;无法点击。 那如果后续想要使用锁定的…

启动盘制作

魔术师pe安装教程 我一般使用魔术师来安装windows系统 魔术师pe地址下载 解压后使用 把ios映像文件放入pe系统u盘下 开机按f1,进入bios,将usb接口拉到本电脑&#xff0c;在按f10保存&#xff0c;在按f12即可找到pe的u盘 ventoy安装教程 其他系统安装我使用ventoy ventoy地…

宇宙最强Windows下载神器IDM,还不快用 互联网下载管理器(IDM)全面评测

互联网下载管理器&#xff08;IDM&#xff09;是一款功能强大的下载工具&#xff0c;自 1999 年问世以来&#xff0c;一直以其卓越的性能和稳定性受到用户的喜爱。IDM 可以帮助用户加速下载速度&#xff0c;最高可达 5 倍&#xff0c;同时还具有断点续传、定时下载、自动分类等…

第14章 软件测试过程和管理

一、测试过程模型 &#xff08;一&#xff09;组织级测试过程 用于开发和管理组织级测试规格说明。常用的组织级测试规格说明包括组织级测试方针和组织级测试策略。 &#xff08;二&#xff09;测试管理过程 1、内容 包括测试管理和动态测试。动态测试&#xff1a;测试设计…