创建File对象:
在Java中想要对文件进行操作,需要先创建一个File对象
通过下面的语句:
我们创建了一个f文件对象
后面是我们为该对象指定的文件路径
这之后我们就可以通过这个对象来对文件进行具体的操作了:
File类的用法:
引入java io包内的File包,就可以对文件对象进行操作了
import java.io.File;
public class Demo_1 {
public static void main(String[] args) throws IOException {
File f = new File("path/to/your/file.txt");
//导入 java.io.File 类。
//
//在 main 方法中创建了一个 File 对象 f,该对象代表了一个文件。
//
//使用 getParent() 方法获取文件的父目录并打印出来。
//
//使用 getName() 方法获取文件的名称并打印出来。
//
//使用 getPath() 方法获取文件的路径并打印出来。
//
//使用 getAbsolutePath() 方法获取文件的绝对路径并打印出来。
//
//使用 getCanonicalPath() 方法获取文件的规范路径并打印出来。注意,这个方法可能会抛出 IOException,
//
// 因此需要在方法声明中添加 throws IOException 来处理可能的异常
System.out.println(f.getParent());
System.out.println(f.getName());
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
}
}
ps:更换path/to/your/file.txt成你要操作的文件
这里我用自己桌面上一个txt文件做演示:
注意:“规范路径”就是类似:"dir//subdir///file.txt"
规范化为 "dir/subdir/file.txt"
或者:将 "dir/./subdir/../file.txt"
规范化为 "dir/file.txt"的操作
public class Demo_2 {
public static void main(String[] args) throws IOException {
File file = new File("path/to/your/desFile");
//检查文件是否存在:
System.out.println(file.exists());
//检查文件是否为目录
System.out.println(file.isDirectory());
//检查文件是否为普通文件
System.out.println(file.isFile());
//创建一个文件并用ret记录是否创建成功
boolean ret = file.createNewFile();
System.out.println("ret = "+ret);
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
}
}
运行结果:
可以看到,这里调用的方法的返回值都是Boolean类型的
根据返回结果说明:我所查找的文件存在,并且不是文件目录,是一个普通文件
但是因为这里我使用了一个本来存在的文件,所以在创建新文件时没有创建成功
现在让我们删掉它:
public class Demo_3 {
public static void main(String[] args){
File file = new File("path/to/your/desFile");
//删除文件并返回是否删除成功信息
boolean ret = file.delete();
System.out.println("ret = "+ ret);
}
}
可以看到现在返回为true,说明文件删除成功了
现在我们再用上面那段代码创建文件:
可以看到,这次file.exists()方法返回了false,文件不存在
所以后面的文件创建成功,返回true
与此同时,创建成功的文件在目标路径点出现(图中设置为桌面):
现在我们给demo.txt里写点东西:
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Demo_8 {
public static void main(String[] args){
try{
OutputStream outputStream = new FileOutputStream("path/to/your/desFile",true);
String s = "Hello World! 你好世界!";
outputStream.write(s.getBytes());
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
上面这段代码使用输出流
创建了一个输出流对象来将数据写入指定文件
在 OutputStream outputStream = new FileOutputStream("path/to/your/desFile",true);
中,第二个参数表示以追加模式打开文件
也就是在文件内容后添加
否则就会首先清除文件原有内容再添加
为demo.txt中写入“Hello World! 你好世界!”
效果:
再使用下面的代码读取文件内的文字:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Demo_10 {
public static void main(String[] args) {
// 指定记事本文件的路径
String filePath = "path/to/your/desFile";
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
// 逐行读取文件内容
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("文件读取错误: " + e.getMessage());
}
}
}
运行:
上面这个程序使用了BufferdReader来读取文件内容
实际上还可以使用Scanner来扫描文件内容并输出:
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Scanner;
public class Demo_9 {
public static void main(String[] args){
try {
InputStream inputStream = new FileInputStream("path/to/your/desFile");
//使用Scanner从文件中读取数据:
Scanner scanner = new Scanner(inputStream);
if(scanner.hasNextLine()){
String line = scanner.nextLine();
System.out.println(line);
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
}
通过创建输入流对象(InputStream)来从指定文件文件中读取数据
使用if检查是否存在可读语句
最后输出文件内容
依旧可以读取文件内容
最后给demo.txt重命名一下:
public class Demo_6 {
public static void main(String[] args){
File srcFile = new File("原文件路径");
File detFile = new File("修改后文件路径");
//判断重命名是否成功:
boolean isSucceed = srcFile.renameTo(detFile);
System.out.println("isSucceed: "+ isSucceed);
}
}
运行成功:
demo.txt文件也被重命名成了Demo.txt:
通过递归的方式查找目标路径文件并删除:
import java.io.File;
import java.util.Scanner;
public class FileSystemOperation {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要扫描的路径:");
String path = scanner.next();
File rootPath = new File(path);
if (!rootPath.isDirectory()) {
System.out.println("您输入的扫描路径有误");
return;
}
System.out.println("请输入要删除文件的关键词:");
String keyWord = scanner.next();
scanDirectory(rootPath, keyWord);
}
private static void scanDirectory(File rootPath, String keyWord) {
File[] files = rootPath.listFiles();
if (files == null) {
return;
}
for (File file : files) {
System.out.println("当前扫描文件:"+file.getAbsolutePath());
if (file.isFile()) {
checkDelete(file, keyWord);
} else if (file.isDirectory()) {
scanDirectory(file, keyWord);
}else{
scanDirectory(file,keyWord);
}
}
}
private static void checkDelete(File file, String keyWord) {
if (file.getName().contains(keyWord)) {
if (file.delete()) {
System.out.println("文件 " + file.getName() + " 已删除");
} else {
System.out.println("文件 " + file.getName() + " 删除失败");
}
}
}
}
首先这段代码使用Scanner来接收一个扫描的路径,并且判断输入的是否是目录
然后创建一个scanDirectory方法
设置成private static:
封装性:
scanDirectory
方法的功能是递归地扫描指定目录下的所有文件和子目录,并进行相应的操作。这个功能是与类的其他部分相互独立的,不需要被外部直接调用。将其设置为私有方法可以隐藏内部实现细节,使得类的使用者无需关心其具体实现,提高了代码的封装性和安全性。静态性:
scanDirectory
方法并不依赖于类的实例状态,而是根据传入的参数执行相应的操作,因此可以将其设置为静态方法。静态方法可以直接通过类名调用,而不需要创建类的实例对象,更符合方法的使用场景
scanDirectory方法接受一个文件路径和一个要删除的目标文件的名称(keyword)
File[] files = rootPath.listFiles():来获取当前路径下所有的文件
并用for来遍历
如果当前文件是一个普通文件不是目录,就调用checkDelete方法来检查
是否符合关键字并删除
删除之后返回信息:
现在,我们将刚才的Demo.txt文件放到下面这个路径中:
D:\File\Example
运行代码:
输入路径
输入关键字:
删除成功!
文件夹中的Demo.txt也被删除: