javaEE————文件IO(1)

宁睿  论坛元老 | 2025-3-19 08:30:55 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1038|帖子 1038|积分 3124

上期我们彻底学完多线程啦,接下来的内容暂时轻松一点,我们要学习对文件的操作;
  文件操作和IO

1,认识文件

什么是文件呢,文件分为广义的文件和狭义的文件;
狭义的文件指生存在硬盘上的文件;
广义的文件指操作系统进行资源管理的一种机制,很多的软件或者硬件资源抽象成“文件”来体现;
我们今天主要讨论狭义的文件,

我们使用计算机的时间通常管这个叫文件夹,这个这个不是专业的叫法这个是目次(directory);
里面有目次或者是文件,也可以为空,它还有一些除了内容以外的信息:

1)树形结构组织 和 目次

文件的引出带来了很大的便利,但是随着文件的内容越来越多,我们怎么管理这些文件呢,我们也不能直接把这些文件堆在一堆呀,我们就使用了树形结构来存储我们的文件,

我们看这个java地面知识点;

一个目次包含很多目次,我们找到此中一个目次,并进入到这个目次,我们还能看到很多目次,就像我们学习的多叉树一样;
2)文件路径(Path)

这么复杂的结构,那么我们是怎么准确搜索到我们要找到的文件呢,比如刚才的图片,算了我们新弄一个图片


我们在当前路径中放了一个新的图片,
"C:\cctalk\java代码容易犯错的知识点\QQ截图20240915161600.png"
我们复制文件的地址,这个就是当前图片的绝对路径,什么是绝对路径呢,就从从c盘开始,直接到当前文件的全部路径;
除此之外还有相对路径,相对路径必要描述一个基准路径,什么是基准路径呢,我们在用基准路径找一下这张图片:
基准路径:C:\cctalk
我们这时间有了基准,我们此时再去找图片只必要: 
 .\java代码容易犯错的知识点\QQ截图20240915161600.png
就能找到这个图片了,.的意思就是在当前目次,..的意思就是去该目次的父亲目次,但是我们是不可以去爷爷目次的,也就是父亲目次的父亲目次,
有了路径呢,我们就能轻松的找到我们想要的数据了;
3)知识增补

我们来聊一聊文件的种类,文件分为二进制文件文本文件
冯诺依曼,我们的祖师爷,之情定过规矩,就是全部的文件都是二进制的,计算机组成原理讲过,由于0和1搭配的组合不多,很好控制,有一些文件很特殊二进制数据刚好能够构成一个一个字符,各人还记得一个汉字占几个字节吗,说详细数量的都拉出去枪毙嗷,应该要有一个编码规则,utf8就是3个字节,utf16就为2个个字节,utf32为4个字节,还有很多其他的编码方式,文本文件呢,就是对二进制文件自行查码表,将二进制数据翻译为文本文件;
图片,视频,音乐等可执行程序都是二进制文件,而java.c,TxT纯文本,都是文本文件,像word,docx(富文本)也都是二进制文件;
还有dll是动态库,通常是文件后缀;

2,java中文件操作

下面我们就来谈一谈java中的文件操作,我们分为文件系统操作文件内容操作
文件系统操作就比如创建目次,创建文件,删除和重命名等;
文件内容操作就是对一个文件的内容进行修改了;
我们这里主要讨论的是文件系统操作;
1)File概述

java通过java.io.File来对文件(目次)进行描述,但是也存在创建了File对象但是没有对应的文件;
1> 属性

修饰符及类型属性分析static StringpathSeparator路径列表分隔符(如 : 在 Linux/macOS,; 在 Windows),用于分隔多个路径(如 PATH 环境变量)。static charpathSeparatorChar同上,但以 char 类型体现。static Stringseparator文件路径分隔符(如 / 在 Linux/macOS,\ 在 Windows),用于分隔目次层级。static charseparatorChar同上,但以 char 类型体现。 这个是啥意思呢,我刚开始学习的时间也没明确,这个是什么意思呢,为啥还要分为字符串和字符呢,我们写代码的时间都用/或者是转义\\两个斜杠,这个在不同的操作系统可能是不同的,我们为了包管跨平台的兼容性,使用pathSeparator和separator就能大大提高代码的移植性了;

  1. public class Demo {
  2.     public static void main(String[] args) {
  3.         // 输出路径列表分隔符(如 ; 或 :)
  4.         System.out.println("Path Separator: " + File.pathSeparator); // String
  5.         System.out.println("Path Separator Char: " + File.pathSeparatorChar); // char
  6.         // 输出文件路径分隔符(如 \ 或 /)
  7.         System.out.println("File Separator: " + File.separator); // String
  8.         System.out.println("File Separator Char: " + File.separatorChar); // char
  9.     }
  10. }
复制代码

属性还分了字符串和字符,字符串是为了更好的拼接,字符更底层,适合遍历;
2> 构造方法

署名分析
File(String Parent,String child )根据父目次(不是路径)+孩子文件夹路径构建一个新的File实例
File(String  pathname)根据文件路径创建一个File实例,File可以是绝对路径,也可以是相对路径
File(File parent,String child)根据父目次路径+孩子文件夹路径构建一个新的File实例













3> 方法

修饰符及返回值类型方法署名分析
StringgetParent()返回File对象的⽗⽬录⽂件路径
StringgetName()返回FIle对象的纯⽂件名称
StringgetPath()返回File对象的⽂件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象的修饰过的绝对路径















我们来试一下:
我们先来试试绝对路径——
  1.         File file = new File("C:"+ File.separator+"ctalk/java代码容易犯错的知识点/test.txt");
  2.         System.out.println(file.getParent());
  3.         System.out.println(file.getName());
  4.         System.out.println(file.getPath());
  5.         System.out.println(file.getAbsoluteFile());
  6.         System.out.println(file.getCanonicalFile());
复制代码
运行:

我们再来试试相对路径:
  1. File file = new File("./java代码容易犯错的知识点/test.txt");
  2.         System.out.println(file.getParent());
  3.         System.out.println(file.getName());
  4.         System.out.println(file.getPath());
  5.         System.out.println(file.getAbsoluteFile());
  6.         System.out.println(file.getCanonicalFile());
复制代码
 

booleanexists()判断File对象描述的⽂件是否真实 存在
booleanisDirectory()判断File对象代表的⽂件是否是⼀ 个⽬录
booleanisFile()判断File对象代表的⽂件是否是⼀ 个普通⽂件
booleancreateNewFile()根据File对象,⾃动创建⼀个空⽂ 件。乐成创建后返回true
booleandelete()根据File对象,删除该⽂件。乐成 删除后返回true
voiddeleteOnExit()根据File对象,标注文件将要被删除,删除不会立刻执行,删除动作会在JVM运行结束后执行









我们来试试:
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/test.txt");//此时test.txt是不存在的;
  2.         System.out.println(file.exists());//判断是否存在
复制代码
此时是没有这个文件的~

不存在;
我们再来创建出这个文件:
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/test.txt");
  2.         System.out.println(file.exists());
复制代码

这次存在了;
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/test.txt");
  2.         System.out.println(file.isDirectory());//判断是否为目录
  3.         System.out.println(file.isFile());//判断是否为文件
复制代码

我们创建的是文件test.txt;
再试试目次:
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点");
  2.         System.out.println(file.isDirectory());
  3.         System.out.println(file.isFile());
复制代码

ok了嗷;
我们再来试试用file创建一个文件
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/test.txt");
  2.         System.out.println(file.createNewFile());
复制代码
这个呢,就是我们给的绝对路径和相对路径中不存在的test.txt,我们会把它创建出来;
这时java知识点中就出现了对应的文件:

我们再试试两个删除操作
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/test.txt");
  2.         System.out.println(file.delete());
复制代码


删掉了;那么第二个删除操作是怎么样的,再jvm运行结束时删除怎么看到呀,我们来试试:

先创建出来,
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/test.txt");
  2.         file.deleteOnExit();
  3.         
  4.         while (true){
  5.             Thread.sleep(100);
  6.             System.out.println(111);
  7.         }
复制代码
来运行:

这时间看,主线程是在阻塞,我们看我们的test.txt文件发现是没有删除的;

我们结束代码:

这个文件就被删掉了; 
String[]list()返回File对象代表的⽬录下的全部 ⽂件名
File[]listFiles()返回File对象代表的⽬录下的全部 ⽂件,以File对象表⽰
booleanmkdir()创建File对象代表的⽬录
booleanmkdirs()创建File对象代表的⽬录,如果必 要,会创建中间⽬录
booleanrenameTo(File dest)进⾏⽂件改名,也可以视为我们平 时的剪切、粘贴操作
booleancanRead()判断⽤⼾是否对⽂件有可读权限
booleancanWrite()判断⽤⼾是否对⽂件有可写权限




















我们在这里创建一个Demo,再在Demo中创建一些文件

我们把他们列出来:
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/Demo");
  2.         String[] str = file.list();
  3.         for (String a: str){
  4.             System.out.println(a);
  5.         }
复制代码

都出来了,我们看看另一个listFiles:
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/Demo");
  2.         File[] files = file.listFiles();
  3.         for (File a:files){
  4.             System.out.println(a);
  5.         }
复制代码

这个会直接输出绝对路径;
我们再来看下两个方法:
mkdir()和mkdirs()都是创建目次的方法;
第一个方法mkdir(),必须存在父目次才气创建,不会自动创建父目次;
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2");
  2.         System.out.println(file.mkdir());
复制代码
 

创建了demo2
试试第二个方法mkdirs();
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/demo4");
  2.         System.out.println(file.mkdirs());
复制代码
 

我们看到即使我们没有demo3这一目次我们也乐成创建了,mkdirs会自动创建目次;
接下来renameTo方法,
这个方法可以重命名文件,还可以移动文件,由于本质是我们创建一个新的File来代替旧的file;

我们把这个test文件夹改名为hhhh:
 
  1. File oldfile = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/demo4/test.txt");
  2.         File newfile = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/demo4/hhhh");
  3.         oldfile.renameTo(newfile);
复制代码
 
乐成改了,我们把这个文件移动到demo3中,
  1. File oldfile = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/demo4/hhhh");
  2.         File newfile = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/hhhh");
  3.         oldfile.renameTo(newfile);
复制代码
 
 把hhhh移动过来了;
还剩两个方法一个是canRead(),另一个是canWirte();
这个就是看用户有没有读和写的权限;
  1. File file = new File("C:/cctalk/java代码容易犯错的知识点/Demo/demo2/demo3/hhhh");
  2.         System.out.println(file.canRead());
  3.         System.out.println(file.canWrite());
复制代码
 
读和写权限都有,那么我们怎么知道我们是否有读还是写的权限呢?

我们看到hhhh这里有这4个:

我们的canRead和canWrite就是这4个权限的并集,也就是说有一个有读权限canRead就有权限,write也一样;
下期带来文件内容操作;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表