`

java7 NIO2(4) 文件和目录操作API

    博客分类:
  • java
 
阅读更多

文件和目录操作API,跟原来FILE IO做了很多改进,我们看看新的API,这个也是NIO操作的基础。

package com.mime;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.List;
import java.util.Set;

public class NIO2FileAndDir {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Path path = FileSystems.getDefault().getPath(
				System.getProperty("user.home"), "www", "pyweb.settings");
		// 检查文件是否存在 exist, not exist, or unknown.
		// !Files.exists(...) is not equivalent to Files.notExists(...) and the
		// notExists() method is not a complement of the exists() method
		// 如果应用没有权限访问这个文件,则两者都返回false
		boolean path_exists = Files.exists(path,
				new LinkOption[] { LinkOption.NOFOLLOW_LINKS });
		boolean path_notexists = Files.notExists(path,
				new LinkOption[] { LinkOption.NOFOLLOW_LINKS });
		System.out.println(path_exists);
		System.out.println(path_notexists);

		// 检测文件访问权限
		boolean is_readable = Files.isReadable(path);
		boolean is_writable = Files.isWritable(path);
		boolean is_executable = Files.isExecutable(path);
		boolean is_regular = Files.isRegularFile(path,
				LinkOption.NOFOLLOW_LINKS);
		if ((is_readable) && (is_writable) && (is_executable) && (is_regular)) {
			System.out.println("The checked file is accessible!");
		} else {
			System.out.println("The checked file is not accessible!");
		}

		// 检测文件是否指定同一个文件
		Path path_1 = FileSystems.getDefault().getPath(
				System.getProperty("user.home"), "www", "pyweb.settings");
		Path path_2 = FileSystems.getDefault().getPath(
				System.getProperty("user.home"), "www", "django.wsgi");
		Path path_3 = FileSystems.getDefault().getPath(
				System.getProperty("user.home"), "software/../www",
				"pyweb.settings");
		try {
			boolean is_same_file_12 = Files.isSameFile(path_1, path_2);
			boolean is_same_file_13 = Files.isSameFile(path_1, path_3);
			boolean is_same_file_23 = Files.isSameFile(path_2, path_3);
			System.out.println("is same file 1&2 ? " + is_same_file_12);
			System.out.println("is same file 1&3 ? " + is_same_file_13);
			System.out.println("is same file 2&3 ? " + is_same_file_23);
		} catch (IOException e) {
			System.err.println(e);
		}

		// 检测文件可见行
		try {
			boolean is_hidden = Files.isHidden(path);
			System.out.println("Is hidden ? " + is_hidden);
		} catch (IOException e) {
			System.err.println(e);
		}

		// 获取文件系统根目录
		Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories();
		for (Path name : dirs) {
			System.out.println(name);
		}
		// jdk6的API
		// File[] roots = File.listRoots();
		// for (File root : roots) {
		// System.out.println(root);
		// }

		// 创建新目录
		Path newdir = FileSystems.getDefault().getPath("/tmp/aaa");
		// try {
		// Files.createDirectory(newdir);
		// } catch (IOException e) {
		// System.err.println(e);
		// }
		Set<PosixFilePermission> perms = PosixFilePermissions
				.fromString("rwxr-x---");
		FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions
				.asFileAttribute(perms);
		try {
			Files.createDirectory(newdir, attr);
		} catch (IOException e) {
			System.err.println(e);
		}

		// 创建多级目录,创建bbb目录,在bbb目录下再创建ccc目录等等
		Path newdir2 = FileSystems.getDefault().getPath("/tmp/aaa",
				"/bbb/ccc/ddd");
		try {
			Files.createDirectories(newdir2);
		} catch (IOException e) {
			System.err.println(e);
		}

		// 列举目录信息
		Path newdir3 = FileSystems.getDefault().getPath("/tmp");
		try (DirectoryStream<Path> ds = Files.newDirectoryStream(newdir3)) {
			for (Path file : ds) {
				System.out.println(file.getFileName());
			}
		} catch (IOException e) {
			System.err.println(e);
		}
		// 通过正则表达式过滤
		System.out.println("\nGlob pattern applied:");
		try (DirectoryStream<Path> ds = Files.newDirectoryStream(newdir3,
				"*.{png,jpg,bmp,ini}")) {
			for (Path file : ds) {
				System.out.println(file.getFileName());
			}
		} catch (IOException e) {
			System.err.println(e);
		}

		// 创建新文件
		Path newfile = FileSystems.getDefault().getPath(
				"/tmp/SonyEricssonOpen.txt");
		Set<PosixFilePermission> perms1 = PosixFilePermissions
				.fromString("rw-------");
		FileAttribute<Set<PosixFilePermission>> attr2 = PosixFilePermissions
				.asFileAttribute(perms1);
		try {
			Files.createFile(newfile, attr2);
		} catch (IOException e) {
			System.err.println(e);
		}

		// 写小文件
		try {
			byte[] rf_wiki_byte = "test".getBytes("UTF-8");
			Files.write(newfile, rf_wiki_byte);
		} catch (IOException e) {
			System.err.println(e);
		}

		// 读小文件
		try {
			byte[] ballArray = Files.readAllBytes(newfile);
			System.out.println(ballArray.toString());
		} catch (IOException e) {
			System.out.println(e);
		}
		Charset charset = Charset.forName("ISO-8859-1");
		try {
			List<String> lines = Files.readAllLines(newfile, charset);
			for (String line : lines) {
				System.out.println(line);
			}
		} catch (IOException e) {
			System.out.println(e);
		}

		// 读写文件缓存流操作
		String text = "\nVamos Rafa!";
		try (BufferedWriter writer = Files.newBufferedWriter(newfile, charset,
				StandardOpenOption.APPEND)) {
			writer.write(text);
		} catch (IOException e) {
			System.err.println(e);
		}
		try (BufferedReader reader = Files.newBufferedReader(newfile, charset)) {
			String line = null;
			while ((line = reader.readLine()) != null) {
				System.out.println(line);
			}
		} catch (IOException e) {
			System.err.println(e);
		}

		// 不用缓存的输入输出流
		String racquet = "Racquet: Babolat AeroPro Drive GT";
		byte data[] = racquet.getBytes();
		try (OutputStream outputStream = Files.newOutputStream(newfile)) {
			outputStream.write(data);
		} catch (IOException e) {
			System.err.println(e);
		}
		String string = "\nString: Babolat RPM Blast 16";
		try (OutputStream outputStream = Files.newOutputStream(newfile,
				StandardOpenOption.APPEND);
				BufferedWriter writer = new BufferedWriter(
						new OutputStreamWriter(outputStream))) {
			writer.write(string);
		} catch (IOException e) {
			System.err.println(e);
		}
		int n;
		try (InputStream in = Files.newInputStream(newfile)) {
			while ((n = in.read()) != -1) {
				System.out.print((char) n);
			}
		} catch (IOException e) {
			System.err.println(e);
		}

		// 临时目录操作
		String tmp_dir_prefix = "nio_";
		try {
			// passing null prefix
			Path tmp_1 = Files.createTempDirectory(null);
			System.out.println("TMP: " + tmp_1.toString());
			// set a prefix
			Path tmp_2 = Files.createTempDirectory(tmp_dir_prefix);
			System.out.println("TMP: " + tmp_2.toString());

			// 删除临时目录
			Path basedir = FileSystems.getDefault().getPath("/tmp/aaa");
			Path tmp_dir = Files.createTempDirectory(basedir, tmp_dir_prefix);
			File asFile = tmp_dir.toFile();
			asFile.deleteOnExit();

		} catch (IOException e) {
			System.err.println(e);
		}

		String tmp_file_prefix = "rafa_";
		String tmp_file_sufix = ".txt";
		try {
			// passing null prefix/suffix
			Path tmp_1 = Files.createTempFile(null, null);
			System.out.println("TMP: " + tmp_1.toString());
			// set a prefix and a suffix
			Path tmp_2 = Files.createTempFile(tmp_file_prefix, tmp_file_sufix);
			System.out.println("TMP: " + tmp_2.toString());
			File asFile = tmp_2.toFile();
			asFile.deleteOnExit();

		} catch (IOException e) {
			System.err.println(e);
		}

		// 删除文件
		try {
			boolean success = Files.deleteIfExists(newdir2);
			System.out.println("Delete status: " + success);
		} catch (IOException | SecurityException e) {
			System.err.println(e);
		}

		// 拷贝文件
		Path copy_from = Paths.get("/tmp", "draw_template.txt");
		Path copy_to = Paths
				.get("/tmp/bbb", copy_from.getFileName().toString());
		try {
			Files.copy(copy_from, copy_to);
		} catch (IOException e) {
			System.err.println(e);
		}
		try (InputStream is = new FileInputStream(copy_from.toFile())) {
			Files.copy(is, copy_to);
		} catch (IOException e) {
			System.err.println(e);
		}
		//移动文件
		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);
		}

	}

}

 输出:

true
false
The checked file is not accessible!
is same file 1&2 ? false
is same file 1&3 ? true
is same file 2&3 ? false
Is hidden ? false
/
java.nio.file.FileAlreadyExistsException: /tmp/aaa
.ICE-unix
gpg-LOz0cL
.org.chromium.Chromium.YKWsQJ
hsperfdata_weijianzhongwj
kde-weijianzhongwj
pulse-qKcxuRTsGUob
scim-im-agent-0.3.0.socket-1000@localhost:0.0
scim-helper-manager-socket-weijianzhongwj
ksocket-weijianzhongwj
virtuoso_Lh2135.ini
scim-socket-frontend-weijianzhongwj
scim-panel-socket:0-weijianzhongwj
.X0-lock
pulse-j0jluTvI3Pe6
sni-qt_kaccessibleapp_2026-mEz8Dy
.X11-unix
akonadi-weijianzhongwj.mjmToI
ssh-mfuayNh73d7Q
virt_1111
aaa
pulse-PKdhtXMmr18n
fcitx-socket-:0

Glob pattern applied:
[B@cd32e5
test
test
Vamos Rafa!
Racquet: Babolat AeroPro Drive GT
String: Babolat RPM Blast 16TMP: /tmp/3892364837850046417
TMP: /tmp/nio_5078970948266789689
TMP: /tmp/7342813580436243519.tmp
TMP: /tmp/rafa_47993266069276248.txt
Delete status: true
java.nio.file.NoSuchFileException: /tmp/draw_template.txt
java.io.FileNotFoundException: /tmp/draw_template.txt (没有那个文件或目录)
java.nio.file.NoSuchFileException: C:/rafaelnadal/rafa_2.jpg
 
分享到:
评论
1 楼 宋建勇 2013-01-05  

相关推荐

    Pro Java 7 NIO2

    本书的核心在于介绍`java.nio.file.Path`类,它是NIO.2 API的一个关键组件,为文件和目录的操作提供了强大的支持。通过学习这本书,读者可以深入了解如何在Java应用程序中高效地进行文件I/O操作。 #### 二、Path类...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 ...综上所述,使用Java NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。

    Java-NIO2教程

    ### Java-NIO2教程知识点详解 #### I/O发展简史 - **JDK1.0-1.3**: 在此期间,Java的I/O模型主要依赖于...这只是Java NIO2中众多强大功能之一,通过这些新的API,开发人员可以更高效、简洁地处理文件系统相关的操作。

    Java NIO 中英文版 + Pro Java 7 NIO.2

    `Pro Java 7 NIO.2`这本书由Anghel Leonard著,深入探讨了Java NIO.2 API,这是Java 7引入的进一步扩展,包括: 1. **文件系统API增强**:新增了AsynchronousFileChannel,支持异步文件操作,可以在后台线程中执行...

    java nio 读文件

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于标准Java IO API的处理I/O操作的方式。NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高...

    JAVA NIO 简单PFT 文件服务

    在Java中,可以使用java.nio.file包下的Files和Paths类来列出目录中的文件和子目录,获取文件的基本信息,如大小、修改时间等。 在实际开发中,我们还需要考虑错误处理、安全性(如权限控制)、性能优化(如批量...

    Pro Java 7 NIO

    《Pro Java 7 NIO》详细讲述了如何利用异步I/O API来开发异步socket应用程序,也包括了如何利用Java NIO.2中的FileVisitor API来开发递归文件操作,以及如何使用WatchService API和文件改变通知机制来监控文件系统的...

    Java.NIO资源下载资源下载

    根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。 ### Java NIO 概述 Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套...

    java NIO 写文件

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种新的方式来处理I/O操作,相比传统...通过理解其核心组件和操作机制,开发者可以充分利用NIO来优化文件读写性能,尤其是在高并发和大文件处理的场景下。

    PRO JAVA 7 NIO2

    在Java 7的NIO2(JSR203:Java平台上的更多新I/O API)更新中,`java.nio.file.Path` 类成为了核心组件之一,为开发者提供了更高效、更直观的文件系统操作接口。本文将详细解析 `Path` 类的功能与应用,帮助读者掌握...

    Java IO, NIO and NIO.2

    Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...

    Pro Java 7 NIO.2.pdf

    根据提供的文件信息,“Pro Java 7 NIO.2.pdf”由Anghel Leonard于2011年编写,主要介绍了Java 7中的新输入/输出(NIO)API,特别是NIO.2(JSR 203)所带来的增强功能。这本书通过一系列章节详细讲解了如何使用NIO.2...

    JAVA-NIO-DEMO

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于传统IO(基于字节流和字符流)的I/O操作方式。传统的IO模型是阻塞式的,而NIO的核心特点是非阻塞,这使得在处理大量并发I/O请求时更为高效。...

    Java NIO英文高清原版

    NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据量的系统。Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 ...

    NIO处理大文件

    总之,NIO是Java处理大文件的一个强大工具,通过非阻塞I/O、通道、缓冲区和选择器,能够提高文件操作的效率,降低系统资源消耗,特别适合处理大数据量和并发场景。开发者在实际项目中可以根据需求选择合适的I/O模型...

Global site tag (gtag.js) - Google Analytics