Java|文件操作和IO

目录
一、存储
1.非易失性存储(non-volatile storage)
2.缓冲区(Buffer)技术
二、文件(File)
1.文件的分类
1.1普通文件和目录文件
1.2文本文件和二进制文件
2.文件是按照树形结构组织
3.文件路径
3.1绝对路径
3.2相对路径
4.一个唯一的路径并不代表对应的文件一定存在
三、Java中的File类-----java.io.File
1.构造方法
2.File的主要方法
3.新建一个普通文件
4.新建一个目录
5.删除文件/目录
6.通过重命名的方式把一个文件移动到另一个节点
7.给定起始目录,遍历这个目录下的所有文件

一、存储

硬盘存储和内存存储,硬盘存储也叫非易失性存储
1.非易失性存储(non-volatile storage)
可以再断电的情况下进行数据存储;低速存储,读写速度远低于内存
Java|文件操作和IO
文章图片

弥合速度差,针对硬盘数据的读写提出了各种各样的数据结构、算法来解决
硬盘中的数据更适合块状读取,一次性读取很多的数据,和连续读写
2.缓冲区(Buffer)技术
  • 由于磁盘存储的低速性,有了缓冲区技术,为了减少硬盘的读写频次
  • 操作系统会在内存中开辟一段空间
比如写入400字节的内存
1、写入100字节
2、写入100字节
3、写入100字节
4、写入100字节
为了减少硬盘的读写,让达到一定条件后统一写回硬盘(应用程序主动要求冲刷缓冲区,定时冲刷、定量冲刷等)
IO中进行flush是必要的操作,否则会造成数据丢失
二、文件(File)
一种抽象的概念,表示硬盘中的数据块;
狭义上讲文件是关于硬盘中数据的抽象;
变量、对象是对内存中数据的抽象;
逻辑上讲,一个文件是由两块数据组成的,文件的元数据(管理数据)和文件内容本身
文件中的数据= 管理数据+内存数据
文件系统(FileSystem):对硬盘上的数据、文件进行直接组织和管理的一个模块
1.文件的分类 1.1普通文件和目录文件
普通文件:存储普通数据,一般就是字符串
目录文件:存储了一张表,该表就是该目录文件下,所有文件名和inode的映射关系
1.2文本文件和二进制文件
普通文件,根据其保存数据的不同,划分为文本文件 和二进制文件
文本文件:保存被字符集编码的文本
二进制文件:按照标准格式保存的非被字符集编码过的文件
  • 【.txt】【 .c】【 .java】都属于文本文件
  • 【.doc】【.ppt】【.exe】【.zip】【.class】等等都属于二进制文件
2.文件是按照树形结构组织
通过路径描述结点的方式,来确定唯一一个文件
Java|文件操作和IO
文章图片

目录/文件夹也是一种特殊的文件,由管理数据和内容数据组成
管理数据:名称,属于本机用户,路径...
内容数据:文件夹下有.doc文件、.txt文件等
3.文件路径
文件路径用于定位到哪个文件,路径存在,并不代表文件一定存在
以“.”或“. .”开头的,其中“.”表示当前路径,“. .”表示当前路径的父目录(上级路径)
文件路径分为绝对路径和相对路径
  • 绝对路径——无论现在在哪个位置,绝对路径都是从起点到目标
  • 相对路径——从我当前所处位置,到目标位置,当前的位置变化了,描述的节点也跟着变化
3.1绝对路径
从一颗数的根节点触发,到达对应节点的完整路径
Java|文件操作和IO
文章图片

一个唯一的路径一定可以描述一个唯一的节点
Windows使用反斜杠作为分割符,对于路径【C:\Program Files\Java\a.txt】,如果要写到字符串中,需要先对反斜杠进行转义,程序中需要写【C:\\Program Files\\Java\\a.txt】
3.2相对路径
相对于当前所处的位置而言的路径,不是从根节点的位置出发
Java|文件操作和IO
文章图片

4.一个唯一的路径并不代表对应的文件一定存在
路径存在,并不代表文件一定存在
Java|文件操作和IO
文章图片

三、Java中的File类-----java.io.File
File对象就是对文件的管理数据的抽象
File对象创建出来并不能代表文件存在
1.构造方法
Java|文件操作和IO
文章图片

对于这个test.txt
Java|文件操作和IO
文章图片

import java.io.File; /** * @author happy */ public class Main { public static void main(String[] args) { { File file = new File("D:\\JAVA\\java1\\project\\java-ee\\test.txt"); System.out.println(file); // 对象存在 // 文件并不存在 }{ // 父结点,一般都是目录 File parent = new File("D:\\JAVA\\java1\\project\\java-ee"); File file = new File(parent, "test.txt"); System.out.println(file); }{ // 父结点,一般都是目录 File file = new File("D:\\JAVA\\java1\\project\\java-ee", "test.txt"); System.out.println(file); } } }

输出结果:
Java|文件操作和IO
文章图片

点击蓝色就可以看到test.txt文件里面的内容
2.File的主要方法
Java|文件操作和IO
文章图片

Java|文件操作和IO
文章图片

Java|文件操作和IO
文章图片
Java|文件操作和IO
文章图片

Java|文件操作和IO
文章图片


Java|文件操作和IO
文章图片

Java|文件操作和IO
文章图片


  • 示例1
package thread_safe.day5_8; import java.io.File; import java.io.IOException; /** * @author happy */ public class Main { public static void main(String[] args) throws IOException { File file = new File("D:/JAVA/java1/project/java-ee/test.txt"); // 返回此抽象路径名的绝对形式。 System.out.println(file.getAbsolutePath()); // 返回此抽象路径名的绝对路径名字符串 System.out.println(file.getCanonicalPath()); // 返回文件的长度 System.out.println(file.length()); // 返回文件的名称 System.out.println(file.getName()); // 返回父级的路径名字符串 System.out.println(file.getParent()); } }

Java|文件操作和IO
文章图片

  • 实例2
import java.io.File; import java.io.IOException; /** * @author happy */ public class Main { public static void main(String[] args) throws IOException { File file = new File("D:/JAVA/java1/project/java-ee/test.txt"); // 返回相对路径 System.out.println(file.getCanonicalPath()); // 文件是否存在 System.out.println(file.exists()); // 返回该路径的文件是否是目录 System.out.println(file.isDirectory()); // 返回该路径的文件是否是普通文件 System.out.println(file.isFile()); System.out.println(file.canExecute()); System.out.println(file.canRead()); System.out.println(file.canWrite()); } }

Java|文件操作和IO
文章图片

3.新建一个普通文件
前提是路径对应的文件父目录存在,文件不存在
Java|文件操作和IO
文章图片

import java.io.File; import java.io.IOException; /** * @author happy */ public class Main5 { public static void main(String[] args) throws IOException { // 如果当前目录本身不存在,所以无法创建,以异常的形式体现 File file = new File("D:/JAVA/java1/project/java-ee/hello.txt"); // 刚开始没有该文件,返回false System.out.println(file.exists()); file.createNewFile(); // 创建完成之后返回true System.out.println(file.exists()); } }

Java|文件操作和IO
文章图片

4.新建一个目录
前提是路径对应的文件父目录存在,文件不存在,要想连同不存在的父目录一起创建,使用mkdirs()方法
Java|文件操作和IO
文章图片

import java.io.File; /** * @author happy */ public class Main6 { public static void main(String[] args) { // 一级一级目录创建 //File f1 = new File("../a"); //f1.mkdir(); //File f2 = new File("../a/b"); //f2.mkdir(); //File f3 = new File("../a/b/c"); //f3.mkdir(); //File file = new File("../a/b/c/d"); //System.out.println(file.mkdir()); File file = new File("../a/b/c/d"); System.out.println(file.mkdirs()); } }

5.删除文件/目录
只是标记要删除,真正删除的时候是在JVM进程退出的时候
Windows上的回收站只是一个特殊的目录,回收站的删除其实不是删除,只是把文件移动到对应的目录
普通文件正常删除;目录文件要求目录必须是空目录Java|文件操作和IO
文章图片

import java.io.File; /** * @author happy */ public class Main7 { public static void main(String[] args) { File file = new File("../hello.txt"); System.out.println(file.delete()); } }

6.通过重命名的方式把一个文件移动到另一个节点
Java|文件操作和IO
文章图片

package thread_safe.day5_8; import java.io.File; /** * @author happy */ public class Main8 { public static void main(String[] args) { // 把a目录下的test.txt移动到b目录下 File src = https://www.it610.com/article/new File("../java-ee/a/test.txt"); File dest = new File("../java-ee/b/test.txt"); System.out.println(src.renameTo(dest)); } }

Java|文件操作和IO
文章图片
Java|文件操作和IO
文章图片

7.给定起始目录,遍历这个目录下的所有文件
只有b目录下才有test.txt文件
Java|文件操作和IO
文章图片

import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author happy */ public class FileDemo { static List all_file = new ArrayList<>(); private static void traversal(File dir) throws IOException { File[] files = dir.listFiles(); // 该目录的所有孩子 if (files == null) { return; }for (File file : files) { if (file.isDirectory()) { traversal(file); } else if (file.isFile()) { if (file.getName().endsWith(".txt")) { //if (file.getName().equals("test.class")) { all_file.add(file.getCanonicalPath()); } } } }public static void main(String[] args) throws IOException { File startDir = new File("D:/JAVA/java1/project/java-ee"); traversal(startDir); for (String path : all_file) { System.out.println(path); } } }

【Java|文件操作和IO】

    推荐阅读