勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶
接下来,老蝴蝶带着大家学习一下 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.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());
}
控制台打印输出:
三. 文件的基本操作
包括 文件的创建,文件的删除,判断文件是否存在,文件的重命名。
三.一 方法
方法
| 作用
|
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.delete() 的操作,那么会发现,文件成功删除了。
四. 文件查看基本信息
四.一 方法
方法
| 作用
|
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());
}
控制台打印输出:
四.三 比较 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());
}
控制台打印输出:
建议 使用 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
}
控制台打印输出:
六. 关于文件目录的创建操作
六.一 方法
方法
| 作用
|
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 目录。
如果:
@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[] listRoots()
| 展示所有的磁盘信息
|
八.二 演示
@Test
public void rootTest(){
File[] files=File.listRoots();
for(File f:files){
// c:\ d:\ E:\
System.out.println("文件路径:"+f.getAbsolutePath());
}
}
控制台打印输出:
九. 转换成 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());
}
控制台打印输出:
关于 Path类和 Files 工具类,后面老蝴蝶会讲解的。
上面就是 File 类的基本操作了,必须要掌握的。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!