学习IO流之File类和Files类的使用

本文介绍如何使用Java进行文件系统操作,包括使用File类创建、读取、列出文件,使用Files工具类复制、读取文件内容,以及遍历目录树、监听文件系统变化等高级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值