Java 文件操作
在平时编写程序的时候,经常会对文件进行操作,比如文件的赋值,重命名,删除等。接下来学习使用 Java 操作文件。
拷贝
可以使用 Files 工具类的 copy(Path source,Path target,CopyOption… options) 拷贝文件或者目录。如果目标文件存在,那么赋值将失败,除非我们在 options 中指定了 REPLACE_EXISTING 属性。当该命令复制目录时,如果目录中已经有了文件,目录中的文件将不会被复制。CopyOption 参数支持以下 StandardCopyOption 和 LinkOption 枚举:
- REPLACE_EXISTING:即使目标文件已存在,也执行复制。如果目标是符号链接,则复制链接本身(而不是链接的目标)。如果目标是非空目录,则复制将失败并显示 FileAlreadyExistsException 异常。
- COPY_ATTRIBUTES:将与文件关联的文件属性复制到目标文件。支持的确切 - 文件属性是文件系统和平台相关的,但 last-modified-time 跨平台支持并复制到目标文件。 NOFOLLOW_LINKS:表示不应遵循符号链接。如果要复制的文件是符号链接,则复制链接(而不是链接的目标)。
编程实例
新建文件 1.txt。 在 项目目录下新建源代码文件 CopyDemo.java。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | import java.io.IOException;import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
 
 public class CopyDemo {
 public static void main(String[] args) {
 try {
 //被拷贝的文件一定要存在 否则会抛出异常  这里的1.txt一定要存在
 Files.copy(Paths.get("/home/project/1.txt"), Paths.get("/home/project/2.txt"), StandardCopyOption.REPLACE_EXISTING);
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }
 
 | 
编译运行:
| 12
 
 | $ javac CopyDemo.java$ java CopyDemo
 
 | 
查看目录,如果没有报错,那么可以看到 1.txt 已经被复制了一份,叫做 2.txt。
(如果 1.txt 里面输入了内容 2.txt 也会存在)
移动和重命名
Files 类的 move(Path, Path, CopyOption… options) 方法移动文件或者目录,同样目标目录存在,那么比如使用REPLACE_EXISTING。 options 参数支持 StandardCopyOption 的以下枚举:
- REPLACE_EXISTING:即使目标文件已存在,也执行移动。如果目标是符号链接,则替换符号链接,但它指向的内容不受影响。
- ATOMIC_MOVE:将移动作为原子文件操作执行。如果文件系统不支持原子移动,则抛出异常。使用,ATOMIC_MOVE 您可以将文件移动到目录中,并保证观察目录的任何进程都可以访问完整的文件。
move 方法除了可以移动之外,也可以用与重命名。
编程实例
新建源代码文件 MoveDemo.java
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | import java.io.IOException;import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
 
 public class MoveDemo {
 public static void main(String[] args) {
 try {
 //将1.txt 重命名为3.txt 如果只需要移动到不同的目录,文件名不变即可
 Files.move(Paths.get("/home/project/1.txt"), Paths.get("/home/project/3.txt"), StandardCopyOption.REPLACE_EXISTING);
 
 } catch (IOException e) {
 e.printStackTrace();
 }
 
 }
 }
 
 | 
编译运行:
| 12
 
 | $ javac MoveDemo.java$ java MoveDemo
 
 | 
查看目录结构,可以看到之前的 1.txt 已经变成了 3.txt 
删除
可以通过 Files 的 delete(Path path) 方法或者 deleteIfExists(Path path) 方法删除文件。
编程实例
新建源代码文件 DeleteDemo.java:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | import java.io.File;import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 
 public class DeleteDemo {
 public static void main(String[] args) {
 try {
 //删除文件,文件必须存在,否则抛出异常
 Files.delete(Paths.get("/home/project/3.txt"));
 //删除文件,返回是否删除成功 即使文件不存在,也不会保存,直接返回false
 System.out.println(Files.deleteIfExists(Paths.get("/home/project/3.txt")));
 //或者使用File类的delete方法
 File file = new File("/home/project/2.txt");
 System.out.println(file.delete());
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }
 
 
 | 
编译运行:
| 12
 3
 4
 
 | $ javac DeleteDemo.java$ java DeleteDemo
 false
 true
 
 | 
再次查看文件目录,2.txt 、3.txt 已经不存在了。
文件属性
Java 使用 File 类表示文件或者目录,可以通过 File 类获取文件或者目录的相关属性。
编程实例
新建源代码文件FileInfo.java
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | import java.io.File;import java.util.Arrays;
 
 public class FileInfo {
 public static void main(String[] args) {
 File file = new File("/home/project");
 System.out.println("文件或者目录名:" + file.getName());
 System.out.println("绝对路径:" + file.getAbsolutePath());
 System.out.println("父目录:" + file.getParent());
 System.out.println("文件路径:" + file.getPath());
 //判断文件是否是目录
 if (file.isDirectory()) {
 //打印目录中的文件
 Arrays.stream(file.list()).forEach(System.out::println);
 }
 System.out.println("是否隐藏:" + file.isHidden());
 System.out.println("是否存在:" + file.exists());
 }
 }
 
 | 
上述代码,可以根据个人情况更换 File Path 直接获取结果
目录读取
Java 中读取目录中的文件可以直接使用 listFiles() 方法读取,但是也只能读取当前目录中的文件,如果当前目录中还有二级目录如何解决呢?三级目录呢?接下来将使用 Java 读取当前目录和子目录中的所有文件。
编程实例
新建源代码文件 ReadDir.java
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 | import java.io.File;public class ReadDir {
 public static void main(String[] args) {
 readDir(new File("/home"));
 }
 
 public static void readDir(File file) {
 if (file == null) {
 return;
 }
 //如果当前file是目录
 if (file.isDirectory()) {
 File[] files;
 //如果目录不为空
 if ((files = file.listFiles()) != null) {
 for (File file1 : files) {
 //递归读取目录内容
 readDir(file1);
 }
 }
 } else {
 //如果不是目录 直接输出文件名
 System.out.println(file.getName());
 }
 }
 }
 
 | 
上述代码,可以根据个人情况更换 File Path (注意 为了更好的效果最好是三级目录读取)