概览
在计算机系统中,文件是非常重要的存储方式。Java的标准库java.io提供了File对象来操作文件和目录,所以,我们在操作文件和目录前需要构造File对象。
要构造一个File对象,需要传入文件路径:
File f = new File("C:\\Windows\\readme.txt");
System.out.println(f);
基本方法
public class DemoController {
public static void main(String[] args){
File f = new File(".\\java\\hello.java");
System.out.println(f.getPath()); // .\java\hello.java
}
}
其它基本方法:
- getAbsolutePath() 该方法返回的是绝对路径,拼接上完整的路径但是不帮着处理. ..符号(.表示当前目录 ..表示上级目录),例如”.\java\hello.java” 则返回 “E:\javaProject\study.\java\hello.java”
- isFile() 判断文件是否存在
- isDirectory() 判断文件目录是否存在
- canRead() 是否可读
- canWrite() 是否可写
- canExecute() 是否可执行 如果是目录则表示能否显示所有的文件和子目录
- length() 文件字节大小
- createNewFile() 创建一个新文件
- delete() 删除文件:如果我们要删除一个文件,则把这个地址给File类,创建一个File实例,file.delete()即可删除。
- createTempFile() 创建临时文件,与deleteOnExit()在JVM退出时删除改文件,两者联动使用
- list()和listFiles() 列出目录下面所有文件和子目录名,listFiles提供了很多重载方法,可以过滤文件和目录
- mkdir() 创建目录:把想要创建的目录路径给File类创建一个实例,file.mkdir()即可创建目录
- mkdirs() 创建目录,如果父目录不存在也会创建
-
磁盘操作
File类可以用于表示文件和目录的信息,但是它不表示文件的内容。
递归地列出一个目录下所有文件:public static void listAllFiles(File dir){//这里我们设置的是需要传入File对象
//两种停止条件
if(dir == null || !dir.exists()){
return;
}
if(dir.isFile()){
System.out.println(dir.getName());
return;
}
//递归循环
for(File file : dir.listFiles()){
listAllFiles(file);
}
}
从Java7 开始,可以使用Paths 和 Files 代替File
Files 和 Paths类
Paths:通过get()方法返回一个Path对象,Path用于表示文件路径和文件。
- Files:提供了大量处理文件的方法,例如文件复制、读取、写入,获取文件属性、快捷遍历文件目录等…..
- Files 和 Paths是Java8新增的工具类,在处理文件方面功能非常强大。
paths 类
//以当前路径作为Path对象
Path p = Paths.get(".");
//使用传入的字符串返回一个Path对象
Path p2 = Paths.get("D","ReviewIO","URL");
//对应的路径
System.out.println("p对象的对应路径:" + p.toString());
System.out.println("p2对象的对应路径:" + p2.toString());
//路径数量是以路径名的数量作为标准
System.out.println("p路径数量:" + p.getNameCount());
System.out.println("p2路径数量:" + p2.getNameCount());
//获取绝对路径
System.out.println("p绝对路径:" + p.toAbsolutePath());
System.out.println("p2绝对路径:" + p2.toAbsolutePath());
//获取父路径
System.out.println("p父路径:" + p.getParent());
System.out.println("p2父路径:" + p2.getParent());
//获取p2对象的文件名或者文件目录名
System.out.println(p2.getFileName());
//通过Path对象返回一个分隔符对象
Spliterator<Path> split = p2.spliterator();
运行结果:
注:Paths类获取文件或文件目录路径可以使用采用多个字符串形式,也可以使用Path.get(D:\ReviewIO\URL)这种形式。返回的Path对象完全可以代替File类用于文件IO操作。
Files 类
读取文件
// 将文件内容读取为byte数组
byte[] data = Files.readAllBytes(Paths.get("/path/to/file.txt"));
// 默认使用UTF-8编码读取:注意该方法只能在java11及之后使用
String content1 = Files.readString(Paths.get("/path/to/file.txt"));
// 可指定编码:
String content2 = Files.readString(Paths.get("/path/to/file.txt"), StandardCharsets.ISO_8859_1);
// 按行读取并返回每行内容:
List<String> lines = Files.readAllLines(Paths.get("/path/to/file.txt"));
写入文件
//写入内容到文件
ArrayList<String> as = new ArrayList<>();
as.add("A");
as.add("B");
as.add("C");
Files.write(dest, as, Charset.forName("GBK"));
//Files的write函数第一个参数是path,第二个参数是Iterable<? extends CharSequence>,
Iterable是个顶级接口,实现类几乎都是集合类,并且限制了类型通配符上限是CharSequence,
这意味着要使用泛型为字符类型的集合类作为数据写入指定文件中,很麻烦。
文件复制
Path source = Paths.get("F:","Java经典练习题.pdf");
Path dest = Paths.get("F:","files.txt");
File file = new File("F:\\ok.pdf");
file.createNewFile();//如果f对象对应路径不存在就创建一个。
System.out.println("source对象的文件路径:" + source);
//复制文件
Files.copy(source, new FileOutputStream(f));