io-file类的使用方法
1.什么是io?
IO是指Input/Output,即输入和输出。以内存为中心:
- Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等。
- Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等等
1.1 什么是file类
java.io.file 操作文件和目录的路径的 与操作系统无关 任何系统都能使用file类中的方法
1.2 file类中常见的属性
属性 | 作用 |
---|---|
static String pathSeparator | 与系统有关的路径分隔符 (windows";"分号 linux ":"冒号) |
static char pathSeparatorChar | 与系统有关的路径分隔符 |
static String separator | 与系统有关的默认名称分隔符 (windows “\” 反斜杠 linux "/"正斜杠) |
static char separatorChar | 与系统有关的默认名称分隔符 |
代码演示
package com.io.file;
import java.io.File;
public class SeparatorDemo {
public static void main(String[] args) {
/*
* 在java中路径一般用"/" "/"等同于 "\\"
* 注意:文件路径不能写死
* C:\work\a.txt windows
* C:/work/a.txt linux
* "C"+ File.pathSeparator+File.separator+"work"+ File.separator+"a.txt"
*/
// public static final String pathSeparator = "" + pathSeparatorChar;
String pathSeparator = File.pathSeparator;
System.out.println("pathSeparator: " + pathSeparator);
char pathSeparatorChar = File.pathSeparatorChar;
System.out.println("pathSeparatorChar: " + pathSeparatorChar);
// public static final String separator = "" + separatorChar;
String separotor = File.separator;
System.out.println("separotor: " + separotor);
char separatorChar = File.separatorChar;
System.out.println("separatorChar: " + separatorChar);
}
}
运行结果
pathSeparator: ;
pathSeparatorChar: ;
separotor: \
separatorChar: \
1.3 file类的构造方法
File file = new File(String pathname)
File file = new File(String parent,String child)
File file = new File(File parent, String child)
File file = new File(URI uri)
代码演示
package com.io.file;
import java.io.File;
/**
* @author HeLang
* path 路径
* 绝对路径:一个完整的路径 以盘符开始的路径
* F:\workspace(工作空间)\EclipseIdea\io\src\com\io\file\SetPathDemo.java windows下的路径
* 相对路径:一个简化的路径 相对指的是相对于当前项目的根目录
* F:\workspace(工作空间)\EclipseIdea\io
* F:\workspace(工作空间)\EclipseIdea\io\src\com\io\file\SetPathDemo.java
* 简化后 io\src\com\io\file\SetPathDemo.java 注意: 路径是不区分大小写的
* slash 斜杠符号
* altSlash 与slash相反的斜杠
* semicolon 分号
*/
public class SetPathDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
fileConstructor();
fileConstructor2("C://", "a.txt");
fileConstructor3();
}
/*
* File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
* 参数: String pathname:字符串类型的路径名称
* 路径可以是以文件结尾,也可以是以文件夹结尾
* 路径可以是相对路径,也可以是绝对路径
* 路径可以是存在的,也可以是不存在的
* 创建file对象,只是把字符串路径封装成file对象,不考虑路径的真假情况
* 底层 fs.normalize(pathname);
* 注释翻译:检查给定的路径名是否正常。如果不是,就调用真实 需要规范化的路径名部分的规范化器。
* 通过这种方式,我们只遍历整个pathname字符串一次
*/
public static void fileConstructor() {
// 这里自动把windows"\" 转换成了"\\" 在java中路径一般用"/" "/"等同于 "\\"
// 绝对路径 重写了Object的toString()
File file1 = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\SetPathDemo.java");
System.out.println("绝对路径: " + file1);
// 相对路径
File file3 = new File("io\\src\\com\\io\\file\\SetPathDemo.java");
System.out.println("相对路径: " + file3);
// 不存在的文件 nothingness 虚无 不存在的
File file2 = new File("DD:\\nothingness.txt");
System.out.println("不存在的文件: " + file2);
// 规范化路径
File file4 = new File("io\\\\\\src\\" + "/" + "\\com\\io\\file\\SetPathDemo.java");
System.out.println("规范化路径: " + file4);
// 以文件夹结尾的
File file5 = new File("F:\\workspace(工作空间)\\EclipseIdea");
System.out.println("文件夹结尾: " + file5);
System.out.println("--------------------------------------------------------");
}
/*
* File(String parent, String child)
* 从父路径名字符串和子路径名字符串创建新的 File实例。
* 参数:将路径分成两部分
* String parent 父路径名字符串
* String child 子路径名字符串
* 使用灵活
*/
public static void fileConstructor2(String parent, String child) {
File file = new File(parent,child);
System.out.println("String parent, String child组合file: "+file);
System.out.println("---------------------------------------------------");
}
/*
* File(File parent, String child)
* 从父抽象路径名和子路径名字符串创建新的 File实例。
* 参数:将路径分成两部分
* File parent 父抽象路径名
* String child 子路径名字符串
* 使用灵活 父类路径是file类型 可以使用file类的方法对路径进行操作 然后在使用路径创建对象
*/
public static void fileConstructor3() {
File parent = new File("C://");
File file = new File(parent,"a.txt");
System.out.println("File parent, String child组合file: "+file);
System.out.println("---------------------------------");
}
}
运行结果
绝对路径: F:\workspace(工作空间)\EclipseIdea\io\SetPathDemo.java
相对路径: io\src\com\io\file\SetPathDemo.java
不存在的文件: DD:\nothingness.txt
规范化路径: io\src\com\io\file\SetPathDemo.java
文件夹结尾: F:\workspace(工作空间)\EclipseIdea
--------------------------------------------------------
String parent, String child组合file: C:\a.txt
---------------------------------------------------
File parent, String child组合file: C:\a.txt
1.4 file类中常见的方法
方法名 | 作用 |
---|---|
public String getAbsolutePath() | 返回此FiLe的绝对路径名字符串 |
public string getPath() | 将此FiLe转换为路径名字符串 |
public string getName() | 返回由此FiLe表示的文件或目录的名称 |
public long length() | 返回由此File表示的文件的长度 |
代码演示
package com.io.file;
import java.io.File;
public class GetPathDemo {
public static void main(String[] args) {
getAbsolutePath();
System.out.println("----------------");
getPath();
System.out.println("----------------");
getName();
System.out.println("----------------");
length();
}
//public String getAbsolutePath():返回此FiLe的绝对路径名字符串。
//charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
public static void getAbsolutePath() {
File file = new File("\\src\\com\\io\\file\\SetPathDemo.java");
String absolutePath= file.getAbsolutePath();
System.out.println(absolutePath);
}
/*
* public string getPath() :将此FiLe转换为路径名字符串。
* 获取构造方法中的传递的路径
* file重写的toString()方法就是getPath();
* public String toString() {
* return getPath();
* }
*/
public static void getPath() {
File file = new File("GetPathDemo.java");
String path= file.getPath();
System.out.println(path);
System.out.println(file.toString());
}
//public string getName():返回由此FiLe表示的文件或目录的名称
public static void getName() {
File file = new File("GetPathDemo.java");
File file2 = new File("F:\\workspace(工作空间)\\EclipseIdea\\io");
String filename= file.getName();
String filename2= file2.getName();
System.out.println(filename);
System.out.println(filename2);
}
//public long length():返回由此File表示的文件的长度。
/*
* 由此抽象路径名表示的文件的长度(以字节为单位)
* 文件夹是没有大小概念的 不能获取文件夹的大小
* 如果构造方法中的路径是不存在的,那么length返回的长度为0
*/
public static void length() {
File file = new File("GetPathDemo.java");
File file2 = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file\\GetPathDemo.java");
Long length= file.length();
Long length2= file2.length();
System.out.println(length);
System.out.println(length2);
}
}
运行结果
F:\src\com\io\file\SetPathDemo.java
----------------
GetPathDemo.java
GetPathDemo.java
----------------
GetPathDemo.java
io
----------------
0
2337
方法名 | 作用 |
---|---|
exists() | 判断文件或目录是否存在 存在为true 不存在为 false |
isDirectory() | 测试此抽象路径名表示的文件是否为目录 是目录返回 true 否则返回false |
isFile() | 测试此抽象路径名表示的文件是否为普通文件 是普通文件返回 true 否则返回false |
代码演示
package com.io.file;
import java.io.File;
public class FileAndDirectoryDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
exists();
System.out.println("--------------------------");
isDirectory();
System.out.println("--------------------------");
isFile();
}
public static void exists() {
// 文件完整路径 true
File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file\\FileAndDirectoryDemo.java");
System.out.println( file.exists());
// 目录完整路径 true
File file2 = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file");
System.out.println(file2.exists());
// 文件相对路径 true 相对指的是相对于该项目 io
File file3 = new File("src\\com\\io\\file\\FileAndDirectoryDemo.java");
System.out.println(file3.exists());
// 目录相对路径 true
File file4 = new File("src");
System.out.println(file4.exists());
// 文件/目录不存在
File file5 = new File("a.txt");
System.out.println(file5.exists());
}
public static void isDirectory() {
// 抽象路径名存在但不是目录 false
File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file\\FileAndDirectoryDemo.java");
System.out.println(file.isDirectory());
// 抽象路径名存在且是目录 true
File file2 = new File("F:\\workspace(工作空间)\\EclipseIdea");
System.out.println(file2.isDirectory());
}
public static void isFile () {
File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file\\FileAndDirectoryDemo.java");
System.out.println(file.isFile());
File file2 = new File("F:\\workspace(工作空间)");
System.out.println(file2.isFile());
}
}
运行结果
true
true
true
true
false
--------------------------
false
true
--------------------------
true
false
方法名 | 作用 |
---|---|
Boolean createNewFile() | 具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件,如果命名文件不存在并被成功创建 true 否则 false |
Boolean delete() | 测试此抽象路径名表示的文件或目录是否存在,当存在由此抽象路径名表示的文件或目录时 true 否则false |
boolean mkdir() | 创建由此抽象路径名命名的目录,当且仅当该目录被创建时 true 否则 false |
boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录,请注意,如果此操作失败,它可能已成功创建一些必需的父目录 |
代码演示
package com.io.file;
import java.io.File;
import java.io.IOException;
public class FileAndDirectoryDemo2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
createNewFile();
System.out.println("--------------------------");
delete();
System.out.println("--------------------------");
mkdir();
System.out.println("--------------------------");
mkdirs();
}
/*
* 抽象路径名必须是存在的
* 这个方法只能创建文件不能创建目录
*/
public static void createNewFile() {
File file= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\createNewFile.txt");
File file2= new File("createNewFile2.txt");
try {
Boolean result=file.createNewFile(); //当存在时创建返回false
Boolean result2=file2.createNewFile();//当存在时创建返回false
System.out.println(result);
System.out.println(result2);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
// 只能删除空目录
// 重硬盘上删除 不会保留在回收站
public static void delete() {
File file= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\createNewFile.txt");
Boolean result =file.delete();
File file2= new File("createNewFile2.txt");
Boolean result2 =file2.delete();
System.out.println(result);
System.out.println(result2);
}
//只能创建一级
public static void mkdir() {
File file2= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\a\\c");
Boolean result2 =file2.mkdir();
System.out.println(result2); //false
File file= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\a");
Boolean result =file.mkdir();
System.out.println(result);
}
// 创建多级
public static void mkdirs() {
File file1= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\a\\b\\c");
Boolean result =file1.mkdirs();
System.out.println(result);
}
}
运行结果
true
true
--------------------------
true
true
--------------------------
false
true
--------------------------
true
1.5 file类遍历目录
方法名 | 作用 |
---|---|
String[] list() | 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录 |
File[] listFiles() | 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件 |
注意:
- 遍历的是file对象中的抽象路径名
- 如果路径名不存在 会报nullException
- 如果路径不是目录 会报nullException
- 能获取隐藏的文件
代码演示
package com.io.file;
import java.io.File;
public class ListFileDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
list();
System.out.println("------------------------------------");
listFiles();
}
// 只能遍历抽象路径名子目录的文件和目录 相对路径
public static void list() {
File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io");
String [] list=file.list();
for (String string : list) {
System.out.println(string);
}
}
// 只能遍历抽象路径名子目录的文件和目录 绝对路径
public static void listFiles() {
File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io");
File [] listFile=file.listFiles();
for (File file2 : listFile) {
System.out.println(file2);
}
}
}
运行结果
.classpath
.project
.settings
a
bin
src
------------------------------------
F:\workspace(工作空间)\EclipseIdea\io\.classpath
F:\workspace(工作空间)\EclipseIdea\io\.project
F:\workspace(工作空间)\EclipseIdea\io\.settings
F:\workspace(工作空间)\EclipseIdea\io\a
F:\workspace(工作空间)\EclipseIdea\io\bin
F:\workspace(工作空间)\EclipseIdea\io\src
1.6 FilenameFilter过滤器和FileFilter过滤器的使用方法
1.FileFilter过滤器
@FunctionalInterface
public interface FileFilter 抽象路径名(file对象)的过滤器。
该接口的实例可以传递给File类的listFiles(FileFilter)方法
boolean accept(File pathname) 测试指定的抽象路径名是否应包含在路径名列表中。
@param
pathname - 要测试的抽象路径名
W@return
true 返回pathname
注意:
该接口没有实现类,需要自己写实现类,重写过滤的方法 accept 在方法中自定义过滤的规则
代码演示
package com.io.filter;
import java.io.File;
import java.io.FileFilter;
public class FileFilterDemo {
public static void main(String[] args) {
File file = new File("C://a");
FileFilter(file);
System.out.println("------------------");
FileFilter2(file);
System.out.println("------------------");
FileFilter3(file);
}
private static void FileFilter(File file) {
File[] files = file.listFiles(new FileFilterImpl());
// 1. listFiles方法会对构造方法传递的的抽象路径名进行遍历,获取文件/文件夹 封装为file对象
// 2. listFiles方法会调用参数传递的过滤器中的accept方法
// 3. listFiles方法会把遍历的到的每一个file对象,传递给accept方法的参数pathName
for (File f : files) {
if (f.isDirectory()) {
FileFilter(f);
} else {
System.out.println(f);
}
}
}
private static void FileFilter2(File file) {
// 使用匿名内部类
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
// TODO 自动生成的方法存根
if(pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".java")) {
return true;
}
return false ;
}
});
for (File f : files) {
if (f.isDirectory()) {
FileFilter(f);
} else {
System.out.println(f);
}
}
}
// 使用lamdba表达式 优化匿名内部类 接口中只有一个抽象 数据类型可以省略 如果代码只有一行 可以省略{}
private static void FileFilter3(File file) {
/*
* File[] files = file.listFiles((File pathname)->{ return
* pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".java");
* });
*/
File[] files = file.listFiles( pathname->pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".java"));
for (File f : files) {
if (f.isDirectory()) {
FileFilter(f);
} else {
System.out.println(f);
}
}
}
}
package com.io.filter;
import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
// TODO 自动生成的方法存根
String name =pathname.getName();
if(pathname.isDirectory())
return true;
return name.toLowerCase().endsWith(".java");
}
}
运行结果
C:\a\as.JAVA
C:\a\B\C1\D\a.java
------------------
C:\a\as.JAVA
C:\a\B\C1\D\a.java
------------------
C:\a\as.JAVA
C:\a\B\C1\D\a.java
2.FilenameFilter过滤器
@FunctionalInterface
public interface FilenameFilter
用于实现此接口的类的实例用于过滤文件名。这些实例都用在过滤目录列表list类的方法File
boolean accept(File dir,String name)测试指定文件是否应包含在文件列表中。
@param
dir - 找到该文件的目录(目录名 C:\a)。
name - dir目录下的文件的名称。
@return
true当且仅当该名称应包含在文件列表中时;否则 false。/ 为true时 传入的参数返回出去
false 不反回
注意:
该接口没有实现类,需要自己写实现类,重写过滤的方法 accept 在方法中自定义过滤的规则
代码演示
package com.io.filter;
import java.io.File;
import java.io.FilenameFilter;
public class FilenameFilterDemo {
public static void main(String[] args) {
File file = new File("C://a");
FilenameFilter(file);
System.out.println("-------------------");
FilenameFilter2(file);
System.out.println("-------------------");
FilenameFilter3(file);
System.out.println("---------------");
}
private static void FilenameFilter(File file) {
File [] listFiles = file.listFiles(new FilenameFilterImpl());
for (File file2 : listFiles) {
if(file2.isDirectory())
FilenameFilter(file2);
else
System.out.println(file2);
}
}
private static void FilenameFilter2(File file) {
// 使用匿名内部类
File [] listFiles = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// TODO 自动生成的方法存根
File file = new File(dir,name);
if(file.isDirectory()||name.toLowerCase().endsWith(".java"))
return true;
return false;
}
}) ;
for (File file2 : listFiles) {
if(file2.isDirectory())
FilenameFilter(file2);
else
System.out.println(file2);
}
}
// 使用lamdba表达式 优化匿名内部类 接口中只有一个抽象时 数据类型可以省略 如果代码只有一行 可以省略{}
private static void FilenameFilter3(File file) {
/*
* File [] listFiles = file.listFiles(( dir, name)->{ return new File( dir,
* name).isDirectory()||name.toLowerCase().endsWith(".java"); });
*/
File[] listFiles = file.listFiles((dir, name) -> new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".java"));
for (File file2 : listFiles) {
if (file2.isDirectory())
FilenameFilter(file2);
else
System.out.println(file2);
}
}
}
package com.io.filter;
import java.io.File;
import java.io.FilenameFilter;
public class FilenameFilterImpl implements FilenameFilter {
@Override public boolean accept(File dir, String name) {
File file =new File(dir,name);
if(file.isDirectory()||name.toLowerCase().endsWith(".java"))
return true;
return false;
}
}
运行结果
C:\a\as.JAVA
C:\a\B\C1\D\a.java
-------------------
C:\a\as.JAVA
C:\a\B\C1\D\a.java
-------------------
C:\a\as.JAVA
C:\a\B\C1\D\a.java
---------------