Java 文件操作
复制文件
实现从源文件路径复制一个文件到另一个目标路径下
首先,使用exists()方法检验输入的源文件是否存在,再使用isFile()方法检验源文件是否是普通文件。
输入目标路径后,再次使用exists()方法检验是否已经存在,防止出现同名,在通过.getParentFile()来检验目标路径的父目录是否存在。
最后进行读取和写入,达到复制的目的。
import java.io.*;
import java.sql.SQLOutput;
import java.util.Scanner;
public class Demo7 {
public static void main(String[] args){
// 1.获取用户输入的源文件路径
System.out.println("请输入源文件路径");
Scanner scanner = new Scanner(System.in);
// 获取用户的输入
String sourcePath = scanner.next();
// 2.校验文件是否符合要求
File sourceFile = new File(sourcePath);
// 是否存在
if(!sourceFile.exists()){
System.out.println("输入的源文件不存在");
return;
}
// 是否普通文件
if(!sourceFile.isFile()){
System.out.println("输入的源文件不是普通文件");
return;
}
// 3. 用户输入目标文件
System.out.println("请输入目标文件的路径");
String destPath = scanner.next();
// 创建一个文件对象
File destFile = new File(destPath);
// 是否存在
if(destFile.exists()){
System.out.println("目标文件已存在,请重新输入");
return;
}
// 判断父目录是否存在
if(!destFile.getParentFile().exists()){
System.out.println("目标路径的父目录不存在");
return;
}
// 关闭scanner
scanner.close();
// 实现读写操作,定义输入流和输出流
try(InputStream inputStream =new FileInputStream(sourceFile);
OutputStream outputStream = new FileOutputStream(destFile)){
// 定义一个数组
byte[] bytes = new byte[1024];
// 循环读取源文件
while (true){
// 读取
int len = inputStream.read(bytes);
if(len == -1){
break;
}
// 把读到的内容写入目标文件
outputStream.write(bytes, 0, len);
}
outputStream.flush();
// 打印
System.out.println("复制成功" + sourcePath + "-->" + destPath);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
扫描关键字
实现在一个目录中扫描文件中或文件名是否包含所给关键字
首先,先通过exists()方法检验输入的路径是否存在,再通过isDirectory()来检验其是否为有效目录。
定义checkFile方法进行文件的检验,使用contains()方法对每个file进行文件名的检验。通过创建StringBuilder来保存Scanner中接收的inputStream的读取。再使用indexOf()方法来判断其中是否包含关键字。所有的包含返回true,不包含返回false。
通过定义scan方法来实现目录的扫描。创建数组File[] files = rootFile.listFiles();通过for each对其中所有文件进行检验。使用checkFile方法来判断文件中或文件名是否包含关键字。如果包含,打印出包含关键字的文件名,通过输入y或n来进行删除。
import java.io.*;
import java.util.Scanner;
public class Demo8 {
public static void main(String[] args) {
// 1. 获取要扫描的目录
System.out.println("请输入要扫描的目录:");
Scanner scanner = new Scanner(System.in);
String rootPath = scanner.next();
// 根据用户的输入创建一个文件对象
File rootFile = new File(rootPath);
// 2. 判断路径是否有效
// 是否存在
if(!rootFile.exists()){
System.out.println("输入的路径不存在");
return;
}
// 是否目录
if(!rootFile.isDirectory()){
System.out.println("输入的路径不是一个有效目录");
return;
}
// 3. 获取用户输入的关键字
System.out.println("请输入关键字");
String keyword = scanner.next();
// 校验关键字
if(keyword == null || keyword.isEmpty()){
System.out.println("输入的关键字不能为空");
return;
}
// 查找过程
scan(rootFile,keyword);
}
private static void scan(File rootFile, String keyword) {
// 1. 获取扫描目录下的所有子目录和普通文件
File[] files = rootFile.listFiles();
// 校验数组是否为空
if(files.length == 0){
return;
}
// 遍历数组中的所有文件
for (File file : files){
// 判断文件是不是普通文件
if (file.isFile()) {
// 1. 判断文件是不是普通文件
// 2. 读取文件内容,内容中是否包含关键字
boolean bool = checkFile(file, keyword);
if(!bool){
// 没有找到目标文件
continue;
}
// 接受用户的删除指令
System.out.println("找到文件" + file.getAbsolutePath() + "包含关键字:" + keyword + ",是否删除?(Y/N)");
Scanner scanner = new Scanner(System.in);
String opt = scanner.next();
if(opt.toLowerCase().equals("y")){
//删除操作
file.delete();
System.out.println("删除文件:" + file.getAbsolutePath() + "成功");
}
}else {
// File是目录, 递归执行
scan(file, keyword);
}
}
}
private static boolean checkFile(File file, String keyword) {
// 1. 判断文件名是否包含关键字
// 2. 读取文件内容,内容中是否包含关键字
String fileName = file.getName();
if(fileName.contains(keyword)){
// 在文件名中找到了关键字
return true;
}
// 2. 读取文件内容,内容中是否包含关键字
try(InputStream inputStream = new FileInputStream(file);) {
// 创建用于保存文件内容的对象
StringBuilder stringBuilder = new StringBuilder();
// 创建一个Scanner用来简化文本文件的读取
Scanner scanner = new Scanner(inputStream);
while (true){
// 判断文件是否到结尾
if(!scanner.hasNextLine()){
break;
}
// 把内容添加到stringBuilder中
stringBuilder.append(scanner.nextLine());
}
// 校验内容中是否包含关键字
if (stringBuilder.indexOf(keyword) > -1) {
return true;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
// 文件不符合查找要求
return false;
}
}