> 文档中心 > 【Java-IO流】Input/Output Stream、输入/输出流、File、分隔符、大小写、常用方法、练习:搜索、删除、剪切、读取整个F盘的文件及文件夹

【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) BufferedInputStreamBufferedReader BufferedOutputStreamBufferedWriter
数据流(Data Streams) DataInputStream DataOutputStream
对象流(Object Streams) ObjectInputStream ObjectOutputStream

02_File

分隔符、大小写

一个 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盘的文件及文件夹

【读取文件夹】待上传

戒烟网