第一百七十八节 Java IO教程 - Java符号链接、Java文件

news2025/1/10 0:14:23

Java IO教程 - Java符号链接

符号链接包含对另一个文件或目录的引用。

符号链接引用的文件称为符号链接的目标文件。

符号链接上的操作对应用程序是透明的。我们可以使用java.nio.file.Files类处理符号链接。

isSymbolicLink(Path p)方法检查指定路径指定的文件是否是符号链接。

文件的createSymbolicLink()方法(可能不是在所有平台上都支持)创建符号链接。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
    Path existingFilePath = Paths.get("C:\\Java_Dev\\test1.txt");
    Path symLinkPath = Paths.get("C:\\test1_link.txt");
    Files.createSymbolicLink(symLinkPath, existingFilePath);
  }
}

默认情况下,Java NIO API遵循符号链接。我们可以指定是否要遵循符号链接。使用枚举常量LinkOption来指示不遵循符号链接的选项。 NOFOLLOW_LINKS。

LinkOption枚举在java.nio.file包中声明。支持此选项的方法让我们传递LinkOption类型的参数。

我们可以使用Files类的createLink(Path newLink,Path existingPath)方法来创建硬链接。


 

Java IO教程 - Java文件

java.nio.file.Files 包含所有允许我们对Path对象执行大多数文件操作的静态方法。

创建新文件

文件可以创建常规文件,目录,符号链接和临时文件/目录。

大多数方法接受FileAttribute类型的varargs参数,这允许我们指定文件属性。

createFile()方法创建一个新的常规文件。创建的新文件为空。

如果文件已存在,或父目录不存在,文件创建将失败。

以下代码显示如何创建新文件。

import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) {
    Path p1 = Paths.get("test.txt");
    try {
      Files.createFile(p1);
      System.out.format("File created:  %s%n", p1.toRealPath());
    } catch (FileAlreadyExistsException e) {
      System.out.format("File %s  already exists.%n", p1.normalize());
    } catch (NoSuchFileException e) {
      System.out.format("Directory %s  does  not  exists.%n", p1.normalize()
          .getParent());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

上面的代码生成以下结果。

创建目录

createDirectory()和createDirectories()方法创建一个新目录。

如果父目录不存在,createDirectory()方法将失败。

createDirectories()方法创建不存在的父目录。

createTempDirectory()和createTempFile()方法分别创建一个临时目录和一个临时文件。

以下代码显示了如何创建临时文件和目录。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
      String dirPrefix = "KDir";
      Path tDir = Files.createTempDirectory(dirPrefix);
      System.out.println("Temp directory: " + tDir);
      String fPrefix = "Header_";
      String fSuffix = ".txt";
      Path tFile1 = Files.createTempFile(fPrefix, fSuffix);
      System.out.println("Temp file1: " + tFile1);

      Path p1 = Paths.get("C:\\temp");
      Path tFile2 = Files.createTempFile(p1, fPrefix, fSuffix);
      System.out.println("Temp file2: " + tFile2);
  }
}

不会自动删除临时文件/目录。我们可能希望使用java.io.File类的deleteOnExit()方法在JVM退出时删除该文件。

Path  tempFile = Files.createTempFile("myTempFile", ".txt");
tempFile.toFile().deleteOnExit();

上面的代码生成以下结果。

删除文件

从文件中删除(Path p)和deleteIfExists(Path p)以删除文件,目录和符号链接。

如果删除失败,delete()方法将抛出异常。

如果要删除的文件不存在,deleteIfExists()方法不会抛出NoSuchFileException异常。

如果它删除文件,则返回true。否则,它返回false。

以下代码显示如何删除文件和处理异常:

import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
    Path p = Paths.get("C:\\Java_Dev\\test1.txt");

    try {
      Files.delete(p);
      System.out.println(p + "  deleted successfully.");
    } catch (NoSuchFileException e) {
      System.out.println(p + "  does  not  exist.");
    } catch (DirectoryNotEmptyException e) {
      System.out.println("Directory " + p + "  is not  empty.");
    } catch (IOException e) {
      e.printStackTrace();
    }

  }
}

上面的代码生成以下结果。

存在文件

文件类有两个方法,分别是exists(Path p,LinkOption ... options)和notExists(Path p,LinkOption ... options)来检查文件的存在和不存在。

复制文件

文件类复制(Path source,Path target,CopyOption ... options)方法可以将指定的源路径复制到指定的目标路径。

如果指定的源文件是符号链接,则将复制符号链接的目标,而不是符号链接。

如果指定的源文件是目录,则创建目标位置处的空目录,而不复制目录的内容。

我们可以使用copy()方法指定一个或多个以下复制选项:

  • StandardCopyOption.REPLACE_EXISTING
  • StandardCopyOption.COPY_ATTRIBUTES
  • LinkOption.NOFOLLOW_LINKS

我们可以指定REPLACE_EXISTING选项来替换现有的目标文件。

如果目标文件是符号链接,并且如果存在,则通过指定REPLACE_EXISTING选项而不是符号链接的目标来替换符号链接。

COPY_ATTRIBUTES选项将源文件的属性复制到目标文件。

如果使用NOFOLLOW_LINKS选项,则copy()方法复制符号链接,而不是符号链接的目标。

以下代码显示了使用copy()方法复制文件。如果复制操作失败,它会处理可能的异常。

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.DirectoryNotEmptyException;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;

public class Main {
  public static void main(String[] args) {
    Path source = Paths.get("C:\\Java_Dev\\test1.txt");
    Path target = Paths.get("C:\\Java_Dev\\test1_backup.txt");

    try {
      Path p = Files.copy(source, target, REPLACE_EXISTING, COPY_ATTRIBUTES);
      System.out.println(source + "  has  been  copied to " + p);
    } catch (FileAlreadyExistsException e) {
      System.out.println(target + "  already exists.");
    } catch (DirectoryNotEmptyException e) {
      System.out.println(target + "  is not  empty.");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

移动文件

Files类的move(Path source,Path target,CopyOption ... options)方法移动或重命名文件。

如果指定的目标文件已存在,则移动操作将失败。

我们可以指定REPLACE_EXISTING选项来替换现有的目标文件。

如果要移动的文件是符号链接,它将移动符号链接,而不是符号链接的目标。

move()方法只能用于移动一个空目录。

除了REPLACE_EXISTING复制选项,我们可以使用ATOMIC_MOVE作为另一个CopyOption。

如果使用ATOMIC_MOVE选项,如果无法以原子方式移动文件,则会抛出AtomicMoveNotSupportedException。

如果指定ATOMIC_MOVE选项,则忽略所有其他选项。

以下代码显示了如何通过处理可能的异常来移动文件:

import static java.nio.file.StandardCopyOption.ATOMIC_MOVE;

import java.io.IOException;
import java.nio.file.AtomicMoveNotSupportedException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
  public static void main(String[] args) throws Exception {
    Path source = Paths.get("C:\\Java_Dev\\test1.txt");
    Path target = Paths.get("C:\\Java_Dev\\dir2\\test1.txt");

    try {
      Path p = Files.move(source, target, ATOMIC_MOVE);
      System.out.println(source + "  has  been  moved to " + p);
    }catch (NoSuchFileException e) {
      System.out.println("Source/target does  not  exist.");
    } catch (FileAlreadyExistsException e) {
      System.out.println(target + "  already exists.  Move failed.");
    } catch (DirectoryNotEmptyException e) {
      System.out.println(target + "  is not  empty.  Move failed.");
    } catch (AtomicMoveNotSupportedException e) {
      System.out.println("Atomic move is not  supported. MOve  failed.");
    } catch (IOException e) {
      e.printStackTrace();
    }

  }
}

上面的代码生成以下结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决 MDCFilter 引起的 Shiro UnavailableSecurityManagerException 异常:将过滤器交给 Shiro 管理

若将自定义的 MDCFilter 注册到 FilterRegistrationBean 中,而又在 MDCFilter 中使用了和 Shiro 相关的操作(如获取当前登录用户),此时会因为 MDCFilter 先于 SecurityManager 实例化导致出现 UnavailableSecurityManagerExceptio…

C语言 ——— 函数指针数组的讲解及其用法

目录 前言 函数指针数组的定义 函数指针数组的使用 前言 数组是存放一组相同类型数据的存储空间 关于指针数组的知识请见:C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 那么要将多个函数的地址存储到数组中,这个数组该如何定义…

太原高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着科技的不断进步,智能制造已经成为推动制造业转型升级的重要力量。太原高校大学智能制造实验室紧跟时代步伐,积极推进数字孪生可视化系统平台的建设,并于近日圆满完成了项目的验收工作。这一里程碑式的成果,不仅标志着实验室在…

Angular由一个bug说起之八:实践中遇到的一个数据颗粒度的问题

互联网产品离不开数据处理,数据处理有一些基本的原则包括:准确性、‌完整性、‌一致性、‌保密性、‌及时性。‌ 准确性:是数据处理的首要目标,‌确保数据的真实性和可靠性。‌准确的数据是进行分析和决策的基础,‌因此…

Three.js投射光线实现三维物体交互

<template><div id"webgl"></div> </template><script setup> import * as THREE from three //导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入 dat.gui import { GUI } from thre…

谷粒商城实战笔记-43-前端基础-Vue-使用Vue脚手架进行模块化开发

文章目录 一&#xff0c;Vue的模块化开发1&#xff0c;目录结构2&#xff0c;单文件组件 (SFC)3&#xff0c;模块化路由4&#xff0c;Vuex 模块5&#xff0c;动态组件和异步组件6&#xff0c;抽象和复用7&#xff0c;构建和打包8&#xff0c;测试9&#xff0c;文档和注释10&…

基于Neo4j将知识图谱用于检索增强生成:Knowledge Graphs for RAG

Knowledge Graphs for RAG 本文是学习https://www.deeplearning.ai/short-courses/knowledge-graphs-rag/这门课的学习笔记。 What you’ll learn in this course Knowledge graphs are used in development to structure complex data relationships, drive intelligent sea…

Node.js知识点总结

Node.js知识点总结 Node.js其本质和浏览器一样是一个JavaScript运行环境。浏览器的运行环境为V8引擎浏览器内置API&#xff08;BOM、DOM、Canvas);而node.js的运行环境是V8引擎node提供的API(fs、path、http)。它使JavaScript可以编写后端。 基本知识 fs文件系统模块 它提供一…

深度学习复盘与论文复现E

文章目录 一、项目复现的问题及其解决方案1、 Cannot find DGL C graphbolt library2、 “is“ with a literal. Did you mean ““?”3、运行SEG、SPG查看GATNet的网络结构4、关于LI-FPN项目找不到数据粒度不匹配问题5、关于LI-FPN项目num_samples为空6、解决路径问题7、 !ss…

Nginx 怎样处理请求的缓存数据清理策略?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 怎样处理请求的缓存数据清理策略&#xff1f;一、理解 Nginx 缓存的重要性二、Nginx 缓存数据的类型&#xff08;一&#xff09;静态文件缓存&#xff08;…

PHP简单商城单商户小程序系统源码

&#x1f6cd;️轻松开店&#xff0c;触手可及&#xff01;「简单商城小程序」让电商梦想照进现实&#x1f31f; &#x1f389;开店新风尚&#xff0c;「简单商城小程序」引领潮流&#xff01; 还在为繁琐的电商开店流程烦恼吗&#xff1f;想要快速搭建自己的线上商城&#x…

Linux嵌入式学习——数据结构——线性表的链式结构

线性表的链式存储 解决顺序存储的缺点&#xff0c;插入和删除&#xff0c;动态存储问题。 特点&#xff1a; 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c;存储单元可以是连续的&#xff0c;也可以不连续。可以被存储在任意内存未被占…

vue3如何实现分面漏斗图

如下图&#xff1a; 这里我选择采用Vue3g2plot进行实现。 参考网址&#xff1a;https://g2plot.antv.antgroup.com/zh/examples/more-plots/funnel/#facet-transpose 核心代码如下&#xff1a; const data [{ stage: 简历筛选, number: 253, company: A公司 },{ stage: 初…

东京裸机云多IP服务器全面分析

东京裸机云多IP服务器是一种提供多IP地址分配和高性能网络服务的云计算解决方案&#xff0c;广泛应用于需要多IP管理和高稳定性的网络应用。下面将从几个方面具体介绍东京裸机云多IP服务器&#xff0c;rak部落为您整理发布东京裸机云多IP服务器的全面分析。 在数字化时代&#…

Docker 部署常用中间件(redis,rabbitMQ,mysql8,es,kibana,nginx等)亲测成功~~~

Docker 部署常用中间件 在日常开发中必要的环境&#xff0c;大多数都是单点后续持续更新集群模式~~~ docker 安装reids docker pull redis:7.2.5 编辑redis.conf # 绑定地址&#xff0c;默认只允许本机访问 # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 bind 0.0…

学员心得 | 做好这几点,轻松通关云计算HCIE3.0!

烈日当空&#xff0c;骄阳似火&#xff0c;在这炎炎夏日迎来了自己今年一份满意的答卷--华为HCIE云计算“通过”的e妹儿&#xff08;嘿嘿&#xff01;证书也快了&#xff09;。此时此刻&#xff0c;想把自己“辛勤劳作”备考IE的一些经历和建议留给后来的同路人。 “世界上最可…

MySQL练手 --- 619. 只出现一次的最大数字

题目链接&#xff1a;619. 只出现一次的最大数字 思路 这是一个简单题&#xff0c;只出现一次的最大数字&#xff0c;顾名思义&#xff0c;分两个阶段&#xff0c;第一个阶段筛选出只出现一次的数字&#xff0c;第二阶段在生成的新表中筛选出最大值即可。 解题过程 生成一张…

iOS object-C 解答算法:找到所有数组中消失的数字(leetCode-448)

找到所有数组中消失的数字(leetCode-448) 题目如下图:(也可以到leetCode上看完整题目,题号448) 光看题看可能有点难以理解,我们结合示例1来理解一下这道题. 有8个整数的数组 nums [4,3,2,7,8,2,3,1], 求在闭区间[1,8]范围内(即1,2,3,4,5,6,7,8)的数字,哪几个没有出现在数组 …

华为OD机试 - 二叉树计算(Java JS Python C C++)

题目描述 给出一个二叉树如下图所示: 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。 输入描述 2行整数,第1行表示二叉…

MySQL数据库-备份恢复

一、MySQL日志管理 1.为什么需要日志 用于排错用来做数据分析了解程序的运行情况&#xff0c;了解MySQL的性能 2.日志作用 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;就必须保证数据的安全性和完整性&#…