`
AsWater
  • 浏览: 24767 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java SE 7新特性之文件操作(8) - 创建目录和读取目录内容

阅读更多

 

转自 开发者的天空

 

前面我们讨论了怎样对文件进行操作,下面我们来看看怎样对目录进行操作。首先我们来看看怎样列出一个文件系统中所有的更目录,就象我们在 Windows中 看到有多少硬盘分区(包括光盘等)。要得到这些信息,可以调用

FileSystem.getRootDirectories 方法。该方法返回一个 Iterable对象,我们可以遍历该对象得到所有的根目录。该对象中的 每个元素都是一个 Path对象。具体的代码例子如下:


import java.nio.file.FileSystems;

import java.nio.file.Path;


public class RootDirectoryReader {

        public static void main(String[] args){

            Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories();

            for (Path name: dirs) {

                System.err.println(name);

            }


        }

}
 

 

在 我的机器上运行该代码的输出如下:
C:\
D:\
E:\
F:\
G:\
在我的机器上, C盘是本地硬盘, D盘是光驱,其他 3个是移动硬盘的分区。

我们可以调用 Path类的 createDirectory方法来创建文件。如果调用该方法是不传递任何参数,那么生成 的新的目录就拥有默认的属性。下面的代码就是创建一个拥有默认属性的新目录:

    Path dir = Paths.get("C:\\temp");

    try {

        path.createDirectory();

    } catch (IOException x) {

        System.err.println(x);

    }
 

 

下 面的代码是在 POSIX文件系统上创建一个拥有指定的属性的目录:

    Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");

    FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);

    try {

         file.createDirectory(attr);

    } catch (IOException x) {

         System.err.println(x);

    }
 

 

要 想创建一个多层的目录,如 c:\temp\first\abc这样的目录,我们可以使用 Files类的 createDirectories方法。这个方法 接受 Path类作为第一个参数,第二个参数是可选的参数 FileAttribute。下面的代码创建具有缺省属性的多层目录:

    try {

         Files.createDirectories(Paths.get("c:\\temp\\first\\abc"));

    } catch (IOException x) {

         System.err.println(x);

    }


 

 

从 最上层开始,如果目录不存在,这创建新的目录。例如如果上面的目录层次中, c:\temp已经存在,则不再创建; c:\temp\first不存在,则直 接在 c:\temp下创建 first目录,然后在 first目录下创建 abc目录。
调用该方法的时候要注意该方法并不是原子操作,也就是说目录层次可能有一部分成功,一部分失败。如上面的例子中,可能 first目录创建成功了,但是 abc目录创建失败了。

要想列出目录中所有的内容,可以调用 newDirectoryStream()方法。该方法返回一个实现了 DirectoryStream接口的对象。实 现了 DirectoryStream的对象同时也实现了 Iterable接口,因此我们可以遍历该对象。遍历时得到的元素都是 Path对象。同时要注意的 是返回的 DirectoryStream也是一个流对象,别忘记使用完之后关闭该对象。
下面是示例代码:

Path dir = Paths.get("c:\\");   

DirectoryStream<Path> stream = null;

    try {

        stream = dir.newDirectoryStream();

        for (Path file: stream) {

            System.out.println(file.getName());

        }

    } catch (IOException x) {

        //IOException can never be thrown by the iteration.

        //In this snippet, it can only be thrown by newDirectoryStream.

        System.err.println(x);

    } finally {

        if (stream != null) stream.close();

    }


 

 


如果我们查找名字符合某些模式的文件或者只目录,我们可以调用 newDirectoryStream(String)方法。这个方法会调用一个内置的过滤 器来过滤返回的结果。关于模式的使用我们在前面的文章里已经讲过了。下面是具体的例子:

    Path dir = ...;

    DirectoryStream<Path> stream = null;

    try {

        stream = dir.newDirectoryStream("*.{java,class,jar}");

        for (Path entry: stream) {

            System.out.println(entry.getName());

        }

    } catch (IOException x) {

        //IOException can never be thrown by the iteration.

        //In this snippet, it can only be thrown by newDirectoryStream.

        System.err.println(x);

    } finally {

        if (stream != null) stream.close()

    }
 

 

在 这个例子中,我们只返回以 .java .class .jar结尾的文件或子目录。

我们还可以实现自己的过滤器。例如如果我们只需要得到所有的子目录,对于文件我们不需要返回,我们就可以编写自己的过滤器。自己的过滤器要实现 DirectoryStream.Filter<T>接口,这个接口只有一个方法 accept,这个方法决定一个文件 /目录是否符合查询条 件。下面是具体的代码:

    DirectoryStream.Filter<Path> filter = newDirectoryStream.Filter<Path>() {

        public boolean accept(Path file) {

            try {

                boolean isDirectory = Attributes.readBasicFileAttributes(file).isDirectory();

                return (isDirectory);

            } catch (IOException x) {

                //Failed to determine if it's a directory.

                System.err.println(x);

                return false;

            }

        }

    }


 

 

当 过滤器创建好之后,我们可以通过 newDirectoryStream(DirectoryStream.Filter<? super Path>)方法来使用它。下面就是一个实现的例子:

    Path dir = ...;

    DirectoryStream<Path> stream = null;

    try {

        stream = dir.newDirectoryStream(filter);

        for (Path entry: stream) {

            System.out.println(entry.getName());

        }

    } catch (IOException x) {

        System.err.println(x);

    } finally {

        stream.close();

    }


 

 

 

分享到:
评论
3 楼 wengsibo 2010-04-13  
没看懂是什么意思....
2 楼 AsWater 2010-04-13  
whaosoft 写道
不好意思 说实话没看出有什么太大变化 望指点


我的理解,主要的变化有两点:
1. Path类是Java SE 7新引入的类。
2. Path类提供了访问和设置文件/目录属性的功能。

还有一个小的区别就是newDirectoryStream方法可以接受一个字符串作为参数来进行过滤,这一点我觉得很方便。
1 楼 whaosoft 2010-04-12  
不好意思 说实话没看出有什么太大变化 望指点

相关推荐

    java se代码

    在Java SE中,`java.io.File` 类提供了创建、查找和更新文件及目录的方法。通过 `File` 类可以进行基本的文件操作,例如判断文件是否存在、是文件还是目录、获取文件长度等。 - **构造函数**: - `File(String ...

    Oracle Fundamentals of the Java Programming Language, Java SE 6 Ed 1 课程学习文档

    Java集合框架提供了一套用于存储和操作对象的标准接口和实现,主要包括: - **List**:有序集合,允许重复元素。 - **Set**:不允许重复元素的无序集合。 - **Map**:键值对集合,每个键都是唯一的。 #### 6. 输入...

    mysql-connector-java-5.1.49.jar

    MySQL Connector/J是MySQL数据库系统与Java应用程序之间的重要桥梁,它是一个实现了JDBC(Java Database Connectivity)规范的驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。"mysql-...

    Java-se-io学习 Java学习资料源码

    5. 文件操作:Java提供了File类来处理文件和目录,如创建、删除、重命名等操作。 6. 多路复用流(选择器):Java NIO(非阻塞I/O)引入了选择器(Selector)和通道(Channel)的概念,允许同时监控多个I/O事件,...

    Java软件开发中文件操作的研究与探析.pdf

    文件管理是Java开发中非常重要的一部分,File类定义了一系列与操作系统平台无关的方法来操作文件和目录,通过类File所提供的方法,可以得到文件或目录的描述信息,主要包括名称、所在路径、可读性、可写性、文件的...

    (超赞)JAVA精华之--深入JAVA API

    - `java.io.File` 用于表示文件和目录路径名,提供了许多方法来获取和设置文件属性。 - **文件流的建立** - `FileInputStream` 和 `FileOutputStream` 分别用于读取和写入文件。 - **缓冲区流** - `...

    java se基础代码练习 Java学习资料

    - **File类**:处理文件和目录,支持创建、删除、读取等操作。 - **InputStream和OutputStream**:处理字节流,如FileInputStream和FileOutputStream。 - **Reader和Writer**:处理字符流,如 FileReader 和 ...

    写给大忙人看的JAVA SE 8

    9.2.3 创建文件和目录 197 9.2.4 复制、移动和删除文件 198 9.3 实现equals、hashCode和compareTo方法 198 9.3.1 安全的Null值相等测试 198 9.3.2 计算哈希码 199 9.3.3 比较数值类型对象 200 9.4 安全需要 201 9.5 ...

    J2ME文件系统(从手机读取文件,递归存储器目录)

    总之,理解J2ME中的FileConnection接口是开发能够在移动设备上操作文件和目录的关键。通过熟练掌握这个接口,开发者能够创建功能丰富的应用程序,有效地管理设备的存储空间。记住,实践是提高技能的最好方式,因此,...

    模拟文件系统

    3. 文件读写:模拟文件内容的读取和写入,可能使用了字符或字节流。 4. 目录操作:创建、遍历、删除目录,以及在目录间移动文件。 5. 文件重命名:改变文件或目录的名称,同时更新索引节点信息。 6. 权限管理:模拟...

    java applet 操作本地文件

    ### Java Applet 操作本地文件 #### 知识点一:Java Applet 概述 Java Applet 是一种能够在浏览器中运行的小型应用程序,它利用Java语言编写,并通过Web服务器发送到客户端。用户无需安装即可在支持Java的浏览器中...

    Java SE编程入门教程 java IO(共28页).pptx

    但是,File类并不能直接进行读写操作,它主要负责管理和组织文件路径,以及进行文件和目录的创建、删除等操作。 File类提供了多种构造方法,通常包括: 1. 传入文件或目录的路径名,如`new File("aaa.txt")`。 2. ...

    Java软件开发实战 Java基础与案例开发详解 1-4 java SE环境安装和配置 共11页.pdf

    #### 一、Java SE环境安装和配置 1. **什么是JDK** - **定义**:JDK(Java Development Kit)即Java开发工具包,是开发Java应用程序的基础。 - **组成部分**: - JRE(Java Runtime Environment):Java运行时...

    3Java SE(下).doc

    总的来说,`File`类和`RandomAccessFile`类是Java中处理文件和目录操作的核心工具,它们提供了丰富的功能,使得开发者能够灵活地管理和操作文件系统资源。在实际开发中,了解并熟练掌握这些类的用法对于处理文件操作...

    java io 系列操作代码练习 Java学习资料

    1. 文件操作:Java IO提供了File类来处理文件和目录,包括创建、删除、重命名等操作。 2. 文件复制:可以使用FileInputStream和FileOutputStream配合缓冲流进行文件复制,提高效率。 3. 文件追加:使用FileWriter的...

    Java jdk1.7.0-x64

    它于2011年7月发布,引入了许多新特性,如类型推断(钻石操作符),try-with-resources语句,开关语句支持字符串,改进的编译器性能等。 2. **类型推断(Diamond Operator)**: 在Java 7中,当创建泛型实例时,...

    JAVA_API1.6文档(中文)

    java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务...

    VIP09_JavaSE_JavaIO_File_day0307-1.rar

    Java SE中的Java IO和File类是Java编程中非常重要的部分,尤其对于处理文件和目录的操作。在"VIP09_JavaSE_JavaIO_File_day0307-1.rar"这个压缩包中,我们可以预想它包含的是一个关于Java IO和File类的课程或教程的...

    Java-SE8-OCP-Exam-1Z0-809:我的代码示例在阅读Jeanne Boyarsky和Scott Selikoff撰写的“ Oracle认证专业Java SE 8程序员II学习指南考试1Z0-809”一书的同时,还阅读了“ Oracle认证专业Java SE 8的一些章节(IO,流,JDBC)” SG Ganesh,Hari Kiran和Tushar Sharma的程序员考试1Z0-809” SG Ganesh,Hari Kiran和Tushar Sharma的Oracle认证专业Java

    同时,掌握Java 8的新特性,如Optional类、接口默认方法和静态方法,以及方法引用和构造器引用,将对考试大有裨益。 综上所述,这个压缩包中的内容覆盖了Java SE 8的核心技术和考试重点,可以帮助考生系统地复习和...

    JAVA-SE入门学习——第九讲IO流

    JAVA-SE入门学习——第九讲IO流 在 Java 中,IO 流(Input/Output Stream)是一种基本的输入/输出机制,它允许程序读取和写入各种类型的数据。...这些方法可以用来创建文件和目录,並且可以对文件和目录进行操作。

Global site tag (gtag.js) - Google Analytics