【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.mzph.cn/news/637400.shtml

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

相关文章

L1-067 洛希极限(Java)

科幻电影《流浪地球》中一个重要的情节是地球距离木星太近时,大气开始被木星吸走,而随着不断接近地木“刚体洛希极限”,地球面临被彻底撕碎的危险。但实际上,这个计算是错误的。 洛希极限(Roche limit)是一…

【SpringCloud】微服务框架后端部署详细过程记录20240119

前言:前两天公司接到客户提供的一个微服务框架,导师让我在本地部署验证一下该框架的可用性,借此机会记录一下微服务项目的一个基本部署流程,仅供学习参考,如有不足还请指正! 文件结构 提供的压缩文件共包含…

IDEA在重启springboot项目时没有自动重新build

IDEA在重启springboot项目时没有自动重新build 问题描述 当项目里面某些依赖或者插件更新了,target的class文件没有找到,导致不是我们需要的效果。 只能手动的清理target文件,麻烦得很 , 单体项目还好说,一次清理就…

7、机器学习中的数据泄露(Data Leakage)

找到并修复这个以微妙的方式破坏你的模型的问题。 数据泄露这个概念在kaggle算法竞赛中经常被提到,这个不同于我们通常说的生活中隐私数据暴露,而是在竞赛中经常出现某支队伍靠着对极个别feature的充分利用,立即将对手超越,成功霸占冠军位置,而且与第二名的差距远超第二名…

一键搭建你的知识库

效果 说明 由于安装包安装需要glibc>2.7 我就不尝试了 因为glib升级是一个繁琐的过程 没有升级的意义 只是为了体验知识库 没必要浪费时间 1.1docker compose部署trilium 1.1.创建目录 mkdir -p /opt/triliumcd /opt/trilium 1.2.编写docker-comppose.yml文件 vim dock…

【51单片机】矩阵按键

0、前言 参考&#xff1a;普中 51 单片机开发攻略 1、硬件 2、软件 main.c #include <reg52.h> #include <intrins.h> #include "delayms.h"typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define GPIO_KEY P1 #d…

统计学-R语言-7.1

文章目录 前言假设检验的原理假设检验的原理提出假设做出决策表述结果效应量 总体均值的检验总体均值的检验(一个总体均值的检验) 练习 前言 本章主题是假设检验(hypothesis testing)。与参数估计一样&#xff0c;假设检验也是对总体参数感兴趣&#xff0c;如比例、比例间的差…

3.C语言——函数

函数 1.什么是函数2.函数的分类1.库函数2.自定义函数 3.函数的参数1.实际参数&#xff08;实参&#xff09;2.形式参数&#xff08;形参&#xff09; 4.函数的声明1.同一个文件的函数声明2.多文件的函数声明 5.函数的调用6.函数的嵌套调用和链式访问1.嵌套调用2.链式访问 7.函数…

基于springboot+vue的校园周边美食探索及分享平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

【K8S 云原生】K8S的对外服务—ingress

目录 一、K8S的Service 1、Service的作用 2、Service类型&#xff1a; 二、ingress 1、ingress的组成&#xff1a; 2、ingress资源的定义项&#xff1a; 三、nginx-ingress-controller暴露服务端的方式 1、DeploymentLoadBalancer模式&#xff1a; 1、工作流程图&…

4496 蓝桥杯 求函数零点 简单

4496 蓝桥杯 求函数零点 简单 //C风格解法1&#xff0c;通过率100% #include <bits/stdc.h> // int a, b; 一定会自动初始化为 0int main(){int a 2, b 3; // 定义a&#xff0c;b&#xff0c;不会自动初始化&#xff0c;最好自己定义时初始化// windows环境下a值固定&…

图解最详细的项目研发全流程及各阶段核心问题表

阶段 事项 核心需要关注的问题 一、需求调研 1、客户需求 - 该需求是否符合客户现有的标准和业务流程&#xff1f; - 该需求是否是客户的核心需求&#xff0c;是否具有可行性和商业价值&#xff1f; - 客户使用场景和需求的完整性如何&#xff1f; 2、内部需求 - 内部需…

手把手教你购买阿里云服务器以及Ubuntu环境下宝塔搭建网站

阿里云服务器Ubuntu通过宝塔搭建网站详细教程 前言一、阿里云服务器的购买二、进入控制面板2.1 修改密码2.2 开放端口号 三、 测试服务器是否可以连接四、 安装nginx搭建网站(选做)五、安装宝塔5.1 登录宝塔官网5.2 卸载预装的mysql和nginx5.3 安装宝塔5.4 访问宝塔控制台5.5 修…

二叉树基础oj题目

二叉树基础oj题目及思路总结 前文中&#xff0c;介绍了二叉树的基本概念及基础操作&#xff0c;进一步对于二叉树的递归遍历及子问题的处理思想有了一定的了解。本文将带来几道二叉树经典的oj题目。 目录 二叉树基础oj题目 对称二叉树平衡二叉树二叉树的层序遍历 二叉树基…

Hadoop3完全分布式搭建

一、第一台的操作搭建 修改主机名 使用hostnamectl set-hostname 修改当前主机名 关闭防火墙和SELlinux 1&#xff0c;使用 systemctl stop firewalld systemctl disable firewalld 关闭防火墙 2&#xff0c;使用 vim /etc/selinux/config 修改为 SELINUXdisabled 使用N…

Vagrant创建Oracle RAC环境示例

利用Vagrant安装Oracle RAC&#xff08;默认为non-CDB模式&#xff09;&#xff0c;生成2台虚机&#xff0c;耗时约1小时。 node1: -----------------------------------------------------------------node1: INFO: 2024-01-11 18:25:54: Make create database commandnode1: …

【C语言深度剖析——第三节(关键字3)】《C语言深度解剖》+蛋哥分析+个人理解

本文由睡觉待开机原创&#xff0c;未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 目录 1.基本数据类型2.sizeof关键字 前言&#xff1a; 本期我们继续探讨关于C深度解剖这本书相关内容&#…

5 python快速上手

数据类型&#xff08;上&#xff09; 1.整型1.1 定义1.2 独有功能1.3 公共功能1.4 转换1.5 其他1.5.1 长整型1.5.2 地板除 2. 布尔类型2.1 定义2.2 独有功能2.3 公共功能2.4 转换2.5 其他2.5.1 做条件自动转换 3.字符串类型3.1 定义3.2 独有功能&#xff08;18/48&#xff09;练…

MySQL锁机制与优化实践

数据库乐观和悲观锁 乐观锁 比如在数据库中设置一个版本字段&#xff0c;每操作一次&#xff0c;都会将这行对应的版本号1&#xff0c;这样下次更新都会拿到最新的版本号更新&#xff0c;如果一个事务拿到了版本号但是更新前其他人已经将版本号升级了&#xff0c;那么当前事务…

(3)【Python数据分析进阶】Machine-Learning模型与算法应用-线性回归与逻辑回归

目录 一、Linear Regression线性回归应用 应用案例&#xff08;一&#xff09;——自定义数据&#xff08;Custom data&#xff09; 1、下载安装sklearn库 2、导入库函数 3、加载数据集 4、创建线性回归对象 5、模型训练 6、预测结果 7、绘制模型图像 8、应用模型进行…