import java.io.*;
public class FileTest
{
public static void main(String[] args)
throws IOException
{
// 以当前路径来创建一个File对象
File file = new File(".");
// 直接获取文件名,输出一点
System.out.println(file.getName());
// 获取相对路径的父路径可能出错,下面代码输出null
System.out.println(file.getParent());
// 获取绝对路径
System.out.println(file.getAbsoluteFile());
// 获取上一级路径
System.out.println(file.getAbsoluteFile().getParent());
// 在当前路径下创建一个临时文件
File tmpFile = File.createTempFile("aaa", ".txt", file);
// 指定当JVM退出时删除该文件
tmpFile.deleteOnExit();
// 以系统当前时间作为新文件名来创建新文件
File newFile = new File(System.currentTimeMillis() + "");
System.out.println("newFile对象是否存在:" + newFile.exists());
// 以指定newFile对象来创建一个文件
newFile.createNewFile();
// 以newFile对象来创建一个目录,因为newFile已经存在,
// 所以下面方法返回false,即无法创建该目录
newFile.mkdir();
// 使用list()方法来列出当前路径下的所有文件和路径
String[] fileList = file.list();
System.out.println("====当前路径下所有文件和路径如下====");
for (String fileName : fileList)
{
System.out.println(fileName);
}
// listRoots()静态方法列出所有的磁盘根路径。
File[] roots = File.listRoots();
System.out.println("====系统所有根路径如下====");
for (File root : roots)
{
System.out.println(root);
}
}
}
在Jdk7中,新增了java.nos.file包及各个子包,提供了Files和Paths两个工具类,方便对文件系统的操作。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class FilesTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
Path path = Paths.get("src/notes/io/FilesTest.java");
// 复制文件
Files.copy(path, new FileOutputStream("src/notes/io/CopyFilesTest.txt"));
// 判断FilesTest.java是不是隐藏文件
System.out.println("FilesTest.java是隐藏文件么?" + Files.isHidden(path));
// 一次性读取FilesTest.java文件的所有行
List<String> lines = Files.readAllLines(path);
System.out.println(lines);
// 判断文件的大小
System.out.println("FilesTest.java的文件大小为" + Files.size(path));
List<String> poem = new ArrayList<>();
poem.add("野火烧不尽");
poem.add("春风吹又生");
// 直接将多个字符串内容写入到指定文件中
Files.write(Paths.get("src/notes/io/CopyFilesTest.txt"), poem, Charset.forName("utf-8"));
}
}
Files工具类还提供了编辑文件和子目录的方法:
walkFileTree(Path start,FileVisitor<? super Path>Visitor):遍历start路径下的所有文件和子目录
walkFileTree(Path start,Set<FileVisitOption>) options,int maxDepth,FieVisitor<? super Path>visitor):
与上一个方法的功能类似,该方法最多遍历maxDepth深度的文件
上面两个方法都需要FileVistor参数,FileVisitor代表了一个文件访问器,walkFileTree()方法会自动遍历start路径下的所有文件和子目录,遍历文件和子目录都会“触发”FileVisitor中相应的方法,FileVisitor中定义了如下4个方法:
FileVisitResult postVisitDirectory(...):访问子目录之后触发该方法
FileVisiResult preVisitDirectory(...): 访问子目录之前触发该方法
FileVisiResult visitFile(...);访问file文件时触发该方法
FileVisiResult visitFileFailed(...): 访问file文件失败时触发该方法
上面4个方法都返回一个FileVisiResult 对象,它是一个枚举类,代表访问之后的后续行为。
FileVisiResult 定义了如下几个后续行为:
CONTINUE:代表“继续访问”的后续行为。
SKIP_SIBLINGS:代表"继续访问"的后续行为,但不访问该文件或目录的兄弟文件或目录。
TERMINATE:代表“中止访问”的后续行为
SKIP_SUBTREE:代表"继续访问"的后续行为,但不访问该文件或目录的子目录树。
在实际编程时没有必要为FileVisitor的4个方法都提供实现,可以通过继承SimpleFileVisitor(FileVisitor的实现类)来实现自己的“文件访问器”,这样就根据需要、选择性的重写指定方法了
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class FileVisitorTest {
public static void main(String[] args) throws IOException {
Files.walkFileTree(Paths.get("d:", "java", "code", "Demo1"), new SimpleFileVisitor<Path>() {
// 访问文件是出发该方法
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("正在访问:" + dir + "路径");
return FileVisitResult.CONTINUE;
}
// 开始访问目录时出发该方法
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("正在访问" + file + "文件");
// 找到FileVistorTest.java文件
if (file.endsWith("FileVisitorTest.java")) {
System.out.println("--已经找到目标文件--");
return FileVisitResult.TERMINATE;
}
return FileVisitResult.CONTINUE;
}
});
}
}
Path类还提供了一个方法来监听文件系统的变化
import java.io.IOException;
import java.nio.file.*;
public class WatchServiceTest {
public static void main(String[] args) throws IOException, InterruptedException {
// 获取文件系统的WarchService对象
WatchService watchService = FileSystems.getDefault().newWatchService();
// 为C:盘根路径注册监听
Paths.get("c:/").register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
while (true) {
// 获取下一个文件变化事件
WatchKey key = watchService.take();
for (WatchEvent<?> event : key.pollEvents()) {
System.out.println(event.context() + "文件发送了 " + event.kind() + "事件");
}
// 重设WatchKey
boolean valid = key.reset();
// 如果重设失败,退出监听
System.out.println(valid);
if (!valid) {
break;
}
}
}
}