首页 > 编程语言 >第一百七十六节 Java IO教程 - Java文件系统、Java路径

第一百七十六节 Java IO教程 - Java文件系统、Java路径

时间:2024-07-23 15:29:19浏览次数:13  
标签:路径 Java java 对象 十六节 第一百七 Path txt

Java IO教程 - Java文件系统

Java 7引入了新的输入/输出2(NIO.2)API并提供了一个新的 I/O API。

它向Java类库添加了三个包:java.nio.file,java.nio.file.attribute和java.nio.file.spi。

文件系统

FileSystem类的对象表示Java程序中的文件系统。

FileSystem对象用于执行两个任务:

  • Java程序和文件系统之间的接口。
  • 一个工厂用于创建许多类型的文件系统相关对象和服务。

FileSystem对象与平台相关。

创建文件系统

要获取默认的FileSystem对象,我们需要使用FileSystems类的getDefault()静态方法,如下所示:

FileSystem fs  = FileSystems.getDefault();

FileSystem由一个或多个FileStore组成。FileSystem的getFileStores()方法返回FileStore对象的Iterator。

FileSystem的getRootDirectories()方法返回Path对象的迭代器,它表示到所有顶级目录的路径。

FileSystem的isReadOnly()方法告诉我们是否获得对文件存储的只读访问权限。

例子

以下代码显示如何使用FileSystem对象。

import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.io.IOException;

public class Main {
  public static void main(String[] args) {
    FileSystem fs = FileSystems.getDefault();

    System.out.println("Read-only file system: " + fs.isReadOnly());
    System.out.println("File name separator: " + fs.getSeparator());

    for (FileStore store : fs.getFileStores()) {
      printDetails(store);
    }
    for (Path root : fs.getRootDirectories()) {
      System.out.println(root);
    }
  }

  public static void printDetails(FileStore store) {
    try {
      String desc = store.toString();
      String type = store.type();
      long totalSpace = store.getTotalSpace();
      long unallocatedSpace = store.getUnallocatedSpace();
      long availableSpace = store.getUsableSpace();
      System.out.println(desc + ", Total: " + totalSpace + ",  Unallocated: "
          + unallocatedSpace + ",  Available: " + availableSpace);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

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


 

Java IO教程 - Java路径

Path 对象表示文件系统中文件,目录和符号链接的路径。

Path 是java.nio.file包中的一个接口。

当我们创建一个Path对象时,路径不一定存在。

Path 可以使用旧的java.io.File apI。我们可以使用File类的方法toPath()从File对象中获取一个Path对象

我们可以使用Path对象的toFile()方法从Path对象中获取File对象。

我们可以对Path对象执行两种操作:

  • 路径操作
  • 文件操作

我们可以使用 Path 来访问路径的组件,例如文件名,根名等。

我们可以比较和检查路径。例如,检查路径以.txt结尾,比较两个路径是否相同,检查路径是绝对路径还是相对路径等。我们还可以组合和解析路径。

我们需要使用 Files 类在 Path 对象上执行文件I/O操作。

创建路径对象

FileSystem对象充当工厂来创建Path对象

FilePath中的getPath()方法创建一个Path对象。

以下代码在Windows上为文件路径C:\Java_Dev\test1.txt创建一个Path对象:

Path  p1  = FileSystems.getDefault().getPath("C:\\Java_Dev\\test1.txt");

我们可以在构造Path对象时将路径的组件单独传递给getPath()方法。

以下语句创建一个Path对象以表示Windows上的C:\Java_Dev\test1.txt路径:

Path  p2  = FileSystems.getDefault().getPath("C:", "Java_Dev",   "test1.txt");

Paths 类可以从路径字符串或URI的组件创建 Path 对象。

Paths.get()静态方法创建一个Path对象。

以下创建 Path 对象来表示相同的路径C:\Java_Dev\test1.txt:

Path  p3  = Paths.get("C:\\Java_Dev\\test1.txt");
Path  p4  = Paths.get("C:", "Java_Dev", "test1.txt");

我们可以从一个空路径创建一个 Path 对象,例如Paths.get(“")。具有空路径的Path对象是指与当前工作目录相同的默认目录。

路径的组件

文件系统中的路径由一个或多个组件组成。

getNameCount()方法返回除了根之外的Path对象中的组件数量。

例如,路径C:\Java_Dev\test1.txt由三个组件组成:C:的根和名为Java_Dev和test1.txt的两个组件。这种情况下,getNameCount()方法将返回2。

getName(int index)方法返回指定索引处的组件名称。最靠近根的组件的索引为0。

离根最远的组件的索引为count - 1.在路径中。

C:\Java_Dev\test1.txt,Java_Dev组件的索引为0,test1.txt组件的索引为1。

getParent()方法返回路径的父代。如果路径没有父级,则返回null。

路径C:\Java_Dev\test.txt的父目录是C:\Java_Dev。

相对路径test.txt没有父级。

getRoot()方法返回路径的根。如果路径没有根,它返回null。

例如,Windows上的路径C:\Java_Dev\test1.txt具有C:\作为其根。

getFileName()方法返回由路径表示的文件名。

如果路径没有文件名,则返回null。文件名是根的最远组件。例如,在路径C:\Java_Dev\test1.txt中,test1.txt是文件名。

我们可以通过使用isAbsolute()方法来检查路径是否代表绝对路径。

路径不必存在以获取有关其组件的信息。

以下代码显示了如何访问Path对象的组件。

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

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

    Path p2 = Paths.get("test1.txt");
    printDetails(p2);
  }

  public static void printDetails(Path p) {
    System.out.println("Details for path: " + p);

    int count = p.getNameCount();
    System.out.println("Name count: " + count);

    for (int i = 0; i < count; i++) {
      Path name = p.getName(i);
      System.out.println("Name at  index   " + i + "  is " + name);
    }

    Path parent = p.getParent();
    Path root = p.getRoot();
    Path fileName = p.getFileName();
    System.out.println("Parent: " + parent + ", Root:   " + root
        + ", File Name: " + fileName);
    System.out.println("Absolute Path: " + p.isAbsolute());
  }
}

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

不同形式的路径

我们可以得到一个路径的不同类型的表示。假设我们创建一个Path对象,如下所示:

Path  p1  = Paths.get("test.txt");

这里,p1是相对路径。我们可以使用其toAbsolutePath()方法获得由p1表示的绝对路径,如下所示:

Path  p1AbsPath  = p1.toAbsolutePath();

现在p1AbsPath是p1的绝对路径。例如,在Windows上,p1AbsPath可能看起来像C:\testapp\test.txt。

如果路径不是绝对路径,toAbsolutePath()方法使用默认目录来解析路径。

如果路径是绝对路径,toAbsolutePath()方法返回相同的路径。

我们可以使用toRealPath()方法来获取现有文件的真实路径。它返回到现有文件的规范路径。如果路径表示符号链接,则它返回目标文件的实际路径。

我们可以传递一个链接选项到这个方法,指示我们是否要跟踪到它的目标的符号链接。

如果路径表示的文件不存在,toRealPath()会抛出一个IOException异常。

以下代码显示了如何从Path对象获取实际路径:

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

public class Main {
  public static void main(String[] args) throws Exception {

    Path p2 = Paths.get("test2.txt");
    // Follow link for p2, if it is a symbolic link
    Path p2RealPath = p2.toRealPath();
    System.out.println("p2RealPath:" + p2RealPath);
    Path p3 = Paths.get("test3.txt");
    // Do not follow link for p3, if it is a symbolic link
    Path p3RealPath = p3.toRealPath(LinkOption.NOFOLLOW_LINKS);
    System.out.println("p3RealPath:" + p3RealPath);

  }
}

路径URI

使用Path的toUri()方法来获取其URI表示。

以下代码显示了如何获取路径的URI形式。

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

public class Main {
  public static void main(String[] args) throws Exception {
    Path p2 = Paths.get("test2.txt");
    java.net.URI p2UriPath = p2.toUri();
    System.out.println("Absolute Path: " + p2.toAbsolutePath());
    System.out.println("URI Path: " + p2UriPath);

  }
}

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

标签:路径,Java,java,对象,十六节,第一百七,Path,txt
From: https://blog.csdn.net/2301_78772942/article/details/140637422

相关文章

  • Java实现七大排序(二)
    一.交换排序1.冒泡排序这个太经典了,每个学编程都绕不开的。原理跟选择排序差不多,不过冒泡排序是直接交换。publicstaticvoidbubbleSort(int[]array){for(inti=0;i<array.length-1;i++){for(intj=0;j<array.length-1-i;j++)......
  • 三种语言实现归并排序(C++/Python/Java)
    题目给定你一个长度为......
  • 系统整容纪:揭秘Java编程之美:掌握这些编码规范,让你的代码一跃成为行业典范
     分享工作中的点点滴滴,贯彻千里之行,始于足下,最终以微不足道的量变引起化蝶的质变精神。以自己为例拒绝在舒适的中央区域安逸的躺着,以便在不知不觉中被社会所淘汰,也不盲目的直接跃迁进困哪区域,在受挫的同时又跌回原有的舒适区域内,造成这样一个浑浑噩噩的让人无法进步的循环怪圈......
  • 实例说明如何使用Java 8的Function接口使得代码更加简洁以及降低重复性
    什么是Function接口?Function接口是Java8中引入的一个功能性接口,位于java.util.function包下。它代表了一个接受一个参数并产生结果的函数。这个接口只有一个抽象方法apply(Tt),用于对传入的参数应用某种操作并返回一个结果。@FunctionalInterfacepublicinterfaceFunct......
  • JAVA面试题:HashMap和HashTable的区别
    一、先说结论        HashMap和HashTable都是Map接口的实现类。HashMap采用数组、链表和红黑树的数据结构,非线性安全且无序,查找效率高,初始化默认容量为2^4,每次扩容为原来的2倍;而HashTable采用数组和链表的数据结构,线性安全,键值均不允许为null,默认初始大小......
  • 【Java常用设计模式】通俗易懂的玩转单例、建造者、工厂、策略模式(保姆篇)
    文章目录单例模式建造者模式工厂模式策略模式本篇小结更多相关内容可查看在一个狂风骤雨的下午,有人突然问了我一句,单例模式是什么,我愣了,相信看完这篇就不会愣了,本文以通俗易懂的方式写的,可能有不严谨的地方......
  • 计算机课程设计:JavaWeb期刊管理系统
    计算机课程设计:JavaWeb期刊管理系统项目说明 使用JavaWeb开发的数据库显示界面的课程设计,支持数据分页查询以及期刊的模糊搜索,首页采用动态二维码生成进行校验,支持上传图片,用户密码采用md5加密,支持期刊的分页显示。使用方法:这里说明一下:大致的使用方法1、getclone......
  • java学习day01
    一.java安装1.1安装java1.81.2java内创建文件夹jdk和jre分别安装java的jdk和jre1.3环境变量JAVA_HOMEE:\work\java\jdk(自己电脑的文件位置)CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Path内增加%JAVA_HOME%\bin(上移到最上方)二.java2.1......
  • java学习day02
    一.数据类型1.1本质数据存储形式,存储空间大小1.2存储整数存储:1.3分类基本数据类型数值型整型byte字节8bit-128~127short短整型16bit-32768~32767int整型32bit-2,147,483,648~2,147,483,647long长整型64bit浮点型float单浮点32bitdouble双浮......
  • 三种语言实现快速选择(C++/Python/Java)
    题目给定一个长度为......