【Java-IO流】Input/Output Stream、输入/输出流、File、分隔符、大小写、常用方法、练习:搜索、删除、剪切、读取整个F盘的文件及文件夹
八、IO
文章目录
- 八、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 |
02_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 {/ * 搜索目录下的所有文件 * @param dir 目录 * @param operation 执行的操作 */public static void search(File dir, Consumer<File> 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); // 如果是文件夹, 递归搜索该文件夹}}/ * 删除文件夹 * @param file */public static void delete(File file){// 传入null 或者 文件夹不存在, 不执行操作if(file == null || !file.exists()) return;clean(file);file.delete();}/ * 清空文件夹中文件 * @param dir */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盘的文件及文件夹:
【读取文件夹】待上传