Java_IO(class File)
- Java的IO流这部分,从四月二十七号到三十号,总共学了三天。三天下来IO流当面的代码写了也有几千行,这里做一下详细的总结。总结按照文件类和流两部分分为两篇文章,这是第一篇。
- 我所学到的JavaIO流方面的知识主要是皓铭学长给我推荐的网课和教材中的知识,偏重的中心和实际开发中的中心应该还是有一定的差异。
我所学到的JavaIO流中的知识点分以下几个大部分
- File(文件)类
- 文件字节流和文件字符流
- 缓冲流
- 对象流
- 随机读写流
- 打印流
File 类
概述
- File类将文件、文件夹(目录)、路径三部分封装,通过这个类的对象可以获得文件本身的一些信息,比如文件是否存在、所在的目录、读写权限、文件的长度等。
- 文件类对象只负责将数据封装,并不涉及到对文件的读写操作。
文件的路径
- 路径的表示法分为两类,分别是绝对路径和相对路径
- 绝对路径
- 在系统中具有唯一性
- 表示出来是从盘符到文件或目录名的一整个路径
- 相对路径
- 表示路径的相对关系
- 创建文件时如果采用相对路径的创建方法,那么默认新文件创建在当前工程所在的目录,或者当前程序所在的目录下
构造器
- File的构造器并不关心文件是否存在,文件是否存在由File的exist()实例方法负责判断。
- 构造器总共有三类:
- File (String filename);
- File (String directoryPath, String filename);
- File (File f, String filaname);
- 这三种构造器中,第二种更灵活,但是三种都比较常用。第一种构造器中的filename可以是目录也可是文件,而第二种的directoryPath和第三种的f必须是目录。
- Windows系统不区分大小写,而Linux系统区分,这点要注意。
分隔符
- 文件类在建立的时候构造器中路径存在中分隔符,分别是路径分隔符和名称分隔符
分隔符类型 | File中对应的常量 | Windows系统下 | Linux系统下 |
---|---|---|---|
名称分隔符 | File.pathSeparator | \ | / |
路径分隔符 | File.separator | ; | : |
* 在编程中用File中的变量代替具体的符号可以体现系统无关性,但是在上课的试验中发现,在windows系统下用”/”可以代替”\”,但是不建议这样做。
常用方法总结
- 文件属性:
方法 | 功能 | 备注 |
---|---|---|
public String getName() | 获取文件或文件夹的名字 | 这是一个字符串功能,和文件本身的性质无关 |
public boolean exist() | 判断文件是否存在 | |
public long length() | 获取文件的长度 | 单位是字节数,文件的长度即文件的容量 |
public String getAbsolutePath() | 获取文件的绝对路径 | |
public String getParent() | 获取文件的父目录 | 顶层目录(盘符)下返回null |
public boolean isFile() | 判断文件是否是一个文件 | |
public boolean isDirectory() | 判断一个文件是否是目录 | 和上一个方法返回值相反 |
public boolean canRead() | 判断文件是否可读 | |
public boolean canWrite() | 判断文件是否可写 | 系统文件只可读不可写 |
public boolean isHidden() | 判断文件是否为隐藏文件 |
* 文件相关方法
方法 | 功能 | 备注 |
---|---|---|
public boolean creatNewFile() | 创建新文件 | 这个方法会抛出IOExecption |
public boolean delete() | 删除当前文件 | 删除文件不可逆,直接从硬盘上移除 也可以删除文件夹,但只能删除空文件夹 删除非空文件夹需要递归(演示代码在下边给出) |
- 目录相关方法
方法 | 功能 | 备注 |
---|---|---|
public boolean mkdir() | 创建一个目录 | 如果目录已存在不会重新创建,同时返回false |
public boolean mkdirs() | 创建目录(一层或多层) | 和上一个相比这个更常用 |
public String[] list() | 返回目录下全部文件和子目录的名字 | 无视文件或文件夹是否隐藏 |
public File[] listFiles() | 用File对象形式返回目录下所有文件 | 这个更常用 |
public String[] list(FileFilter obj) | 按照过滤器obj的规定返回目录下全部文件和子目录的名字 | |
public File[] listFiles(FileFilter obj) | 按照过滤器obj的规定用File对象形式返回目录下所有文件 |
过滤器
- 使用过滤器用于public String[] list(FileFilter obj)、public File[] listFiles(FileFilter obj)这两种方法中
- 在使用过滤器时,要向上述两种方法传递一个实现了FilenameFilter接口的对象,其中的FileFilter obj就是过滤器的对象
- 实现FileFilter接口的对象必须实现一个方法public boolean accept(File pathname),这个方法用于测定指定的抽象路径名是否应包含在某个路径列表,也就是说,当它的返回值为true,上述两种方法的返回之中就包含accept()参数中的pathname文件。只有文件符合条件,过滤器才会让文件加入到上述两种方法的返回值中。
部分功能实例代码
1. 递归实现删除非空文件夹
import java.io.File;
public class deleteList {
private long fileValue;
public static void main(String[] args) {
new deleteList().deleteUnemptyDirectory();
}
private void deleteUnemptyDirectory() {
long startTime = System.currentTimeMillis();
File file = new File("d:\\javatest");
if (file.exists() == true) {
System.out.println("源目录存在并已定位:\n程序开始运行");
this.fileValue = 0;
} else {
System.out.println("源文件不存在,请创建文件后重试");
System.exit(0);
}
this.deleteProcess(file);
String print = file.exists() == true ? "\n文件删除失败" : "\n文件删除成功";
System.out.println("程序运行完成" + print +"\n文件夹大小:" + this.fileValue +
"\n总计运行时间:\t" + (System.currentTimeMillis() - startTime) + "ms");
}
private void deleteProcess(File file) {
File[] files = file.listFiles();
for (File temp : files) {
if (temp.isDirectory() == true) {
deleteProcess(temp);
} else {
this.fileValue += temp.length();
}
temp.delete();
}
file.delete();
}
}
2. 利用过滤器遍迭代遍历文件夹
import java.io.File;
import java.io.FileFilter;
public class MyFileFilter implements FileFilter {
private int count;
public static void main(String[] args) {
new MyFileFilter().overRead();
}
private void overRead() {
File file = new File("d:\\java\\javatest");
System.out.println("第一次遍历开始(不启用过滤器):");
this.count = 0;
this.overRead(file);
System.out.println("第一次遍历结束:\n获取文件总数:\t" + this.count);
System.out.println("\n第二次遍历开始(启用过滤器):" + "选取以 .java 为后缀名的文件");
this.count = 0;
this.overReadWithFilter(file);
System.out.println("第二次遍历结束:\n获取文件总数:\t" + this.count);
}
private void overReadWithFilter(File file) {
File[] files = file.listFiles(this);
for (File temp : files) {
if (temp.isDirectory() == true)
this.overReadWithFilter(temp);
else {
this.count++;
System.out.println(temp.getAbsolutePath());
}
}
}
private void overRead(File file) {
File[] files = file.listFiles();
for (File temp : files) {
if (temp.isDirectory() == true)
this.overRead(temp);
else {
this.count++;
System.out.println(temp.getAbsolutePath());
}
}
}
public boolean accept(File pathname) {
if (pathname.isDirectory() == true)
return true;
if (pathname.getName().toLowerCase().endsWith(".java") == true)
return true;
return false;
}
}