在 Java 里,java.nio.file.StandardCopyOption
枚举类为文件复制和移动操作定义了标准选项常量,除了前面提到的 REPLACE_EXISTING
、ATOMIC_MOVE
、COPY_ATTRIBUTES
和 NOFOLLOW_LINKS
,并无其他额外的标准选项常量。下面为你详细回顾这些常量及其使用场景:
1. REPLACE_EXISTING
- 作用:在文件复制或移动操作时,若目标文件已存在,此常量可使操作覆盖该文件,而非抛出
FileAlreadyExistsException
异常。 - 示例代码:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;public class ReplaceExistingExample {public static void main(String[] args) {Path source = Paths.get("source.txt");Path target = Paths.get("target.txt");try {Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);System.out.println("文件复制成功,若目标文件存在则已覆盖");} catch (IOException e) {e.printStackTrace();}}
}
2. ATOMIC_MOVE
- 作用:用于文件移动操作,确保操作具备原子性。也就是说,整个移动过程要么完全成功,要么完全失败,不会出现部分移动的状况。这在多线程或多进程环境下保证数据一致性时十分关键。
- 示例代码:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;public class AtomicMoveExample {public static void main(String[] args) {Path source = Paths.get("source.txt");Path target = Paths.get("target.txt");try {Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);System.out.println("文件原子移动成功");} catch (IOException e) {e.printStackTrace();}}
}
3. COPY_ATTRIBUTES
- 作用:在文件复制操作中,使用该常量可将源文件的文件属性(如文件的修改时间、访问时间、权限等)一同复制到目标文件。
- 示例代码:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;public class CopyAttributesExample {public static void main(String[] args) {Path source = Paths.get("source.txt");Path target = Paths.get("target.txt");try {Files.copy(source, target, StandardCopyOption.COPY_ATTRIBUTES);System.out.println("文件复制成功,属性已复制");} catch (IOException e) {e.printStackTrace();}}
}
4. NOFOLLOW_LINKS
- 作用:当源路径是一个符号链接时,默认情况下
Files.copy()
或Files.move()
方法会跟随符号链接并复制或移动链接指向的实际文件。而使用NOFOLLOW_LINKS
常量可避免这种行为,直接复制或移动符号链接本身。 - 示例代码:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;public class NoFollowLinksExample {public static void main(String[] args) {Path source = Paths.get("source_link");Path target = Paths.get("target_link");try {Files.copy(source, target, StandardCopyOption.NOFOLLOW_LINKS);System.out.println("符号链接复制成功");} catch (IOException e) {e.printStackTrace();}}
}
这些常量可以单独使用,也能通过位运算组合使用,以满足不同的文件操作需求。不过要注意,具体操作是否支持某些选项可能受底层文件系统特性的影响。