八、IO
01_简介02_File
分隔符、大小写常用方法练习:搜索、删除、剪切
01_简介I/O流 全称是 Input/Output Stream,译为“输入/输出流”。
不管什么数据,本质上都是二进制而已,所谓 I/O流,就是将这些 01 二进制进行传输
I/O流的常用类型都在 java.io 包中:
| 类型 | 输入流 | 输出流 |
|---|---|---|
| 字节流(Byte Streams) | InputStream | OutputStream |
| 字符流(Character Streams) | Reader | Writer |
| 缓冲流(Buffered Streams) | BufferedInputStream、BufferedReader | BufferedOutputStream、BufferedWriter |
| 数据流(Data Streams) | DataInputStream | DataOutputStream |
| 对象流(Object Streams) | ObjectInputStream | ObjectOutputStream |
一个 File 对象就代表一个文件或目录(文件夹)
// file1、file2都能访问test.txt文件
File file1 = new File("F:\Files\Texts\test.text");
File file2 = new File("F:/Files/Texts/test.text");
名字分隔符(name separator):File.separator
在 UNIX、Linux、Mac 系统中:正斜杠 /在 Windows 系统中:反斜杠
路径分隔符(path separator):File.pathSeparator
在 UNIX、Linux、Mac 系统中:冒号:在 Windows 系统中:分号;
是否区分大小写
在 Windows、Mac 系统中:文件名、目录名不区分大小写在 UNIX、Linux 系统中:文件名、目录名区分大小写 常用方法
String getName() //获取文件或目录的名称 String getParent() //获取父路径 File getParentFile() //获取父文件 String getPath() //获取路径 String getAbsolutePath() //获取绝对路径 File getAbsoluteFile() //获取绝对路径形式的文件 long lastModified() //最后一次修改的时间 long lenght() //文件的大小(不支持目录)
获取文件或目录的名称:String getName()获取父路径:String getParent()获取父文件:File getParentFile()获取路径:String getPath()获取绝对路径:String getAbsolutePath()获取绝对路径形式的文件:File getAbsoluteFile()最后一次修改的时间:long lastModified()文件的大小(不支持目录):long length()
boolean isAbsolute() boolean exists() boolean isDirectory() boolean isFile() boolean isHidden() boolean canRead() boolean canWrite()
是否绝对路径:boolean isAbsolute()文件或目录是否存在:boolean exists()是否目录(文件夹):boolean isDirectory()是否文件:boolean isFile()是否隐藏:boolean isHidden()是否可读:boolean canRead()是否可写:boolean canwrite()
String[] list() //获取当前目录下所有文件、目录的名称 String[] list(FilenameFilter filter) File[] listFiles() //获取当前目录下所有文件、目录 File[] listFiles(FilenameFilter filter) File[] listFiles(FileFilter filter)
获取当前目录下所有文件、目录的名称
String[] list()
String[] list(FilenameFilter filter)获取当前目录下所有文件、目录
File[] listFiles()
File[] listFiles(FilenameFilter filter)
File[] listFiles(FileFilter filter)
boolean createNewFile() //创建文件(不会覆盖旧文件) boolean delete() //删除文件或空目录(不经过回收站) boolean mkdir() //创建当前目录 boolean mkdirs() //创建当前目录(包括不存在的父目录) boolean renameTo(File dest) //剪切到新路径
创建文件(不会覆盖旧文件):boolean createNewFile()删除文件或空目录(不经过回收站,慎重!):boolean delete()创建当前目录:boolean mkdir()创建当前目录(包括不存在的父目录):boolean mkdirs()剪切到新路径(可以改名,很有用):boolean renameTo(File dest)
boolean setLastModified(long time) boolean setReadOnly() boolean setWritable(boolean writable, boolean ownerOnly) boolean setWritable(boolean writable) boolean setReadable(boolean readable, boolean ownerOnly) boolean setReadable(boolean readable)
设置修改日期:boolean setLastModified(long time)设置只读权限:boolean setReadonly()设置写权限:
boolean setWritable(boolean writable, boolean ownerOnly)
boolean setWritable(boolean writable)设置写权限:
boolean setReadable(boolean readable, boolean ownerOnly)
boolean setReadable(boolean readable)
练习:搜索、删除、剪切
import java.io.File;
import java.util.function.Consumer;
public class Files {
public static void search(File dir, Consumer operation){
if(dir == null || operation == null) return;
// 目录不存在 或者 传入的是文件, 不执行操作
if(!dir.exists() || dir.isFile()) return;
File[] subfiles = dir.listFiles();
for (File sf : subfiles) {
operation.accept(sf);
if(sf.isFile()) continue; // 如果是文件,跳过,进行后面的搜索
search(sf, operation); // 如果是文件夹, 递归搜索该文件夹
}
}
public static void delete(File file){
// 传入null 或者 文件夹不存在, 不执行操作
if(file == null || !file.exists()) return;
clean(file);
file.delete();
}
public static void clean(File dir){
// 如果文件夹不存在 或者 传入的是文件, 不执行操作
if(dir == null || !dir.exists() || dir.isFile()) return;
File[] subfiles = dir.listFiles();
for (File sf : subfiles) {
delete(sf);
}
}
public static void move(File src, File dest){
if(src == null || dest == null) return;
// 如果源File不存在 或者 目标File 已经存在, 不执行操作
if(!src.exists() || dest.exists()) return;
mkparents(dest);
src.renameTo(dest);
}
private static void mkparents(File file){
File parent = file.getParentFile();
if(parent == null) return;
parent.mkdirs();
}
}
import java.io.File;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) throws Exception {
// file1、file2都能访问test.txt文件
// File file1 = new File("F:\");
File file = new File("F:/");
Files.search(file, (sub) -> {
if (sub.isFile()) { // 是文件
System.out.println("t文件:" + sub.getName());
} else {
System.out.println("目录:" + sub.getName());
}
});
}
}
这个测试类可以像下面这样读取整个F盘的文件及文件夹:
【读取文件夹】待上传



