一、认识文件
平时说的文件一般都是指存储在硬盘上的普通文件 形如txt,jpg,mp4,rar等这些文件都可以认为是普通文件.
它们都是在硬盘上存储的
在计算机中,文件可能是一个广义的概念.就不只是包含普通文件,还可以包含目录(把目录称为目录文件)
在操作系统中,还会使用文件来描述一些其它的硬件设备或者软件资源。
其实站在操作系统的角度上来看,所谓的文件,其实是一个非常广义的概念。 不仅仅指的是我们日常生活中所说的这些普通文件,也包含目录,还包含一些软硬件资源设备后面讲网络编程的时候,会讲到一个很重要的设备“网卡”。
网卡,是一个硬件设备。但是在操作系统中就把 网卡 这样的硬件设备也给抽象成了一个文件。
这样的操作,会给我们进行网络编程带来很大便利。
我们要想通过网卡来收数据,直接按照 读文件代码 去写 就可以了。
想通过网卡来发数据,那就按照 写文件代码 去写就行了
这样做带来的好处:简化开发。
通过这种文件的操作,来完成操作网卡的过程。
除此之外,还有显示器,键盘,这都是硬件设备吧。
操作系统也是把这些设备视为文件。
想从键盘读取数据,其实也是通过类似读文件的方式来进行的。
想往显示器上写一个数据,也是通过类似写文件的方式来进行的。
因此,操作系统谈到的文件,其实是一个更加广泛的概念。它会涉及到各个方面的情况。
当前我们需要讨论的文件,主要还是针对普通文件来讨论的。
后面去学习一些其他的硬件设备对应的文件,其实也是通过类似的代码来实现操作。
因此,我们虽然讨论的是针对普通文件为例来去演示,但实际上这里的一些代码,和后需用到的一些代码,尤其是网络编程的代码,是非常具有共性的。
1.1、普通文件 与 机械硬盘
普通文件是保存在硬盘上的
机械硬盘一旦上电,里面的盘片就会高速运转
例如我这个硬盘是7200转/m,磁头就再盘片上找到对应的数据,受限于机械硬盘的硬件结构,盘片转速越高,读写速度就越快,但是因为工艺的限制,盘片的转速也不可能无限高,机械硬盘的读写速度,已经有10年停滞未前.机械硬盘都是往大容量的方向发展
这里的这个读写速度就比内存读写慢很多(3-4)数量级
后面为了解决这个问题,就有了固态硬盘(SSD)。 固态硬盘的硬件结构 和 机械硬盘 截然不同。 固态硬盘就是一个大号的U盘
U盘:里面可以存储数据,但是又不需要盘片这些东西。主要是 flash 芯片(闪存),通过这个东西来进行存储数据,而且能获取到更高速率的读写。
所以,固态硬盘的读写速度要比机械硬盘高很多。【高好几倍】
现在最好的固态硬盘,读写速度已经接近十几年前的内存水平了。
二、文件的分类
站在程序员的角度,主要把文件分成两类:
1、文本文件:里面存储的是字符
2、二进制文件:里面存储的是字节
针对这两种文件,在编程的时候会存在差异有的人可能会有疑问:字符不也是字节构成的吗?
是的,确实如此。文本文件本质上也是存字节的。
但是文本文件中,相邻的字节在一起正好能构成一个个的字符。
所以,我们所说的存储单位是 字符,其实意思就是:相邻的这些字节之间 是存在关联关系的,不是毫不相干的!
而二进制文件里面存储的字节,相互之间是完全没有关系。
2.1、如何进行文件种类的判断?
如何判断一个文件是二进制文件还是文本文件
就是 把一个文件直接用记事本打开,如果是乱码就是 二进制文件,如果不是乱码就是文本文件
2.2、文件目录
计算机里,保存管理文件,是通过 操作系统 中的“文件系统” 这样的模块来负责的。
在文件系统中,一般是通过“树形”结构来组织硬盘上的目录和文件的。【N叉树】
也就是说普通文件,一定是树的叶子结点。
目录文件,就可以看作是一个子树,也就是非叶子节点。
2.2.3、如何去描述一个具体的文件(路径)
在操作系统中,就通过“路径” 这样的概念,来描述一个具体 文件/目录 的位置。
2.2.3.1、绝对路径
以盘符开头的。【以 C、D、E、F等等,盘名开头的】
可以根据这样的路径去找到相应的文件
2.2.3.1、相对路径
相对路径∶以.(点)或者…(点点)开头的,其中.(点)表示当前路径, …(点点)表示当前路径的父目录(上级路径)
谈到相对路径,必须要现有一个基准目录 相对路径就是从基准目录出发,按照一个啥样的路径找到的对应文件
注意!即使是找到同一个文件,如果基准路径不同,此时的相对路径也就不同
理解相对路径
这个列子来源于细节狂魔:https://blog.csdn.net/DarkAndGrey/article/details/124010533?spm=1001.2014.3001.5502
三、java中的文件操作
Java中操作文件,主要是包含两类操作
1、文件系统相关的操作
2、文件内容相关的操作
虽然 Java中的文件操作 和 C 语言中的操作,差别还是蛮大的。
但是基本的思路是一样的。
3.1、文件系统相关的操作
文件系统相关的操作:指的是通过“文件资源管理器” 能够完成的一些功能
它具有的功能
1、列出目录中有哪些文件
2、创建文件(直接右键点击菜单创建,就可以创建了)
3、创建 目录/文件夹
4、删除文件
5、重命名文件
…
这些都是文件资源管理器所能够完成的功能。
简单来说 文件资源管理器 能做什么,我们的文件系统相关操作的代码就能做什么。
在Java中提供了一个 File 类,通过这个类来完成上述操作。
首先,这个File类就描述了一个文件/目录。
基于这个对象就可以实现上面的功能。
属性
构造方法
File 的构造方法,能够传入一个路径,来指定一个文件。
这个路径可以是绝对路径,也可以是相对路径。
file的一些常用的方法
通过绝对路径和相对路径来定位一个文件
此时通过相对路径来定位一个文件,通过代码是看不出来基准路径的,这和程序运行的方式是有区别的
三种运行程序的方式:
1、通过命令行来运行
这个看一下:细节狂魔:https://blog.csdn.net/DarkAndGrey/article/details/124010533?spm=1001.2014.3001.5502
2、通过IDEA来运行程序,此时基准目录就是当前Java 项目所在目录
3、后面,我们还会学到,把一个java代码,打成war包,放到Tomcat 上运行。
这种情况下,基准路径就是Tomcat 的 bin目录上【这里了解知道有这个东西】
需要注意的是一旦路径指定错了,很容易出现找不到文件的情况!! !
3.2、一些方法的使用
getParent、getName、getPath、getAbsolutePath、getCanonicalPath
File file = new File("d:/file.txt");
//获取到文件父目录
System.out.println(file.getParent());
//获取文件名称
System.out.println(file.getName());
//获取文件路径
System.out.println(file.getPath());
//获取文件的绝对路径
System.out.println(file.getAbsoluteFile());
//获取文件修饰过的绝对路径
System.out.println(file.getCanonicalFile());
System.out.println("=====================");
File file1 = new File("./file.txt");
//获取到文件父目录
System.out.println(file1.getParent());
//获取文件名称
System.out.println(file1.getName());
//获取文件路径
System.out.println(file1.getPath());
//获取文件的绝对路径
System.out.println(file1.getAbsoluteFile());
//获取文件修饰过的绝对路径
System.out.println(file1.getCanonicalFile());
}
此时运行结果输出的是“\”,我们在描述文件的时候使用的是“/”
exists、isDirectory、isFile
public static void main(String[] args) {
File file = new File("d:/test.txt");
//判断File 对象描述的文件是否真实存在
System.out.println(file.exists());
//判断File 对象代表的文件是否是一个目录
System.out.println(file.isDirectory());
//判断File 对象代表的文件是否是一个普通文件
System.out.println(file.isFile());
}
}
public static void main(String[] args) {
File file = new File("./test.txt");
//判断File 对象描述的文件是否真实存在
System.out.println(file.exists());
//判断File 对象代表的文件是否是一个目录
System.out.println(file.isDirectory());
//判断File 对象代表的文件是否是一个普通文件
System.out.println(file.isFile());
}
createNewFile
public static void main(String[] args) throws IOException {
File file = new File("./test..txt");
//判断文件是否存在
System.out.println(file.exists());
//创建一个文件
file.createNewFile();
//判断文件是否存在
System.out.println(file.exists());
}
delete
public static void main(String[] args) throws IOException {
File file = new File("./test..txt");
//判断文件是否存在
System.out.println(file.exists());
//创建一个文件
file.createNewFile();
//判断文件是否存在
System.out.println(file.exists());
//判断文件是否被删除
Boolean b = file.delete();
System.out.println(b);
}
mkdir、mkdirs
list 、listFiles
这两个函数就是返回值不同
只不过listFiles是相对路径的方式进行打印。list则是一种简化路径的输出方式。
renameTo
public static void main(String[] args) {
File file = new File("./文档");
File file1 = new File("./哈哈");
file.renameTo(file1);
}