勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶

接下来,老蝴蝶带着大家学习一下 IO 流。 学习IO 流之前,一定要先学习一下,关于文件 File 的操作。

我们平常常说的文件File 和目录 Directory 都使用 java.io.File 类进行表示。

一. File 类的两个静态系统常量

一.一 方法

变量

作用

static String pathSeparator

与系统相关的路径分隔符字符,为方便起见,表示为字符串。

static String separator

与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。

一.二 演示

/**
* 测试路径常量
*/
@Test
public void pathTest(){

//windows 系统为 ; linux为 :
System.out.println("路径分隔符:"+File.pathSeparator);
// windows 系统为 \, linux 为 /
System.out.println("文件分隔符:"+File.separator);
}

控制台打印输出:

File类的使用(一)_File过滤文件

变量

File.pathSeparator

File.separator

Windows系统

;

\

Linux系统

:

/

路径拼接时,为了避免系统差异,应该用常量去连接路径。 (系统常量小写,是Java 历史原因。)

二. File 的构造方法

二.一 方法

方法

作用

File(String pathname)

传入完整路径字符串, 相对路径和绝对路径都可以

File(String parent, String child)

传入父路径字符串,和当前文件名称

File(File parent, String child)

传入父文件,和当前文件名称

File(URI uri)

传入网络地址,进行构建

二.二 演示

/**
* 测试构造方法
*/
@Test
public void contrTest(){

//1. 最常用的还是第一种, 绝对路径
File file1=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello.txt");
System.out.println("文件1内容长度:"+file1.length());

// 以 src 开头, 传入相对路径
File file11=new File("src"+File.separator+"Hello.txt");
System.out.println("文件11内容长度:"+file11.length());

// 2. 父路径 和 当前文件名
File file2=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc","Hello.txt");

System.out.println("文件2内容长度:"+file2.length());

//3. 父文件和 当前文件名
File parent=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc");

File file3=new File(parent,"Hello.txt");

System.out.println("文件3大小:"+file3.length());

//4. 网络路径 file:/E:.... 具体的路径
URL url= null;
try {
url = new URL("file:"+File.separator+"E:"+File.separator+"ideaWork"+File.separator
+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello.txt");
} catch (MalformedURLException e) {
e.printStackTrace();
}

File file4= null;
try {
file4 = new File(url.toURI());
} catch (URISyntaxException e) {
e.printStackTrace();
}

System.out.println("文件4大小:"+file4.length());
}

控制台打印输出:

File类的使用(一)_File类使用详解_02

三. 文件的基本操作

包括 文件的创建,文件的删除,判断文件是否存在,文件的重命名。

三.一 方法

方法

作用

boolean createNewFile()

文件不存在时,创建该文件。

boolean delete()

删除文件

boolean exists()

判断文件是否存在,如果存在,返回true,不存在,返回false

boolean renameTo(File dest)

重命名文件

三.二 演示

/**
* 创建,删除,判断是否存在,重命名 操作。
*/
@Test
public void operTest() throws Exception{
//1. 定义一个文件, 没有这个文件
File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello2.txt");
//如果文件存在
if(file.exists()){
//删除文件
//file.delete();
//定义新的文件
File newFile=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"HelloNew2.txt");
//重命名文件, 文件的内容依旧保存。
file.renameTo(newFile);

}else{
//创建文件
file.createNewFile();
}
}

运行程序,文件系统进行查看。 刚开始是没有这个文件 Hello2.txt 的。

第一次运行前:

File类的使用(一)_File类使用详解_03

第一次运行后:

File类的使用(一)_File类的方法讲解_04

再一次运行:

File类的使用(一)_File类使用详解_05

发现,成功 重命名了。 如果是重命名的话, 那么文件的内容依旧还是在的。

如果执行 file.delete() 的操作,那么会发现,文件成功删除了。

File类的使用(一)_File类的方法讲解_06

四. 文件查看基本信息

四.一 方法

方法

作用

boolean exists()

文件是否存在,如果存在,返回true,不存在,返回false

String getAbsolutePath()

获取路径在磁盘上的绝对路径

String getPath()

获取文件的传入路径, 如果传入的是绝对路径,那么就返回绝对路径,

如果传入的是相对路径,就返回相对路径

long length()

获取文件的大小

long lastModified()

获取文件最后修改的时间, 返回时间戳,可以被修改的

String getName()

获取文件的名称

String getParent()

获取父路径, 返回的是父文件的路径

boolean isFile()

判断是否是普通文件, 如果是普通文件,返回true,不是普通文件,返回false

boolean isDirectory()

判断是否是目录, 如果是普通文件,返回false,如果是目录,返回true

File getParentFile()

获取父文件,返回的是父文件

四.二 演示

//展示文件的基本的信息
@Test
public void showTest(){

File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello.txt");

System.out.println("文件是否存在:"+file.exists());

//E:\ideaWork\Java2\fileSrc\Hello.txt
System.out.println("文件的绝对路径:"+file.getAbsolutePath());

// E:\ideaWork\Java2\fileSrc\Hello.txt
System.out.println("文件路径:"+file.getPath());

System.out.println("文件大小:"+file.length());

//可以修改的
System.out.println("文件最后的修改时间:"+file.lastModified());

System.out.println("文件的名称:"+file.getName());

System.out.println("文件的父路径:"+file.getParent());

System.out.println("文件是否是普通文件:"+file.isFile());

System.out.println("文件是否是目录:"+file.isDirectory());
//获取父类文件

File parent=file.getParentFile();

System.out.println("父类文件的名称:"+parent.getName()+",是否是目录:"+parent.isDirectory());
}

控制台打印输出:

File类的使用(一)_Java的IO流操作_07

四.三 比较 getAbsolutePath() 和 getPath() 的区别

//两个路径的比较
@Test
public void pathDiffTest(){

//绝对路径传入
File file1=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello.txt");

//E:\ideaWork\Java2\fileSrc\Hello.txt
System.out.println("文件的绝对路径:"+file1.getAbsolutePath());

// E:\ideaWork\Java2\fileSrc\Hello.txt
System.out.println("文件路径:"+file1.getPath());

// 相对路径传入
File file2=new File("src"+File.separator+"Hello.txt");

// E:\ideaWork\Java2\src\Hello.txt
System.out.println("文件的绝对路径:"+file2.getAbsolutePath());

// src\Hello.txt
System.out.println("文件路径:"+file2.getPath()+"文件名称:"+file2.length());

}

控制台打印输出:

File类的使用(一)_File过滤文件_08

建议 使用 getAbsolutePath() 获取绝对路径, 然后根据绝对路径进行处理。

五. 文件的可读,可写,可执行, 最后修改时间

文件有三种权限, 可读,可写,可执行, 即 rwx

五.一 方法

方法

作用

boolean canRead()

文件是否可读

boolean canWrite()

文件是否可写

boolean canExecute()

文件是否可执行

boolean isHidden()

文件是否被隐藏

boolean setReadOnly()

文件设置成只读模式,此模式下 不可以写,不可以运行,只能读

boolean setWritable(boolean writable)

设置文件是否可以写, 只对写操作设置,对读和运行,不造成影响

boolean setLastModified

设置文件的最后修改时间

long lastModified()

获取文件的最后修改时间

五.二 演示

/*
* 设置文件的可读,可写,可运行,最后修改时间*/
@Test
public void rwTest(){
File file1=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello.txt");

System.out.println("文件是否可读:"+file1.canRead()); //true
System.out.println("文件是否可写:"+file1.canWrite());//true
System.out.println("文件是否可运行:"+ file1.canExecute()); //true

System.out.println("文件是否是隐藏的:"+file1.isHidden());//false
//设置文件的类型
//设置成只读
file1.setReadOnly();
System.out.println("看是否能写:"+file1.canWrite()); //false

file1.setWritable(true);

System.out.println("文件是否可写:"+file1.canWrite()); //true

System.out.println("文件的最后修改时间:"+file1.lastModified()); //1591933582333

file1.setLastModified(1000);
System.out.println("文件的最后修改时间:"+file1.lastModified()); //1000

}

控制台打印输出:

File类的使用(一)_Java的IO流操作_09

六. 关于文件目录的创建操作

六.一 方法

方法

作用

boolean mkdir()

创建目录,只能创建一级

boolean mkdirs()

创建目录,可能递归创建多级

六.二 演示

//目录的相关操作
@Test
public void DireTest(){
//后面没有文件后缀,是一个目录。
File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc2");
//注意,必须保证Java2 目录一定是存在的
if(!file.exists()&&file.isDirectory()){
//创建目录
file.mkdir();
}

//父级目录 b, 包括b的父级 a 都是不存在的。
File file3=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"a"+File.separator+"b"+File.separator+"c");

if(!file3.exists()){
//不报错
file3.mkdirs();
}
}

运行之后,会发现, 创建了 fileSrc2 目录, 并且 fileSrc 下,也依次创建了 a/b/c 目录。

File类的使用(一)_File类的基本使用_10


如果:

@Test
public void Dire1Test(){
File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"e"+File.separator+"f"+File.separator+"g");

if(!file.exists()){
//不报错
file.mkdir();
}
}

没有 e,f,g 目录。

此时运行之后,程序不报错,但也不会创建目录。

建议,使用时, 要递归创建目录, 即 使用 mkdirs() 方法。

七. 关于文件目录的过滤查询操作

文件目录下,查询该目录下的文件信息。

七.一 方法

方法

作用

String[] list()

展示该目录下所有的文件名称

File[] listFiles()

展示该目录下所有的文件

File[] listFiles(FilenameFilter filter)

过滤后,展示符合条件的文件集合

File[] listFiles(FileFilter filter)

过滤后,展示符合条件的文件集合

其中,文件过滤, 使用的是 FileFilter

@FunctionalInterface
public interface FileFilter {

/**
* Tests whether or not the specified abstract pathname should be
* included in a pathname list.
*
* @param pathname The abstract pathname to be tested
* @return <code>true</code> if and only if <code>pathname</code>
* should be included
*/
boolean accept(File pathname);
}

这个参数 File pathname, 指的是 文件。

FilenameFilter 时

@FunctionalInterface
public interface FilenameFilter {
/**
* Tests if a specified file should be included in a file list.
*
* @param dir the directory in which the file was found.
* @param name the name of the file.
* @return <code>true</code> if and only if the name should be
* included in the file list; <code>false</code> otherwise.
*/
boolean accept(File dir, String name);
}

File dir 这个参数 表示的是 当前目录。

name 表示的是目录下的各个文件名称。

七.二 演示

@Test
public void DireOperTest(){
//是一个目录
File file=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc");

//只展示一级的
String [] fileNames= file.list();

for(String s:fileNames){
System.out.println("文件名称:"+s);
}
System.out.println("***********************************");

File[] files=file.listFiles();

for(File f:files){
System.out.println("文件名称:"+f.getName());
}
System.out.println("***********过滤操作*************");
File[] filterFiles=file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//第一个指目录文件, 第二个文件的名称。

System.out.println("文件:"+dir.getAbsolutePath());

System.out.println("name:"+name);

//如果名称中包括 . 就返回
if(name.indexOf(".")>=0){
return true;
}
return false;
}
});

System.out.println("最后过滤得到的信息1");
for(File f:filterFiles){
System.out.println("过滤后的文件名称:"+f.getName());
}


System.out.println("***********又一次过滤*************");
File[] filter2Files=file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//指的是下面的每一个文件
System.out.println("名称pathname:"+pathname.getAbsolutePath());

//是文件,就返回
if(pathname.isFile()){
return true;
}
return false;
}
});

System.out.println("最后过滤得到的信息2");
for(File f:filter2Files){
System.out.println("过滤后的文件名称:"+f.getName());
}
}

控制台打印输出:

File类的使用(一)_Java的IO流操作_11

七.三 递归显示目录下的文件

关于这递归显示目录下的文件,可以参考老蝴蝶以前写的文章: ​​递归查询文件目录下所有的文件(八)​​

八. 显示所有磁盘

八.一 方法

方法

作用

File[] listRoots()

展示所有的磁盘信息

八.二 演示

@Test
public void rootTest(){

File[] files=File.listRoots();
for(File f:files){
// c:\ d:\ E:\
System.out.println("文件路径:"+f.getAbsolutePath());
}
}

控制台打印输出:

File类的使用(一)_File过滤文件_12

九. 转换成 Path

Path 是 java 1.7 之后引入的类, 用于代替 以前的 File 类。 常常与 java.nio.file.Files 类联合使用。

九.一 方法

方法

作用

Path toPath()

转换成 Path

九.二 演示

@Test
public void pathClassTest(){
File file1=new File("E:"+File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
+File.separator+"Hello.txt");

Path path=file1.toPath();

System.out.println("输出:"+path.getFileName());

}

控制台打印输出:

File类的使用(一)_File类的方法讲解_13

关于 Path类和 Files 工具类,后面老蝴蝶会讲解的。



上面就是 File 类的基本操作了,必须要掌握的。

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!