【JavaEE】文件操作与IO

作者主页:paper jie_博客

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《MySQL》《C语言》《javaSE》《数据结构》等

内容分享:本期将会分享文件操作与IO的集合类芝士

目录

认识文件

文件的结构组织和目录

文件路径

 二进制文件与文本文件

 Java中操作文件

File概述

 属性

构造方法

方法

文件的读写 - 数据流

InputStre

FileInputStream

OutputStream

FIleOutputStream

 Scanner

小程序练习

扫描指定目录,找到指定文件

文件复制

扫描指定目录,通过文件内容来寻找指定文件 


认识文件

针对硬盘这种持久化存储的IO存储设备,当我们想要进行数据保存的时候,往往不是一个整体,而是独立成一个一个的单位来存储.这个独立的单位被抽象成文件的概念.文件除了有数据内容外,还有一部分信息,比如:文件名,文件类型,文件大小等并不作为文件的数据而存在,这部分信息称为文件的元信息.

文件的结构组织和目录

随着文件数量的增加,文件的系统管理的需要日益迫切.而我们的操作系统的一个板块就有一个专门管理文件 - 文件系统. 有它将硬件细节封装起来,提供统一的API供我们使用.而此处的文件系统就是按照树型结构来组织文件的.这就是我们平时锁的文件夹或者目录的概念.

文件路径

如何在文件系统中定位到我们的一个唯一的文件就需要使用到我们的路径.路径我们可以从树的角度出发,树的每一个节点都可以被一条从根开始,一直到达叶子节点的路径锁描述.这就是一个文件的绝对路径.

除了可以从根结点开始描述路径我们也可以从任意结点出发,进行路径的描述,而这种描述方式就是相对路径.就是对于当前所在结点的一条路径.

这里:
. 代表当前路径

.. 代表当前路径上的前一个路径

 

 二进制文件与文本文件

文件中,根据其保存的数据不同,也经常被分为不同的类型.我们一般分为文本文件和二进制文件,分别指保存字符集编码的文本和按照标准格式的非被字符集编码过的文件.

这里有一个简单区别他们的方式: 看的懂的文件就是文本文件,看不懂的文件就是二进制文件.

在Windows操作系统上,会按照文件名中的后缀来确定文件类型以及该文件的的默认打开程序.但是这个习俗并不通用.在一些其他系统上比如OSX,Unix,Linux等就没有这种的习惯,一般不会对文件类型做这么精确的分类.

文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地可以认为有可读,可写,可执行权限.

 Java中操作文件

在Java中通过java.io.File类来对一个文件和目录就进行描述.注意,有File对象,并不代表真实存在该文件.

File概述

 属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String
类型的表⽰
static charpathSeparator依赖于系统的路径分隔符,char 类
型的表⽰

构造方法

签名说明
File(File parent, String child)根据⽗⽬录 + 孩⼦⽂件路径,创建⼀个新的 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对象代表的文件是否是一个目录
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()判断用户是否对文件有可写权限

实例一:

public class IODemo1 {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 IODemo2 {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(file.createNewFile()); System.out.println(file.delete());}
}

实例三:

public class IODemo3 {public static void main(String[] args) throws InterruptedException {File file = new File("./test.txt");file.deleteOnExit();Thread.sleep(5000);}
}

实例四:

public class IODemo {public static void main(String[] args) {File file = new File(".");String[] str = file.list();System.out.println(Arrays.toString(str));File[] files = file.listFiles();System.out.println(Arrays.toString(files));}
}

实例五:

public class IODemo4 {public static void main(String[] args) {File file = new File("./test.txt");File file2 = new File("./test2.txt");
//        file.mkdir();
//        file.mkdirs();file.renameTo(file2);}
}

文件的读写 - 数据流

InputStre

修饰符及返回值类型⽅法签名说明
intread()读取⼀个字节的数据,返回-1代表
已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b
中,返回实际读到的数量;-1 代表
以及读完了
intread(byte[] b,int off, int len)最多读取 len - off 字节的数据到 b 
中,放在从 off 开始,返回实际读
到的数量;-1 代表以及读完了
voidclose()关闭字节流 

InputStream只是一个抽象类,要使用还需要具体的实现类.关于InputStream的实现类有很多,基本可以认为不同的输入设备都可以对应一个InputStream类,我们现在只关心从文件中读取,所以使用FileInputStream.

FileInputStream

签名说明
FileInputStream(File file)利⽤ File 构造⽂件输⼊流
FileInputStream(String name)利⽤⽂件路径构造⽂件输⼊流
public class IODemo5 {public static void main(String[] args) {try(InputStream inputStream = new FileInputStream("test2.txt")) {while(true) {//read()/*int n = inputStream.read();if(n == -1) {return;}System.out.printf("%c", n);*///read(byte[])byte[] buffer = new byte[1024];int n = inputStream.read(buffer);if(n == -1) {return;}System.out.println(Arrays.toString(buffer));}} catch (IOException e) {throw new RuntimeException(e);}}
}

OutputStream

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

OutputStream同样是一个抽象类,要使用还需要具体的实现类.我们现在还是只关心写入文件中,所以使用FileoutputStream

FIleOutputStream

实例:

public class IODemo6 {public static void main(String[] args) {try(OutputStream outputStream = new FileOutputStream("test2.txt")) {byte[] buffer = new byte[]{12,65,76,78,90,89};outputStream.write(buffer);} catch (IOException e) {throw new RuntimeException(e);}}
}

 Scanner

Scanner这个类也可以帮助我们进行字符读取

实例:

public class IODemo7 {public static void main(String[] args) {try(InputStream inputStream = new FileInputStream("test2.txt")) {Scanner scanner = new Scanner(inputStream);while(scanner.hasNext()) {String s = scanner.next();System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}

小程序练习

扫描指定目录,找到指定文件路径

import java.io.File;
import java.util.Scanner;
public class IODemo1 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你要扫描的目录: ");String rootPath = scanner.next();System.out.println("请输入你要查找的文件: ");String fileName = scanner.next();File file = new File(rootPath);if(!file.isDirectory()) {System.out.println("输入的目录不合法");return;}scanDir(file, fileName);}private static void scanDir(File file, String fileName) {File[] files = file.listFiles();if(files == null) {return;}for(File f : files) {System.out.println("遍历到: " + f.getAbsolutePath());//如果是普通文件if(f.isFile()) {if(fileName.equals(f.getName())) {System.out.println("需要查找的文件路径: " + f.getAbsolutePath());}//如果是子目录}else if(f.isDirectory()) {scanDir(f, fileName);}else {;}}}
}

文件复制

import java.io.*;
import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: sun杰* Date: 2024-01-19* Time: 15:43*/
public class IODemo3 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入源文件");String srcPath = scanner.next();File srcfile = new File(srcPath);if(!srcfile.isFile()) {System.out.println("你输入的路径不合法");return;}System.out.println("请输入目标文件");String destPath = scanner.next();File destfile = new File(destPath);if(!destfile.getParentFile().isDirectory()) {System.out.println("你输入的路径不合法");return;}try(InputStream inputStream = new FileInputStream(srcfile);OutputStream outputStream = new FileOutputStream(destfile)) {while(true) {//将源文件的内容读取到Buffer数组中byte[] buffer = new byte[1024];int n = inputStream.read(buffer);if(n == -1) {break;}//将读到的内容写到目标文件中outputStream.write(buffer, 0 , n);}} catch (IOException e) {throw new RuntimeException(e);}}
}

扫描指定目录,通过文件内容来寻找指定文件 

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
import java.util.zip.InflaterOutputStream;/*** Created with IntelliJ IDEA.* Description:* User: sun杰* Date: 2024-01-19* Time: 16:08*/
public class IODemo4 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你要扫描的目录: ");String fileName = scanner.next();System.out.println("请输入需要查找的词");String word = scanner.next();File rootFile = new File(fileName);if(!rootFile.isDirectory()) {System.out.println("你输入的路径不合法");return;}scanDir(rootFile, word);}public static void scanDir(File rootFile, String word) {File[] files = rootFile.listFiles();if(files == null) {return;}for(File f : files) {if(f.isFile()) {searcewordFile(f, word);}else if(f.isDirectory()) {scanDir(f, word);}else {;}}}private static void searcewordFile(File f, String word) {try(InputStream inputStream = new FileInputStream(f)) {StringBuilder stringBuilder = new StringBuilder();while(true) {byte[] buffer = new byte[1024];int n = inputStream.read(buffer);if(n == -1) {break;}String s = new String(buffer, 0, n);stringBuilder.append(s);}if(stringBuilder.indexOf(word) == -1) {return;}System.out.println("找到了,路径为: " + f.getAbsolutePath());} catch (IOException e) {throw new RuntimeException(e);}}
}

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

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

相关文章

【Oracle】收集Oracle数据库内存相关的信息

文章目录 【Oracle】收集Oracle数据库内存相关的信息收集Oracle数据库内存命令例各命令的解释输出结果例参考 【声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 【Oracle】收集Oracle数据库内存相关的信息 …

详细版Git的下载安装与配置(Windows)

一、git的下载 Git是一个非常好用的版本控制工具。下载地址如下:Git - Downloads。建议使用国内浏览器下载,因为不用翻墙,速度快。 当你用浏览器去访问上面的地址后,下载页面会自动识别你的电脑系统,如下 点击&#…

鸿蒙开发环境配置-Windows

背景 入局鸿蒙开发,发现在 Windows 下面配置安装相关环境并没有像 Mac 一样简单,过程中遇到了一些问题记录一下。 Devceo Studio 下载安装 目前鸿蒙的 IDE 最新版是 4.0,通过这个连接可以下载,鸿蒙4.0下载连接。选择符合我们电…

73.网游逆向分析与插件开发-背包的获取-物品数据的初步数据分析

内容参考于:易道云信息技术研究院VIP课 上一个内容:72.网游逆向分析与插件开发-背包的获取-项目需求与需求拆解-CSDN博客 然后首先找切入点: 通过药物来当切入点,药物比较好使用,然后鼠标放到药物上它有名字、种类、…

Ubuntu20.4 Mono C# gtk 编程习练笔记(三)

Mono对gtk做了很努力的封装,即便如此仍然与System.Windows.Form中的控件操作方法有许多差异,这是gtk本身特性或称为特色决定的。下面是gtk常用控件在Mono C#中的一些用法。 Button控件 在工具箱中该控件的clicked信号双击后自动生成回调函数prototype&…

力扣343. 整数拆分(动态规划)

Problem: 343. 整数拆分 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该题目可以抽象成动态规划中的爬楼梯模型,将整数的拆分类比为上台阶: 1.每个阶段可以从整数中划分出1、2、…k的一个整数 2.int dp[n 1] dp[i]表示为i的整数划分的最大…

DAY14--learning English

一、积累 1.strap The strap was a beautiful addition. 那条好看皮带是个挺不错的配件 2.suitcase Besides two suitcase im taking three box with me. 除了两个手提包之外,我还带着三个箱子. 3.elaborate 雅思口语回答问题的方法 REE-(Respond,Elaborate,Exa…

《Aspect-Sentiment-Multiple-Opinion Triplet Extraction》论文阅读

文章目录 文章介绍文章模型encoder部分ATE任务TOWE任务ATSA任务 番外 文章地址: https://arxiv.org/abs/2110.07303v1 文章介绍 目前的关于ASTE三元组提取的方面级情感分析论文大多关注于简单的句式,比如一个方面实体仅有一个意见词加以修饰&#xff0c…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 1月21日,星期日

每天一分钟,知晓天下事! 2024年1月21日 星期日 农历腊月十一 1、 寒潮预警升级为黄色!内蒙古、浙江、广东等10省区局地降温超12℃。 2、 八部门:到2025年,全国居民健康素养水平不低于25%。 3、 31省份2023年人均收入…

【MongoDB】下载安装、指令操作

目录 1.下载安装 2.指令 2.1.基础操作指令 2.2.增加 2.3.查询 2.4.修改 2.5.删除 前言: 关于MongoDB的核心概念请移步: 【文档数据库】ES和MongoDB的对比-CSDN博客 1.下载安装 本文以安装Windows版本的mongodb为例,Linux版本的其实…

[C#]winform部署官方yolov8-rtdetr目标检测的onnx模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 RTDETR,全称“Real-Time Detection with Transformer for Object Tracking and Detection”,是一种基于Transformer结构的实时目标检测和跟踪算法。它在目标检测和跟踪领域…

为了Atcoder系列复习C++语法

很久之前学过忘了 为了打比赛重新复习 每打一次就更一次 含日语内容 B - 1.01.出力とコメント 1.cout << 2525 << endl; 可以没有endl 结尾. endl作用是换行 2.整除问题 int情况下1/2无法变成0.5 所以1/2应该放在后面 100 * (100 1) / 2 3.f…