1.File类
其中最常用的两个File对象的构造方法:
// 通过文件名创建file对象
File file = new File("/Users/lee/develop/文件知识点测试路径/a.txt");
// 通过路径名字 + 文件名 创建file对象
File file = new File("/Users/lee/develop/文件知识点测试路径", "a.txt");
将普通的文件转化成Java可以操作的对象;即使文件不存在,也不会报错。
mac或者Linux系统的文件路径分隔符是 ”/“,但是Windows的文件路径分隔符是" \ ",需要转义,也就是要”\\“
1.1.file常用的方法
①创建文件对象:在已有的文件夹下创建:
File file = new File("/Users/lee/develop/文件知识点测试路径/b.txt");
boolean b = file.createNewFile();
注意:若文件夹”/Users/lee/develop/文件知识点测试路径“不存在,则无法创建b.txt;若文件夹”/Users/lee/develop/文件知识点测试路径“下面已经存在b.txt,则无法创建;创建成功返回true,失败返回false。
②创建单的文件夹
File file = new File("/Users/lee/develop/文件知识点测试路径/A");
boolean b = file.mkdir();
只能创建单级文件夹,不能创建级联文件夹;如果原来文件夹存在,则创建失败。
③创建级联文件夹
File file = new File("/Users/lee/develop/文件知识点测试路径/A/B/C");
boolean mkdirs = file.mkdirs();
如果原来文件夹存在,创建失败,并不会覆盖。
④删除文件或目录:a.删除目录(目录就是文件夹):只能删除最底层那一级目录;不能从中间路径删除。有这样一个文件路径:/Users/lee/develop/文件知识点测试路径/A/B/C
File file = new File("/Users/lee/develop/文件知识点测试路径/A");
boolean delete = file.delete(); //false
File file = new File("/Users/lee/develop/文件知识点测试路径/A/B/C");
boolean delete = file.delete();//true
b.删除文件:假如有文件:/Users/lee/develop/文件知识点测试路径/a.txt
File file = new File("/Users/lee/develop/文件知识点测试路径/a.txt");
boolean delete = file.delete();
⑤重命名文件
File file = new File("/Users/lee/develop/文件知识点测试路径/b.txt");
File dest = new File("/Users/lee/develop/文件知识点测试路径/A/bb.txt");
boolean renameTo = file.renameTo(dest);
renameTo是把 ”重命名 + 移动“ 二合一
⑥判断功能
方法 | 说明 |
isDirectory() | 判断是否是目录(文件夹) |
isFile() | 判断是否是文件 |
exists() | 判断是否存在 |
canRead() | 判断是否可读 |
canWrite() | 判断是否可写 |
isHidden() | 判断是否隐藏 |
File file = new File("/Users/lee/develop/文件知识点测试路径/bb.txt");
File file2 = new File("/Users/lee/develop/文件知识点测试路径/A");
//判断是否是目录
boolean directory = file2.isDirectory();
System.out.println(directory);
// 判断是否是文件
boolean b = file.isFile();
System.out.println(b);
// 判断是否存在
boolean exists = file.exists();
System.out.println(exists);
// 判断是否可读
boolean canRead = file.canRead();
System.out.println(canRead);
// 判断是否可写
boolean canWrite = file.canWrite();
System.out.println(canWrite);
// 是否隐藏
boolean hidden = file.isHidden();
System.out.println(hidden);//false
⑦获取功能:绝对路径:从磁盘的盘符开始;相对路径:相对当前文件的路径地址。
方法 | 说明 |
getAbsolutePath() | 获取绝对路径 |
getPath() | 获取相对路径 |
getName() | 获取文件或文件夹的名字 |
length() | 获取文件的⻓度,单位是字节 |
lastModified() | 获取最后一次修改的时间 |
getParent() | 获取当前目录或文件的上一级目录 |
File file = new File("aa/bb.txt");
//获取绝对路径
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);// Users/lee/eclipse-
workspace/day725/aa/bb.txt
// 获取相对路径
String path = file.getPath();
System.out.println(path); // aa/bb.txt
// 获取文件或文件夹的名字
String name = file.getName();
System.out.println(name); // bb.txt
// 获取文件大小
long length = file.length();
System.out.println(length);
// 获取最后一次修改时间
long lastModified = file.lastModified();
System.out.println(lastModified);
// 获取父路径
String parent = file.getParent();
System.out.println(parent);//aa
file.setLastModified(78676780);// 修改最后修改时间
⑧列举文件:1.list:列举出当前文件夹下面的所有文件和文件夹的名字,返回值String[];只会遍历一级文件夹,如果有子文件夹不会遍历出来。
File file = new File("/Users/lee/Documents/课件");
String[] list = file.list();
for (String str : list) {
System.out.println(str);
}
2.listFiles():列举出当前文件夹下面的所有文件和文件夹的filie对象,返回值File[]
File file = new File("/Users/lee/Documents/课件");
File[] listFiles = file.listFiles();
for (File f : listFiles) {
System.out.println(f);
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
import java.util.Iterator;
import org.junit.Test;
/**
* Files工具类的使用:操作文件或目录的工具类
*/
public class FilesTest {
@Test
public void test1() throws IOException{
Path path1 = Paths.get("d:\\nio", "hello.txt");
Path path2 = Paths.get("atguigu.txt");
// Path copy(Path src, Path dest, CopyOption … how) : 文件的复制
//要想复制成功,要求path1对应的物理上的文件存在。path1对应的文件没有要求。
// Files.copy(path1, path2, StandardCopyOption.REPLACE_EXISTING);
// Path createDirectory(Path path, FileAttribute<?> … attr) : 创建一个目录
//要想执行成功,要求path对应的物理上的文件目录不存在。一旦存在,抛出异常。
Path path3 = Paths.get("d:\\nio\\nio1");
// Files.createDirectory(path3);
// Path createFile(Path path, FileAttribute<?> … arr) : 创建一个文件
//要想执行成功,要求path对应的物理上的文件不存在。一旦存在,抛出异常。
Path path4 = Paths.get("d:\\nio\\hi.txt");
// Files.createFile(path4);
// void delete(Path path) : 删除一个文件/目录,如果不存在,执行报错
// Files.delete(path4);
// void deleteIfExists(Path path) : Path对应的文件/目录如果存在,执行删除.如果不存在,正常执行结束
Files.deleteIfExists(path3);
// Path move(Path src, Path dest, CopyOption…how) : 将 src 移动到 dest 位置
//要想执行成功,src对应的物理上的文件需要存在,dest对应的文件没有要求。
// Files.move(path1, path2, StandardCopyOption.ATOMIC_MOVE);
// long size(Path path) : 返回 path 指定文件的大小
long size = Files.size(path2);
System.out.println(size);
}
@Test
public void test2() throws IOException{
Path path1 = Paths.get("d:\\nio", "hello.txt");
Path path2 = Paths.get("atguigu.txt");
// boolean exists(Path path, LinkOption … opts) : 判断文件是否存在
System.out.println(Files.exists(path2, LinkOption.NOFOLLOW_LINKS));
// boolean isDirectory(Path path, LinkOption … opts) : 判断是否是目录
//不要求此path对应的物理文件存在。
System.out.println(Files.isDirectory(path1, LinkOption.NOFOLLOW_LINKS));
// boolean isRegularFile(Path path, LinkOption … opts) : 判断是否是文件
// boolean isHidden(Path path) : 判断是否是隐藏文件
//要求此path对应的物理上的文件需要存在。才可判断是否隐藏。否则,抛异常。
// System.out.println(Files.isHidden(path1));
// boolean isReadable(Path path) : 判断文件是否可读
System.out.println(Files.isReadable(path1));
// boolean isWritable(Path path) : 判断文件是否可写
System.out.println(Files.isWritable(path1));
// boolean notExists(Path path, LinkOption … opts) : 判断文件是否不存在
System.out.println(Files.notExists(path1, LinkOption.NOFOLLOW_LINKS));
}
/**
* StandardOpenOption.READ:表示对应的Channel是可读的。
* StandardOpenOption.WRITE:表示对应的Channel是可写的。
* StandardOpenOption.CREATE:如果要写出的文件不存在,则创建。如果存在,忽略
* StandardOpenOption.CREATE_NEW:如果要写出的文件不存在,则创建。如果存在,抛异常
*
* @author shkstart 邮箱:shkstart@126.com
* @throws IOException
*/
@Test
public void test3() throws IOException{
Path path1 = Paths.get("d:\\nio", "hello.txt");
// InputStream newInputStream(Path path, OpenOption…how):获取 InputStream 对象
InputStream inputStream = Files.newInputStream(path1, StandardOpenOption.READ);
// OutputStream newOutputStream(Path path, OpenOption…how) : 获取 OutputStream 对象
OutputStream outputStream = Files.newOutputStream(path1, StandardOpenOption.WRITE,StandardOpenOption.CREATE);
// SeekableByteChannel newByteChannel(Path path, OpenOption…how) : 获取与指定文件的连接,how 指定打开方式。
SeekableByteChannel channel = Files.newByteChannel(path1, StandardOpenOption.READ,StandardOpenOption.WRITE,StandardOpenOption.CREATE);
// DirectoryStream<Path> newDirectoryStream(Path path) : 打开 path 指定的目录
Path path2 = Paths.get("e:\\teach");
DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path2);
Iterator<Path> iterator = directoryStream.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
2.练习
2.1.练习1
// 1.遍历指定文件夹下以.png结尾的文件,如果有,把文件名打印出来
// 1. 创建file对象
File file = new File("/Users/lee/develop/文件知识点测试路径");
// 2. 列举出所有的文件
String[] names = file.list();
// 3. 寻找png图片
for (String name : names) {
if (name.endsWith(".png")) {
System.out.println(name);
}
}
// 2.遍历指定文件夹下以.png结尾的文件,如果有,把文件的绝对路径打印出来
// 1. 创建file对象
File file = new File("/Users/lee/develop/文件知识点测试路径");
// 2. 列举出所有的file对象
File[] listFiles = file.listFiles();
for (File f : listFiles) {
String name = f.getName();
if (name.endsWith(".png")) {
System.out.println(f.getAbsolutePath());
}
}
// 3.批量修改文件名字:图片1,图片2
// 1. 创建file对象
File file = new File("/Users/lee/develop/文件知识点测试路径");
// 2. 列举出所有的file对象
File[] listFiles = file.listFiles();
// 3. 遍历文件,改名字
for (int i = 0; i < listFiles.length; i++) {
// 后缀
String[] split = listFiles[i].getName().split("\\.");// 直接写点不可以
String suffix = split[1];
File dest = new File("/Users/lee/develop/文件知识点测试路径/图片-" + (i+1) + "."
+ suffix);
listFiles[i].renameTo(dest);
}
2.2 练习2
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import org.junit.Test;
/**
* 课后练习2:判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
*
*/
public class FindJPGFileTest {
@Test
public void test1(){
File srcFile = new File("d:\\code");
String[] fileNames = srcFile.list();
for(String fileName : fileNames){
if(fileName.endsWith(".jpg")){
System.out.println(fileName);
}
}
}
@Test
public void test2(){
File srcFile = new File("d:\\code");
File[] listFiles = srcFile.listFiles();
for(File file : listFiles){
if(file.getName().endsWith(".jpg")){
System.out.println(file.getAbsolutePath());
}
}
}
/*
* File类提供了两个文件过滤器方法
* public String[] list(FilenameFilter filter)
* public File[] listFiles(FileFilter filter)
*/
@Test
public void test3(){
File srcFile = new File("d:\\code");
File[] subFiles = srcFile.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".jpg");
}
});
for(File file : subFiles){
System.out.println(file.getAbsolutePath());
}
}
}
2.3 练习3
import java.io.File;
/**
* 3. 遍历指定目录所有文件名称,包括子文件目录中的文件。
拓展1:并计算指定目录占用空间的大小
拓展2:删除指定文件目录及其下的所有文件
* @author shkstart 邮箱:shkstart@126.com
* @version 创建时间:2019年2月23日 上午1:55:31
*
*/
public class ListFilesTest {
public static void main(String[] args) {
// 递归:文件目录
/** 打印出指定目录所有文件名称,包括子文件目录中的文件 */
// 1.创建目录对象
File dir = new File("E:\\teach\\01_javaSE\\_尚硅谷Java编程语言\\3_软件");
// 2.打印目录的子文件
printSubFile(dir);
}
public static void printSubFile(File dir) {
// 打印目录的子文件
File[] subfiles = dir.listFiles();
for (File f : subfiles) {
if (f.isDirectory()) {// 文件目录
printSubFile(f);
} else {// 文件
System.out.println(f.getAbsolutePath());
}
}
}
// 方式二:循环实现
// 列出file目录的下级内容,仅列出一级的话
// 使用File类的String[] list()比较简单
public void listSubFiles(File file) {
if (file.isDirectory()) {
String[] all = file.list();
for (String s : all) {
System.out.println(s);
}
} else {
System.out.println(file + "是文件!");
}
}
// 列出file目录的下级,如果它的下级还是目录,接着列出下级的下级,依次类推
// 建议使用File类的File[] listFiles()
public void listAllSubFiles(File file) {
if (file.isFile()) {
System.out.println(file);
} else {
File[] all = file.listFiles();
// 如果all[i]是文件,直接打印
// 如果all[i]是目录,接着再获取它的下一级
for (File f : all) {
listAllSubFiles(f);// 递归调用:自己调用自己就叫递归
}
}
}
// 拓展1:求指定目录所在空间的大小
// 求任意一个目录的总大小
public long getDirectorySize(File file) {
// file是文件,那么直接返回file.length()
// file是目录,把它的下一级的所有大小加起来就是它的总大小
long size = 0;
if (file.isFile()) {
size += file.length();
} else {
File[] all = file.listFiles();// 获取file的下一级
// 累加all[i]的大小
for (File f : all) {
size += getDirectorySize(f);// f的大小;
}
}
return size;
}
// 拓展2:删除指定的目录
public void deleteDirectory(File file) {
// 如果file是文件,直接delete
// 如果file是目录,先把它的下一级干掉,然后删除自己
if (file.isDirectory()) {
File[] all = file.listFiles();
// 循环删除的是file的下一级
for (File f : all) {// f代表file的每一个下级
deleteDirectory(f);
}
}
// 删除自己
file.delete();
}
}