Java-IO File学习
File对象
java 的标准库 java.io 提供了 File 对象来操作文件和目录。 构建 File 对象,需要传入一个路径,可以是绝对路径,也可以是相对路径。
package io;
import java.io.File;
public class FileDemo {
public static void main(String[] args) throws IOException {
// Windows平台使用 \\ 代表 \
File winFile = new File("D:\\mydemo\\test.text");
System.out.println(winFile);
// Linux平台使用 / 作为路径分隔符
// 可以用.表示当前目录,..表示上级目录
File linuxFile = new File("../src/js");
System.out.println(linuxFile);
}
}
输出:
D:\mydemo\test.text
../src/js
构建 File 对象时,即使传入的文件或目录不存在,代码也不会报错,因为构造时并不会导致磁盘操作。当在调用 File 对象的一些方法时,才开始进行磁盘操作。
File对象有3种形式表现的路径。
getPath() :返回构造方法传入的路径,该路径可能是相对的,也可能不是相对的。getAbsolutePath() :返回绝对路径。getCanonicalPath :返回规范路径,规范路径就是把.和…转换成标准的绝对路径后的路径,这是文件的唯一绝对路径。
注意:可能有大量指向同一文件的绝对路径,但只有一个规范路径。
package io;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
File linuxFile = new File("../src/js");
// File表示路径的形式
System.out.println(linuxFile.getPath());
System.out.println(linuxFile.getAbsolutePath());
System.out.println(linuxFile.getCanonicalPath());
System.out.println(File.separator); // 根据当前平台打印"\"或"/"
}
}
输出:
../src/js
/Users/xxdemo/IdeaProjects/LearnJava/../src/js
/Users/xxdemo/IdeaProjects/src/js
/
文件和目录
1. 创建文件或目录
package io;
import java.io.File;
public class FileDemo {
public static void main(String[] args) throws IOException {
// 创建一个文件
File newFile = new File("../test.txt");
// 如果创建成功,则返回ture,如果文件已经存在则返回false
boolean fvar = newFile.createNewFile();
if (fvar){
System.out.println("created successfully");
}
else {
System.out.println("already exist");
}
}
}
在程序需要使用临时文件时,File对象可以创建临时文件:
package io;
import java.io.File;
public class FileDemo {
public static void main(String[] args) throws IOException {
// 创建临时文件,在JVM退出是自动删除
File tempFile = File.createTempFile("temp-", ".txt"); //提供临时文件的前缀和后缀
tempFile.deleteOnExit(); //JVM 退出时自动删除
System.out.println(tempFile.isFile());
System.out.println(tempFile.getAbsoluteFile());
}
}
和文件操作类似,File对象如果表示一个目录,可以通过以下方法创建目录:
boolean mkdir() :创建当前File对象表示的目录;boolean mkdirs() :创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来;
package io;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
// 创建一个目录
File newDir = new File("/tmp/test");
boolean flag = newDir.mkdirs();
if (flag){
System.out.println("created successfully");
}
else {
System.out.println("error");
}
}
}
2. 判断文件或目录
调用isFile() ,判断该File对象是否是一个已存在的文件; 调用isDirectory() ,判断该File对象是否是一个已存在的目录。
用File对象获取到一个文件时,还可以进一步判断文件的权限和大小:
boolean canRead() :是否可读;boolean canWrite() :是否可写;boolean canExecute() :是否可执行;long length() :文件字节大小。 对目录而言,是否可执行表示能否列出它包含的文件和子目录。
3. 删除文件和目录
package io;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
// 创建一个文件
File newFile = new File("../test.txt");
// 如果创建成功,则删除
if ( newFile.createNewFile()){
boolean dvar = newFile.delete();
if (dvar){
System.out.println("deleted successfully");
}
}
}
}
删除目录:
boolean delete() :删除当前File对象表示的目录,当前目录必须为空才能删除成功。
4. 遍历文件和目录
package io;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
String dirname = "/Users/xxs/Documents";
File f = new File(dirname);
if (f.isDirectory()){
System.out.println("directory: " + dirname);
String s[] = f.list();
for (String value : s) {
File nf = new File(dirname + "/" + value);
if (nf.isDirectory()) {
System.out.println("directory: " + value);
} else {
System.out.println("file: " + value);
}
}
} else {
System.out.println("file: " + dirname);
}
}
}
当File对象表示一个目录时,可以使用 list() 和 listFiles() 列出目录下的文件和子目录名。 listFiles()提供了一系列重载方法,可以过滤不想要的文件和目录:
package io;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
String dirname = "/Users/xxs/Documents";
File f = new File(dirname);
File[] fs = f.listFiles(); //列出所有文件和子目录
printFiles(fs);
File[] fs2 = f.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name){
return name.endsWith(".xml"); // 返回true表示接受该文件
}
});
printFiles(fs2);
}
static void printFiles(File[] files) {
System.out.println("==========");
if (files != null) {
for (File f : files) {
System.out.println(f);
}
}
System.out.println("==========");
}
}
运行结果:
==========
/Users/xxs/Documents/.rqd
/Users/xxs/Documents/.DS_Store
/Users/xxs/Documents/FlipClock.saver
/Users/xxs/Documents/appium_log
/Users/xxs/Documents/av_report_config.xml
/Users/xxs/Documents/com_tencent_imsdk_data
/Users/xxs/Documents/AirCloud
/Users/xxs/Documents/av_config.xml
==========
==========
/Users/xxs/Documents/av_report_config.xml
/Users/xxs/Documents/av_config.xml
==========
5.拓展
上面2个遍历中,使用了list()和listFiles()和两个方法,这里说下他们的区别。
list() : 会返回一个String类型数组,仅仅是把指定路径下的文件或文件夹名字存储到数组中。listFiles() : 返回的是File类型的对象,所以具有其全部的属性和方法。有以下两种重载方式: String[] list() String[] list(FilenameFilter filter)
下面说下String[] list(FilenameFilter filter) 和其匿名类的用法。
FilenameFilter filter是一个目录过滤器。list(FilenameFilter filter)方法会选择符合条件的文件或文件夹。
查看源码如下:
public String[] list(FilenameFilter filter) {
String names[] = normalizedList(); //获取到指定目录下的所有文件(或目录)名字,并转化为标准格式
if ((names == null) || (filter == null)) { //没有过滤条件时直接返回
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) { //如果accept() 方法返回真,则添加到新的ArrayList v中
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]); //ArrayList转换成String[]类型返回
}
可以看出, list(FilenameFilter filter)方法保存的是那些能够使filter.accept()方法返回true的文件名。
现在需要知道 filter.accept() 可以看出是 FilenameFilter 中的方法,查看源码如下:
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);
}
从这可以看出,FilenameFilter 是一个接口,使用 list(FilenameFilter filter) 方法就必须实现FilenameFilter接口,accept方法由我们自己定义。
参考文章: https://blog.csdn.net/lj_pyt/article/details/44830761 https://www.liaoxuefeng.com/wiki/1252599548343744/1298069154955297 https://www.runoob.com/java/java-files-io.html
|