Java文件 – java.nio.file.Files类

Java 1.7中引入了Java Files类,它是java.nio.file包的一部分。

Java 文件类

java Files class, java NIO Files
  • Java Files class contains static methods that work on files and directories.
  • This class is used for basic file operations like create, read, write, copy and delete the files or directories of the file system.

在继续之前,让我们首先看一下以下条款:

    路径:这是代替java.io.File类的接口,用于表示在Java NIO中工作时的文件或目录。
    路径集:这个类包含一个静态方法来创建Path实例。
java file path, Java NIO Files Paths

Java IO和NIO的比较

Java IO vs NIO

如何创建路径

我们可以通过调用Paths类的Paths.get(String first, String… more)方法来创建一个Path对象。

Path path1 = Paths.get("/tmp/file.txt"); // For UNIX

Path path2 = Paths.get("D:/data/file.txt"); // For Windows

我们也可以通过将路径的部分分开,在Paths.get()方法中创建一个Path对象。

Path path1 = Paths.get("/tmp", "file.txt");

Path path2 = Paths.get("D:", "data", "file.txt");

Path path3 = Paths.get("D:/data", "file.txt") ;

正如我们所见,我们可以在Paths.get()方法中分别传递文件夹和文件名。

Java文件的方法

Java NIO的Files类包含一些用于操作文件和目录的静态方法,这些方法大多数都在Path对象上使用。让我们来看看Files类的以下方法:

    复制(InputStream in, Path target, CopyOption… options):此方法从指定的输入流复制所有字节到指定的目标文件,并返回读取或写入的字节数作为长整型值。
    复制(Path source, OutputStream out):此方法从指定的源文件复制所有字节到给定的输出流,并返回读取或写入的字节数作为长整型值。
    复制(Path source,Path target, CopyOption… options):此方法将给定的源文件复制到指定的目标文件,并返回目标文件的路径。
    createDirectories(Path dir, FileAttribute… attrs):此方法通过首先创建所有不存在的父目录来使用给定路径创建目录。如果目录因已经存在而无法创建,则此方法将不会抛出异常。FileAttribute是一个可选参数,用于在创建不存在的目录时自动设置,并返回已创建目录的路径。
    createDirectory(Path dir, FileAttribute… attrs):此方法使用给定的路径创建目录,如果成功创建目录,将返回已创建目录的路径。如果目录已经存在,则会抛出nio.file.FileAlreadyExistsException。
    createFile(Path path, FileAttribute… attrs):此方法使用给定的路径创建一个新的空文件,并返回新创建文件的路径。如果文件已经存在,则会抛出nio.file.FileAlreadyExistsException。
    createTempDirectory(Path dir, String prefix, FileAttribute… attrs):此方法使用给定的路径创建一个临时目录,并使用给定的前缀生成目录的名称。它将返回新创建的临时目录的路径。
    createTempDirectory(String prefix, FileAttribute… attrs):此方法在默认的临时文件目录中创建一个临时目录,并使用给定的前缀生成目录的名称。它将返回新创建的临时目录的路径,该目录与默认文件系统关联。
    createTempFile(Path dir, String prefix, String suffix, FileAttribute… attrs):此方法在指定的目录中创建一个临时文件,并使用给定的前缀和后缀生成文件名,并返回新创建文件的路径。
    createTempFile(String prefix, String suffix, FileAttribute… attrs):此方法在默认的临时文件目录中创建一个临时文件,并使用给定的前缀和后缀生成文件名,并返回新创建文件的路径。
    delete(Path path):这是一个无返回值的方法,只是从指定的路径删除文件。如果文件在指定的路径不存在,则此方法会抛出NoSuchFileException,并且如果文件是目录且可能不为空且无法删除,则会抛出
    deleteIfExists(Path path):在删除文件之前,此方法检查文件是否存在,并在文件成功删除时返回boolean值true,在给定路径上的文件不存在时返回false。如果文件是目录且可能不为空且无法删除,则会抛出
    exists(Path path):此方法检查指定路径是否存在文件,如果文件存在,则返回true,否则返回false。
    getLastModifiedTime(Path path, Linkoption… options):此方法返回给定路径上文件的最后修改时间。
    getOwner(Path path, Linkoption… options):此方法返回表示给定路径上文件所有者的UserPrincipal。
    isDirectory(Path path, Linkoption… options):此方法检查给定路径上的文件是否为目录。如果文件是目录,则返回true,如果文件不存在或不是目录,或者无法确定文件是否为目录,则返回false。
    isExecutable(Path path):此方法检查给定路径上的文件是否可执行,它还检查文件是否存在以及此JVM是否具有执行文件所需的适当权限。如果文件在给定路径上存在且可执行,则返回true,如果文件不存在或JVM没有足够的权限执行文件或无法确定访问权限,则返回false。
    isHidden(Path path):此方法确定给定路径上的文件是否被视为隐藏文件。隐藏的确切定义取决于平台或提供者。在UNIX系统中,如果文件的名称以句点字符(“.”)开头,则被视为隐藏。在Windows中,如果文件不是目录且设置了DOS隐藏属性,则被视为隐藏。如果给定路径上的文件被视为隐藏,则返回true,否则返回false。
    isReadable(Path path):此方法检查给定路径上的文件是否可读。如果指定路径上的文件存在且可读,则返回true,如果文件不存在或读取访问被拒绝(因为JVM没有足够的权限)或无法确定访问权限,则返回false。
    isWritable(Path path):此方法检查给定路径上的文件是否可写。如果指定路径上的文件存在且可写,则返回true,如果文件不存在或写访问被拒绝(因为JVM没有足够的权限)或无法确定访问权限,则返回false。
    move(Path source, Path target, CopyOption… options):此方法将源文件移动或重命名为目标文件,并返回目标文件的路径。选项参数可以包括以下内容:REPLACE_EXISTING:表示如果目标文件存在,则替换它,如果不是非空目录。ATOMIC_MOVE:表示移动作为原子文件系统操作执行,并忽略所有其他选项。如果目标文件存在但无法替换,因为未指定REPLACE_EXISTING选项,则抛出FileAleadyExistsException。如果指定了REPlACE_EXISTING选项,但文件无法替换,因为它是非空目录,则抛出DirectoryNotEmptyException。
    newBufferedReader(Path path, Charset cs):此方法使用给定的路径打开文件进行读取,并返回一个BufferedReader,用于从文件中读取文本。从文件读取的字节会使用指定的字符集解码为字符。
    newBufferedWriter(Path path, Charset cs, Openoption… options):此方法使用给定的路径打开或创建文件进行写入,并返回用于向文件中写入文本的BufferedWriter。options参数指定文件如何创建或打开。如果未指定任何选项,则默认考虑CREATE、TRUNCATE_EXISTING和WRITE选项,这意味着它打开文件进行写入,并在文件不存在时创建或在文件存在时将现有文件截断为大小为0。如果指定了不支持的选项,则抛出UnsupportedOperationException。
    newByteChannel(Path path, OpenOption… options):此方法使用指定的路径创建或打开文件,并返回一个可寻址的字节通道以访问该文件。如果指定了不支持的选项,则抛出UnsupportedOperationException。
    newDirectoryStream(Path path):此方法使用指定的路径打开目录,并返回一个DirectoryStream,以便迭代目录中的所有条目。DirectoryStream的迭代器返回的元素类型为Path,并且每个元素都表示目录中的一个条目。如果由于不是目录而无法打开给定路径上的文件,则抛出NotDirectoryException。
    newDirectoryStream(Path path, Filter filter):此方法使用指定的路径打开目录,并返回一个DirectoryStream,以便迭代目录中的所有条目。DirectoryStream的迭代器返回的元素类型为Path,并且每个元素都表示目录中的一个条目,这些条目通过指定的过滤器进行过滤。如果由于不是目录而无法打开给定路径上的文件,则抛出NotDirectoryException。
    newDirectoryStream(Path path, String glob):此方法使用指定的路径打开目录,并返回一个DirectoryStream,以便迭代目录中的所有条目。DirectoryStream的迭代器返回的元素类型为Path,并且每个元素都表示目录中的一个条目,这些条目通过将其文件名的String表示与指定的模式进行匹配来过滤。如果由于不是目录而无法打开给定路径上的文件,则抛出NotDirectoryException,并

使用Files类创建文件

Files类提供了createFile(Path filePath, FileAttribute… attrs)方法,用于使用指定的路径创建文件。让我们来看一下下面的示例程序。

package com.Olivia.examples;

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

/**
 * Java Create file using Files class
 * 
 * @author scdev
 *
 */
public class FilesCreateFileExample {

	public static void main(String[] args) {
		
		//initialize Path object
		Path path = Paths.get("D:/data/file.txt");
		//create file
		try {
			Path createdFilePath = Files.createFile(path);
			System.out.println("File Created at Path : "+createdFilePath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

以上程序的输出如下:

File Created at Path : D:\data\file.txt

使用Files类创建目录

Files类提供了createDirectory(Path dir, FileAttribute… attrs)和createDirectories(Path dir, FileAttribute… attrs)方法,用于使用指定的路径创建单个和多层目录。让我们来看看下面的示例程序。

package com.Olivia.examples;

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

/**
 * Java Create directories using Files class
 * 
 * @author scdev
 *
 */
public class FilesCreateDirectoriesExample {

	public static void main(String[] args) {
		// initialize Path objects
		Path path1 = Paths.get("D:/scdev");
		Path path2 = Paths.get("D:/scdev/java7");
		Path path3 = Paths.get("D:/scdev/java7/Files");
		
		try {
			Path createdDir1 = Files.createDirectory(path1);//first level directory
			Path createdDir2 = Files.createDirectory(path2);//second level directory
			Path createdDir3 = Files.createDirectory(path3);//all level directories
			System.out.println("First Level Directory Created at Path : "+createdDir1);
			System.out.println("Second Level Directory Created at Path : "+createdDir2);
			System.out.println("All Level Directories Created at Path : "+createdDir3);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

以上程序的输出如下:

First Level Directory Created at Path : D:\scdev
Second Level Directory Created at Path : D:\scdev\java7
All Level Directories Created at Path : D:\scdev\java7\Files

将文件转换为路径,反之亦然。

可以使用以下方法将File对象和Path对象相互转换:

File file = new File(“D:/data/file.txt”);

Path path = file.toPath();

File file1 = path.toFile();

使用Files类读取文件数据。

Files类提供了以下用于读取文件的方法。

    readAllBytes(Path path): 该方法从给定路径的文件中读取所有字节,并返回包含所读取字节的字节数组。
    readAllLines(Path path, Charsetcs): 该方法从给定路径的文件中读取所有行,并返回包含文件中行的列表。

我们来看一下下面的示例程序吧。

package com.Olivia.examples;

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

/**
 * Java Files read file example
 * 
 * @author scdev
 *
 */
public class FilesReadFileExample {

	public static void main(String[] args) {
		
		Path path = Paths.get("D:/data/file.txt");
		try {
			byte[] bs = Files.readAllBytes(path);
			List<String> strings = Files.readAllLines(path);
			
			System.out.println("Read bytes: \n"+new String(bs));
			System.out.println("Read lines: \n"+strings);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

以上程序的输出如下:

Read bytes: 
Hello world
This is Read file example
Thank you
Read lines: 
[Hello world, This is Read file example, Thank you]

使用Files类复制文件。

Files类提供了copy(Path source, Path target, CopyOption… options)方法,该方法将给定的源文件复制到指定的目标文件,并返回目标文件的路径。让我们来看一下下面的示例程序:

package com.Olivia.examples;

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

/**
 * Java Files copy file example
 * 
 * @author scdev
 *
 */
public class FilesCopyFileExample {

	public static void main(String[] args) {
		Path sourcePath = Paths.get("D:/data/sourceFile.txt");
		Path targetPath = Paths.get("D:/data/targetFile.txt");
		
		try {
			Path path = Files.copy(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//copy with REPLACE_EXISTING option
			System.out.println("Target file Path : "+path);
			System.out.println("Copied Content : \n"+new String(Files.readAllBytes(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

上述程式的输出如下:

Target file Path : D:\data\targetFile.txt
Copied Content : 
Hello world
This is Copy file example
Thank you

使用Files类移动文件

Java Files类提供了move(Path source, Path target, CopyOption… options)方法,该方法可以将源文件移动或重命名为目标文件,并返回目标文件的路径。选项参数可以包括以下内容: REPLACE_EXISTING: 如果目标文件存在,则如果它不是非空目录,则替换它。ATOMIC_MOVE: 表示移动操作作为原子文件系统操作执行,忽略所有其他选项。如果目标文件存在但不能被替换,因为未指定REPLACE_EXISTING选项,则该方法会抛出FileAleadyExistsException。如果指定了REPlACE_EXISTING选项,但文件不能被替换,因为它是一个非空目录,则该方法会抛出DirectoryNotEmptyException。让我们看下面的示例程序:

package com.Olivia.examples;

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

/**
 * Java Files move file example
 * 
 * @author scdev
 *
 */
public class FilesMoveFileExample {

	public static void main(String[] args) {
		Path sourcePath = Paths.get("D:/data/sourceFile.txt");
		Path targetPath = Paths.get("D:/data/targetFile.txt");
		try {
			Path path = Files.move(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//move with REPLACE_EXISTING option
			System.out.println("Target file Path : "+path);
			System.out.println("Moved Content : \n"+new String(Files.readAllBytes(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

使用Files类来写文件

Java NIO 的 Files 类提供了一个 write(Path path, byte[] bytes, OpenOption… options) 方法,它可以将字节写入到指定路径的文件中。options 参数用于指定文件的创建或打开方式。如果没有指定选项,则默认为 CREATE、TRUNCATE_EXISTING 和 WRITE 选项。这意味着它打开文件进行写入操作,如果文件不存在则创建新文件,如果文件已存在则将其截断为大小为 0。所有字节数组中的字节都会被写入文件。该方法确保在所有字节写入后关闭文件,并返回所写文件的路径。

package com.Olivia.examples;

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

/**
 * Java Files write file example
 * 
 * @author scdev
 *
 */
public class FilesWriteFileExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/data/test.txt");
		try {
			String str = "This is write file Example";
			byte[] bs = str.getBytes();
			Path writtenFilePath = Files.write(path, bs);
			System.out.println("Written content in file:\n"+ new String(Files.readAllBytes(writtenFilePath)));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

遍历文件树

Files类提供了walkFileTree(Path start, FileVisitor visitor)方法,用于遍历目录。它会递归地遍历指定路径下的目录,并返回起始文件。

package com.Olivia.examples;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

/**
 * Java Files walk file tree example
 * 
 * @author scdev
 *
 */
public class FilesWalkFileTreeExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/scdev");
		try {
			Files.walkFileTree(path, new FileVisitor<Path>() {

				@Override
				public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
					System.out.println("Post Visit Directory: "+dir);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
					System.out.println("Pre Visit Directory: "+dir);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
					System.out.println("Visit File: "+file);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
					System.out.println("Visit Failed File: "+file);
					return FileVisitResult.CONTINUE;
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

以上程序的输出如下:

Pre Visit Directory: D:\scdev
Pre Visit Directory: D:\scdev\java6
Pre Visit Directory: D:\scdev\java6\Files
Visit File: D:\scdev\java6\Files\file.txt.txt
Post Visit Directory: D:\scdev\java6\Files
Post Visit Directory: D:\scdev\java6
Pre Visit Directory: D:\scdev\java7
Pre Visit Directory: D:\scdev\java7\Files
Visit File: D:\scdev\java7\Files\file.txt.txt
Post Visit Directory: D:\scdev\java7\Files
Post Visit Directory: D:\scdev\java7
Pre Visit Directory: D:\scdev\java8
Pre Visit Directory: D:\scdev\java8\Files
Visit File: D:\scdev\java8\Files\file.txt.txt
Post Visit Directory: D:\scdev\java8\Files
Post Visit Directory: D:\scdev\java8
Post Visit Directory: D:\scdev

请注意,所有的文件和文件夹都被递归处理。当您想对所有文件进行一些常见的操作时,比如递归重命名目录中的所有文件时,这非常有用。关于Java文件类,就介绍到这里。参考:API文档。

发表回复 0

Your email address will not be published. Required fields are marked *