- 浏览: 141949 次
- 性别:
- 来自: 深圳
最新评论
-
freesea:
不错,还没注意java 7已经增加了这么多类了
[NIO.2] 第十篇 NIO.2 中的文件属性 -
SpringJava:
有个问题,想请教一下楼主:在代码中经常看到try catch语 ...
[NIO.2] 第二十九篇 删除、复制、移动目录和文件 -
xiaohu7924:
高
什么是 Java ? -
jiiming:
这种方法可以借鉴
[Java EE 7] Servlet 异步支持 -
cucaracha:
jahu 写道有中文文档没有啊。请留意我的博客:http:// ...
Java EE 7 技术一览
删除、拷贝和移动操作是最常见的文件操作。NIO.2 提供了独立的方法来支持这些操作。它们中的大部分都来自 Files 类。
删除文件和目录
NIO.2 提供了两个方法来删除文件和目录,分别是 Files.delete() 和 Files.deleteIfExits()。这两个方法都接受一个 Path 类型的参数用于指定删除对象。不同的是,Files.delete() 的返回值是 void,而 Files.deleteIfExits() 的返回值是 boolean。
Files.delete() 方法试图删除传入的 Path 对象,如果删除失败,则有可能抛出下面的异常:NoSuchFileException (如果传入的 Path 文件/目录不存在),DirectoryNotEmptyException (如果传入的 Path 对象是一个目录,并且目录不为空),IOException (如果发生 I/O 异常), SecurityException (如果没有权限进行删除操作)。
下面的代码段将删除 C:\rafaelnadal\photos\ 目录下的 rafa_1.jpg 文件(文件必须存在)。
如果使用 Files.deleteIfExists() 删除文件,文件必须存在,否则会返回 false(用于取代抛出 NoSuchFileException 异常)。这在多线程的环境下删除文件很有用,因为你可能会不希望线程中抛出异常。
下面的代码同样会删除 rafa_1.jpg 文件:
注:如果要删除目录,那么目录必须为空,否则需要先进行递归删除目录下的所有内容。
复制文件和目录
复制是 NIO.2 提供的最美妙的方法之一。NIO.2 一共提供了三个 copy() 方法来完成这个任务,并且提供了一组选项来控制复制过程。copy() 方法是用非定长参数来接受这些选项。这些选项保存在 StandardCopyOption 和 LinkOption 枚举类型中,如下所示:
如果你对枚举类型不熟,那么你可以使用下面的静态导入方式导入到你的类中:
注:默认情况下,如果被复制的文件是软连接,那么复制的将会是目标文件,只有使用了 REPLACE_EXISTING 和 NOFOLLOW_LINKS 选项才会赋值软链接本身。另外,文件属性默认不会被复制。
注意:试图复制一个非空目录最终会得到一个空目录。非空目录的复制需要进行递归复制下面的子目录和文件。另外,赋值文件的操作并不是一个原子操作,因此有可能会发生 IOException 或者赋值过程被打断的情况。
在两个 Path 对象之间复制
NIO.2 提供了 copy() 方法进行拷贝,它接受两个 Path 对象用于指定源文件和目标文件,还有一组用于控制复制过程的参数。返回目标文件 Path。默认情况下,若目标文件已存在,复制会失败。
下面的代码将会复制 draw_template.txt 文件(文件必须存在),从 C:\rafaelnadal\grandslam\AustralianOpen 复制到 C:\rafaelnadal\grandslam\USOpen。它将替换已有文件,并且会复制文件属性,不支持软链接。
从输入流复制到文件
可以调用 Files.copy() 方法从输入流复制到文件,这个方法会返回读取或写出的字节数。默认情况下,如果目标文件已经存在,则复制失败。
下面代码段将使用输入流将文件 draw_template.txt 从 C:\rafaelnadal\grandslam\AustralianOpen 复制到 C:\rafaelnadal\grandslam\Wimbledon 并替换已有文件。
输入流可以通过另外的途径获得,例如,下面的代码将会从 URL 获取输入流,并复制到 C:\rafaelnadal\photos 目录下(使用默认选项,文件必须不存在):
复制文件到输出流
可以调用 Files.copy() 方法从文件复制到输出流,这个方法会返回读取或写出的字节数。
下面的代码会将文件 draw_template.txt 从 C:\rafaelnadal\grandslam\AustralianOpen 复制到 C:\rafaelnadal\grandslam\RolandGarros,复制过程使用输出流(如果目标文件存在,则会被覆盖)。
移动文件和目录
可以使用 Files.move() 方法来移动文件,这个方法接受两个 Path 类型对象,分别表示源文件和目标文件。并接受一组可选的参数,用于控制移动过程。这些参数存在在 StandardCopyOption 枚举类型中:
REPLACE_EXISTING - 如果目标文件已经存在,则会被覆盖;如果操作的是软连接,那么软链接将会被替换并且指向的目标文件不变。
ATOMIC_MOVE - 保证文件移动的原子性,这将保证任何任何监控文件目录的操作都将访问到完整的文件。
默认情况下,如果目标文件已经存在,移动将会失败。当移动软链接时,移动的是软链接本身而非目标文件。
下面的代码将会移动 rafa_2.jpg 文件,从 C:\rafaelnadal 到 C:\rafaelnadal\photos,如果文件存在,则会覆盖,因为使用了 REPLACE_EXISTING 选项:
你可以使用 Path.resolve() 方法来避免文件名硬编码。下面的代码演示从源文件提取文件名并移动到目标目录下:
重命名文件
最后,演示一下如何使用 Files.move() 和 Path.resolveSibling() 方法对文件进行重命名。下面的代码将 rafa_2.jpg 重命名为 rafa_renamed_2.jpg:
文章来源:http://www.aptusource.org/2014/04/nio-2-delete-copy-move-files/
删除文件和目录
NIO.2 提供了两个方法来删除文件和目录,分别是 Files.delete() 和 Files.deleteIfExits()。这两个方法都接受一个 Path 类型的参数用于指定删除对象。不同的是,Files.delete() 的返回值是 void,而 Files.deleteIfExits() 的返回值是 boolean。
Files.delete() 方法试图删除传入的 Path 对象,如果删除失败,则有可能抛出下面的异常:NoSuchFileException (如果传入的 Path 文件/目录不存在),DirectoryNotEmptyException (如果传入的 Path 对象是一个目录,并且目录不为空),IOException (如果发生 I/O 异常), SecurityException (如果没有权限进行删除操作)。
下面的代码段将删除 C:\rafaelnadal\photos\ 目录下的 rafa_1.jpg 文件(文件必须存在)。
Path path = FileSystems.getDefault().getPath("C:/rafaelnadal/photos", "rafa_1.jpg"); //delete the file try { Files.delete(path); } catch (NoSuchFileException | DirectoryNotEmptyException | IOException | SecurityException e) { System.err.println(e); }
如果使用 Files.deleteIfExists() 删除文件,文件必须存在,否则会返回 false(用于取代抛出 NoSuchFileException 异常)。这在多线程的环境下删除文件很有用,因为你可能会不希望线程中抛出异常。
下面的代码同样会删除 rafa_1.jpg 文件:
try { boolean success = Files.deleteIfExists(path); System.out.println("Delete status: " + success); } catch (DirectoryNotEmptyException | IOException | SecurityException e) { System.err.println(e); }
注:如果要删除目录,那么目录必须为空,否则需要先进行递归删除目录下的所有内容。
复制文件和目录
复制是 NIO.2 提供的最美妙的方法之一。NIO.2 一共提供了三个 copy() 方法来完成这个任务,并且提供了一组选项来控制复制过程。copy() 方法是用非定长参数来接受这些选项。这些选项保存在 StandardCopyOption 和 LinkOption 枚举类型中,如下所示:
- REPLACE_EXISTING - 如果文件已经存在,则会被替换(如果复制的是非空目录,则会抛出 FileAlreadyExistsException 异常);如果复制的是软链接,则只是复制软链接本身,而不会复制目标文件。
- COPY_ATTRIBUTES - 赋值文件并且连同文件属性(至少会有 lastModifiedTime 属性支持复制)。
- NOFOLLOW_LINKS - 不考虑软链接目标文件,只考虑软链接自身。
如果你对枚举类型不熟,那么你可以使用下面的静态导入方式导入到你的类中:
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES; import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
注:默认情况下,如果被复制的文件是软连接,那么复制的将会是目标文件,只有使用了 REPLACE_EXISTING 和 NOFOLLOW_LINKS 选项才会赋值软链接本身。另外,文件属性默认不会被复制。
注意:试图复制一个非空目录最终会得到一个空目录。非空目录的复制需要进行递归复制下面的子目录和文件。另外,赋值文件的操作并不是一个原子操作,因此有可能会发生 IOException 或者赋值过程被打断的情况。
在两个 Path 对象之间复制
NIO.2 提供了 copy() 方法进行拷贝,它接受两个 Path 对象用于指定源文件和目标文件,还有一组用于控制复制过程的参数。返回目标文件 Path。默认情况下,若目标文件已存在,复制会失败。
下面的代码将会复制 draw_template.txt 文件(文件必须存在),从 C:\rafaelnadal\grandslam\AustralianOpen 复制到 C:\rafaelnadal\grandslam\USOpen。它将替换已有文件,并且会复制文件属性,不支持软链接。
Path copy_from = Paths.get("C:/rafaelnadal/grandslam/AustralianOpen", "draw_template.txt"); Path copy_to= Paths.get("C:/rafaelnadal/grandslam/USOpen",copy_from.getFileName().toString()); try { Files.copy(copy_from, copy_to, REPLACE_EXISTING, COPY_ATTRIBUTES, NOFOLLOW_LINKS); } catch (IOException e) { System.err.println(e); }
从输入流复制到文件
可以调用 Files.copy() 方法从输入流复制到文件,这个方法会返回读取或写出的字节数。默认情况下,如果目标文件已经存在,则复制失败。
下面代码段将使用输入流将文件 draw_template.txt 从 C:\rafaelnadal\grandslam\AustralianOpen 复制到 C:\rafaelnadal\grandslam\Wimbledon 并替换已有文件。
Path copy_from = Paths.get("C:/rafaelnadal/grandslam/AustralianOpen", "draw_template.txt"); Path copy_to = Paths.get("C:/rafaelnadal/grandslam/Wimbledon", "draw_template.txt"); try (InputStream is = new FileInputStream(copy_from.toFile())) { Files.copy(is, copy_to, REPLACE_EXISTING); } catch (IOException e) { System.err.println(e); }
输入流可以通过另外的途径获得,例如,下面的代码将会从 URL 获取输入流,并复制到 C:\rafaelnadal\photos 目录下(使用默认选项,文件必须不存在):
Path copy_to = Paths.get("C:/rafaelnadal/photos/rafa_winner_2.jpg"); URI u = URI.create("https://lh6.googleusercontent.com/-- udGIidomAM/Tl8KTbYd34I/AAAAAAAAAZw/j2nH24PaZyM/s800/rafa_winner.jpg"); try (InputStream in = u.toURL().openStream()) { Files.copy(in, copy_to); } catch (IOException e) { System.err.println(e); }
复制文件到输出流
可以调用 Files.copy() 方法从文件复制到输出流,这个方法会返回读取或写出的字节数。
下面的代码会将文件 draw_template.txt 从 C:\rafaelnadal\grandslam\AustralianOpen 复制到 C:\rafaelnadal\grandslam\RolandGarros,复制过程使用输出流(如果目标文件存在,则会被覆盖)。
Path copy_from = Paths.get("C:/rafaelnadal/grandslam/AustralianOpen", "draw_template.txt"); Path copy_to = Paths.get("C:/rafaelnadal/grandslam/RolandGarros", "draw_template.txt"); try (OutputStream os = new FileOutputStream(copy_to.toFile())) { Files.copy(copy_from, os); } catch (IOException e) { System.err.println(e); }
移动文件和目录
可以使用 Files.move() 方法来移动文件,这个方法接受两个 Path 类型对象,分别表示源文件和目标文件。并接受一组可选的参数,用于控制移动过程。这些参数存在在 StandardCopyOption 枚举类型中:
REPLACE_EXISTING - 如果目标文件已经存在,则会被覆盖;如果操作的是软连接,那么软链接将会被替换并且指向的目标文件不变。
ATOMIC_MOVE - 保证文件移动的原子性,这将保证任何任何监控文件目录的操作都将访问到完整的文件。
默认情况下,如果目标文件已经存在,移动将会失败。当移动软链接时,移动的是软链接本身而非目标文件。
下面的代码将会移动 rafa_2.jpg 文件,从 C:\rafaelnadal 到 C:\rafaelnadal\photos,如果文件存在,则会覆盖,因为使用了 REPLACE_EXISTING 选项:
Path movefrom = FileSystems.getDefault().getPath("C:/rafaelnadal/rafa_2.jpg"); Path moveto = FileSystems.getDefault().getPath("C:/rafaelnadal/photos/rafa_2.jpg"); try { Files.move(movefrom, moveto, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { System.err.println(e); }
你可以使用 Path.resolve() 方法来避免文件名硬编码。下面的代码演示从源文件提取文件名并移动到目标目录下:
Path movefrom = FileSystems.getDefault().getPath("C:/rafaelnadal/rafa_2.jpg"); Path moveto_dir = FileSystems.getDefault().getPath("C:/rafaelnadal/photos"); try { Files.move(movefrom, moveto_dir.resolve(movefrom.getFileName()), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { System.err.println(e); }
重命名文件
最后,演示一下如何使用 Files.move() 和 Path.resolveSibling() 方法对文件进行重命名。下面的代码将 rafa_2.jpg 重命名为 rafa_renamed_2.jpg:
Path movefrom = FileSystems.getDefault().getPath("C:/rafaelnadal/photos/rafa_2.jpg"); try { Files.move(movefrom, movefrom.resolveSibling("rafa_2_renamed.jpg"), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { System.err.println(e); }
文章来源:http://www.aptusource.org/2014/04/nio-2-delete-copy-move-files/
评论
1 楼
SpringJava
2014-08-28
有个问题,想请教一下楼主:
在代码中经常看到try catch语句:
请问这个是Java1.8的新语法吗?还是误写??
在代码中经常看到try catch语句:
try (InputStream is = new FileInputStream(copy_from.toFile())) { Files.copy(is, copy_to, REPLACE_EXISTING); } catch (IOException e) { System.err.println(e); }
请问这个是Java1.8的新语法吗?还是误写??
发表评论
-
[NIO.2] 第四十一篇 随机访问文件概述
2014-04-29 14:51 1826我们已经看过很多顺序读取文件的例子,文件除了可以被顺序读取,还 ... -
[NIO.2] 第四十篇 监控目录树
2014-04-29 14:49 2103现在,我们编写一个应用来监控 C:\rafaelnadal 目 ... -
[NIO.2] 第三十九篇 实现文件监控服务
2014-04-26 16:13 3714要实现监控服务需要有几个步骤。在本文中,你将会看到实现监控服务 ... -
[NIO.2] 第三十八篇 监控服务 API
2014-04-21 14:13 2052Java 7 NIO.2 引入了线程安全的监控服务,用于监控对 ... -
[NIO.2] 第三十七篇 编写一个文件移动应用
2014-04-18 14:20 1376移动文件分为两个步骤,先拷贝文件,再删除源文件。 下面的代码 ... -
[NIO.2] 第三十六篇 编写一个文件拷贝应用
2014-04-18 14:18 1491拷贝目录树的时候,需要为文件和目录递归调用 Files.cop ... -
[NIO.2] 第三十五篇 编写一个文件删除应用
2014-04-17 18:22 1894如果要删除单个文件,可以直接调用 delete() 或 del ... -
[NIO.2] 第三十四篇 编写一个文件搜索应用
2014-04-14 15:39 1512大多数操作系统都提供了独立的工具用于文件搜索(例如,Linux ... -
[NIO.2] 第三十三篇 遍历目录树
2014-04-14 15:35 2454一旦你创建了遍历机制(实现 FileVisitor 接口或继承 ... -
[NIO.2] 第三十二篇 SimpleFileVisitor 类
2014-04-12 15:57 2074要实现 FileVisitor 接口就要实现接口上的所有方法, ... -
[NIO.2] 第三十一篇 FileVisitor 接口
2014-04-12 15:53 3264FileVisitor 接口提供了递归遍历文件树的支持。这个接 ... -
[NIO.2] 第三十篇 递归操作简述
2014-04-12 15:46 1095你可能知道,在编程中使用递归技术一直有争议,但是它的确简化了一 ... -
[NIO.2] 第二十八篇 创建临时目录和文件
2014-04-09 13:59 4576临时目录是用于存储临时文件的目录。临时目录的位置依赖操作系统。 ... -
[NIO.2] 第二十七篇 新建、读取和写出文件
2014-04-07 20:09 4237对文件来说,可能最常用的操作就是创建、读取和写出。NIO.2 ... -
[NIO.2] 第二十六篇 创建目录以及列出目录内容
2014-04-07 12:14 2541列出文件系统根目录 在 Java 6 中,获取根目录是通过 ... -
[NIO.2] 第二十五篇 文件及目录的校验
2014-04-05 16:26 1922在对文件或目录进行操 ... -
[NIO.2] 第二十四篇 定位链接所指向的目标文件位置
2014-04-03 18:30 1076调用 Files.readSymbolicLink() 方法可 ... -
[NIO.2] 第二十三篇 检验软链接
2014-04-03 12:12 1791Path 对象可能表示文件或链接。如果 Path 对象指向软链 ... -
[NIO.2] 第二十二篇 创建硬链接
2014-04-03 00:11 1928可以调用 createLink() 方法创建硬链接,它将会创建 ... -
[NIO.2] 第二十一篇 创建软链接
2014-04-02 18:35 3283在 NIO.2 中,创建软链接非常简单,只需要调用 Files ...
相关推荐
Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道(ServerSocketChannel)等。通道可以同时进行读写操作,并且可以实现异步读写。 2. **缓冲区(Buffers...
Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO具有更好的性能和更高的灵活性。NIO的核心组件包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。...
在Java的NIO.2(New IO 2.0)框架中,文件系统API提供了更加高效和灵活的方式来处理文件和目录。本篇我们将深入探讨NIO.2中的几个关键概念和类,包括`Files`, `Path`, `FileAttributes`, `DirectoryWatcher`以及`...
根据提供的文件信息,“Pro Java 7 NIO.2.pdf”由Anghel Leonard于2011年编写,主要介绍了Java 7中的新输入/输出(NIO)API,特别是NIO.2(JSR 203)所带来的增强功能。这本书通过一系列章节详细讲解了如何使用NIO.2...
New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...
// 复制文件 Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); // 删除文件 Files.delete(target); } catch (IOException e) { e.printStackTrace(); } } } ``` `Files`类包含的方法如`...
Java I/O, NIO, 和 NIO.2 是Java平台中处理输入/输出操作的核心组件,对于任何Java开发者来说,理解和掌握这些概念至关重要。本文将深入探讨这些技术,旨在提供一个全面而详尽的概述。 Java I/O(Input/Output)是...
综上所述,Java NIO 和 NIO.2 提供了强大的工具和机制,使得开发者能够构建高并发、低延迟的系统。通过学习这两部分的内容,开发者可以更好地理解和利用Java平台提供的I/O能力,优化应用程序的性能。
在复制文件时,我们用它来存储从源文件读取或写入目标文件的数据。 下面是一个简单的文件复制代码示例: ```java import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel...
java nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava ...
JDK1.7 之 java.nio.file.Files 读取文件仅需一行代码实现 java.nio.file.Files 类是 JDK1.7 中引入的新的文件操作类,该类包含了许多有用的方法来操作文件。其中,Files.readAllBytes(Path) 方法可以将整个文件...
`java_nio_chm`指的是包含Java NIO相关内容的CHM(Compiled Help Manual)文件,这是一种Windows下的帮助文档格式,通常包含一系列的章节和索引,方便用户查阅。在这个文档中,你可以找到关于Java NIO类库的详细说明...
根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。 ### Java NIO 概述 Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套...
《Apress.Pro.Java.7.NIO.2.2011》这本书专注于讲解Java 7中的非阻塞I/O(Non-blocking I/O, NIO)和NIO 2的高级特性,是Java开发者深入理解这一关键领域的重要参考资料。NIO在Java平台中扮演着至关重要的角色,特别...