- 注意:如果对文件概念不是特别理解而,可查看(王道408考研操作系统)第四章文件管理-第一节1:文件管理初识
本小节内容主要目的是让Java可以操控系统中的目录或文件,完成如新建、删除、重命名等操作
一:Java.io.File
(1)概述
Java.io.File:在Java中,是通过Java.io.File
类来对一个文件(或目录)进行抽象描述的
File
属性:
File
构造方法:
- 注意:
File file = new File()
并不要求该文件必须真实存在
File
方法:
(2)示例
示例1:分别传入一个文件的相对路径和绝对路径,然后构造File
对象f_relative
和f_absolute
,测试getParent()
、getName()
、getPath()
、getAbsolutePath()
、getCanonicalPath()
- 注意1:下面的
test.txt
我并没有真实创建 - 注意2:使用相对路径时,
.
指的是基准路径
import java.io.File;
import java.io.IOException;
public class TestDemo {
public static void main(String[] args) throws IOException {
// 分别给定相对路径和绝对路径
File f_relative = new File("./test.txt");
File f_absolute = new File("F:/RenataReaction/VcKlmentor/FIleOperation//src//test.txt");
// 使用相对路径
System.out.println("返回File对象所在目录路径:" + f_relative.getParent());
System.out.println("返回File对象文件名称:" + f_relative.getName());
System.out.println("返回File对象文件路径:" + f_relative.getPath());
System.out.println("返回File对象绝对路径:" + f_relative.getAbsolutePath());
System.out.println("返回File对象修饰过的绝对路径:" + f_relative.getCanonicalPath());
// 使用绝对路径
System.out.println("--------------------------------------------------------------------");
System.out.println("返回File对象所在目录路径:" + f_absolute.getParent());
System.out.println("返回File对象文件名称:" + f_absolute.getName());
System.out.println("返回File对象文件路径:" + f_absolute.getPath());
System.out.println("返回File对象绝对路径:" + f_absolute.getAbsolutePath());
System.out.println("返回File对象修饰过的绝对路径:" + f_absolute.getCanonicalPath());
}
}
示例2:对test.txt
进行判断,包括exists()
是否存在、isDirectory()
是否是一个目录、isFile()
是否是一个普通文件
public class TestDemo2 {
public static void main(String[] args) {
File f = new File("./test.txt");
// 判断文件是否存在
System.out.println(f.exists());
// 判断是否是目录
System.out.println(f.isDirectory());
// 判断是否是普通文件
System.out.println(f.isFile());
}
}
然后使用creatNewFile()
创建文件,再进行判断
import java.io.File;
import java.io.IOException;
public class TestDemo2 {
public static void main(String[] args) throws IOException {
File f = new File("./test.txt");
// 判断文件是否存在
System.out.println(f.exists());
// 判断是否是目录
System.out.println(f.isDirectory());
// 判断是否是普通文件
System.out.println(f.isFile());
// 把test.txt创建出来
f.createNewFile();
System.out.println("-------------------------------------------------");
// 判断文件是否存在
System.out.println(f.exists());
// 判断是否是目录
System.out.println(f.isDirectory());
// 判断是否是普通文件
System.out.println(f.isFile());
}
}
最后使用delete()
删除文件,再进行判断
import java.io.File;
public class TestDemo3 {
public static void main(String[] args) {
File f = new File("./test.txt");
System.out.println(f.exists());
// 删除文件
f.delete();
System.out.println(f.exists());
}
}
示例3:使用mkdir
创建File
对象所描述的目录
import java.io.File;
public class TestDemo4 {
public static void main(String[] args) {
File f = new File("./testDir");
f.mkdir();
System.out.println(f.isDirectory());
}
}
使用mkdirs
创建File
对象所描述的多级目录
import java.io.File;
public class TestDemo4 {
public static void main(String[] args) {
File f = new File("./testDir1/testDir2/testDir3");
f.mkdirs();
}
}
示例5:使用renameTo
完成文件重命名
import java.io.File;
import java.io.IOException;
public class TestDemo5 {
public static void main(String[] args) throws IOException {
File srcFile = new File("./aaa.txt");
File destFile = new File("./bbb.txt");
srcFile.createNewFile();
if (srcFile.exists() == true)
System.out.printf("aaa.txt已存在");
srcFile.renameTo(destFile);
}
}
示例6:使用list
列出File
对象所表示目录下的所有文件名,返回类型为String[]
import java.io.File;
import java.util.Arrays;
public class TestDemo6 {
public static void main(String[] args) {
File f = new File("./");
String[] results = f.list();
System.out.println(Arrays.toString(results));
}
}
二:程序案例
接下来我们就是用Java结合上面所学知识做一些小案例,实现一些有关对文件系统管理的小功能
(1)案例1
案例1:扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),然后询问用户是否需要删除该文件
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
public class TestDemo13 {
public static void main(String[] args) throws IOException {
// 用户输入信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入待删除的目录路径:");
File rootDir = new File(scanner.next());
if (rootDir.exists()) {
if (rootDir.isDirectory()) {
System.out.println("待删除目录为:" + rootDir.getCanonicalPath());
} else {
System.out.println("错误!不是目录");
}
} else {
System.out.println("错误!该目录不存在");
}
System.out.println("请输入待删除关键字:");
String toDelete = scanner.next();
scanner.close();
// 开始遍历目录
scanDir(rootDir, toDelete);
}
private static void scanDir(File rootDir, String toDelete) throws IOException {
System.out.println("当前访问目录为:" + rootDir.getCanonicalPath());
File[] files = rootDir.listFiles();
if (files == null) {
// 说明目录为空
return;
}
// 如果目录不空,则遍历该目录
for (File f : files) {
if (f.isDirectory()){
// 如果f还是一个目录则再次遍历
scanDir(f, toDelete);
} else {
// 如果是一个普通文件则判断是否满足删除条件
checkAndDelete(f, toDelete);
}
}
}
private static void checkAndDelete(File f, String toDelete){
if (f.getName().contains(toDelete)){
System.out.println("文件" + f.getName() + "中包含" + toDelete + ", 是否删除(y/n)?");
Scanner scanner = new Scanner(System.in);
String choice = scanner.next();
if (choice.equals("y") || choice.equals("n")){
f.delete();
}
}
}
}
(2)案例2
案例2:实现普通文件的复制
- 需要下一节的知识:第十八章第二节:Java之文件内容读写(字节流和字符流文件)
import java.io.*;
import java.util.Scanner;
public class TestDemo14 {
public static void main(String[] args) {
// 输入源文件和目标文件
Scanner scanner = new Scanner(System.in);
System.out.println("请输入源文件");
File srcFile = new File(scanner.next());
System.out.println("请输入目标文件");
File destFile = new File(scanner.next());
if (srcFile.exists()) {
if (!srcFile.isFile()) {
// 不是普通文件
System.out.println("源文件非普通文件请重新输入!");
return;
}
} else {
System.out.println("源文件不存在");
return;
}
if (!destFile.getParentFile().isDirectory()) {
// 如果目标文件的目录不存在报错
System.out.println("目标文件目录不存在");
return;
}
// 打开源文件按照字节读取内容然后再写入到目标文件中去
try(InputStream inputStream = new FileInputStream(srcFile);
OutputStream outputStream = new FileOutputStream(destFile)) {
while (true) {
int ret = inputStream.read();
if (ret == -1){
break;
}
outputStream.write(ret);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
(3)案例3
案例3:扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class TestDemo15 {
public static void main(String[] args) throws IOException {
// 输入
Scanner scanner = new Scanner(System.in);
System.out.println("请输入扫描路径:");
File rootDir = new File(scanner.next());
String toFind = scanner.next();
// 扫描
scanDir(rootDir, toFind);
}
private static void scanDir(File rootDir, String toFind) throws IOException {
File[] files = rootDir.listFiles();
if (files == null){
return;
}
for (File f : files){
if (f.isDirectory()){
scanDir(f, toFind);
} else {
checkFile(f, toFind);
}
}
}
private static void checkFile(File f, String toFind) throws IOException {
// 检查
if (f.getName().contains(toFind)) {
System.out.println(f.getCanonicalFile() + "文件中包含 " + toFind);
}
// 检查文件内容
try (InputStream inputStream = new FileInputStream(f)) {
StringBuilder stringBuilder = new StringBuilder();
Scanner scanner = new Scanner(inputStream);
// 按行读取
while (scanner.hasNextLine()){
stringBuilder.append(scanner.nextLine() + "\n");
}
if (stringBuilder.indexOf(toFind) > -1){
System.out.println(f.getCanonicalPath() + "文件内容包含" + toFind);
}
}
}
}
评论区