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

时间:2020-02-23 14:36:34  来源:igfitidea点击:

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

Java文件类

  • Java Files类包含可用于文件和目录的静态方法。

  • 此类用于基本文件操作,例如创建,读取,写入,复制和删除文件系统的文件或者目录。

在继续之前,我们先来看一下以下术语:

  • Path:当我们在Java NIO中工作时,这是一个接口,它将java.io.File类替换为文件或者目录的表示形式。

  • 路径:此类包含创建"路径"实例的静态方法。

java.nio.file.Path接口类似于旧的java.io.File类。
" Path"代表文件的位置,当我们创建新文件的路径时,只有在我们使用" Files.createFile(Path filePath)"创建文件之后,它才会创建实际文件。
如上图所示,Paths类用于创建Path的实例,Files类使用Path实例在文件上工作。

File和Path对象知道如何转换为其他对象,这就是我们可以使用旧代码与新的Files实用程序进行交互的方式。

Java IO与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类的以下方法:

  • copy(InputStream输入,路径目标,CopyOption…选项):此方法将所有字节从指定的输入流复制到指定的目标文件,并以长值形式返回已读取或者写入的字节数。

  • copy(Path source,OutputStream out):此方法将所有字节从指定的源文件复制到给定的输出流,并返回读取或者写入的字节数作为long值。

  • 复制(路径源,路径目标,CopyOption…选项):此方法将给定的源文件复制到指定的目标文件,并返回目标文件的路径。

  • createDirectories(Path dir,FileAttribute <?>…attrs):此方法通过首先创建所有不存在的父目录来使用给定路径创建目录。
    如果由于目录已经存在而无法创建目录,则此方法不会引发异常。
    FileAttribute是一个可选参数,可在创建不存在的目录时自动设置,并返回创建目录的路径。

  • createDirectory(Path dir,FileAttribute <?>…attrs):此方法使用给定路径创建目录,如果成功创建目录,它将返回已创建目录的路径。
    如果目录已经存在,则将抛出nio.file.FileAlreadyExistsException。

  • createFile(Path path,FileAttribute <?>…attrs):此方法使用给定路径创建一个新的空文件,如果成功创建,则返回新创建文件的路径。
    如果文件已经存在,则将抛出nio.file.FileAlreadyExistsException。

  • createTempDirectory(路径目录,字符串前缀,FileAttribute <?>…attrs):此方法使用给定的路径创建一个临时目录,它将使用给定的前缀生成目录的名称。
    它将返回新创建的临时目录的路径。

  • createTempDirectory(String prefix,FileAttribute <?>…attrs):此方法在默认的临时文件目录中创建一个Temporary目录,并使用给定的前缀生成目录的名称。
    它将返回与默认文件系统关联的新创建的临时目录的路径。

  • createTempFile(路径目录,字符串前缀,字符串后缀,FileAttribute <?>…attrs):此方法在指定目录下创建一个临时文件,并使用给定的前缀和后缀生成文件名,并返回新创建文件的路径。

  • createTempFile(字符串前缀,字符串后缀,FileAttribute <?>…attrs):此方法在默认的临时文件目录中创建一个临时文件,并使用给定的前缀和后缀生成文件名,并返回新创建文件的路径。

  • delete(Path path):这是一个void方法,只是从指定路径中删除文件。
    如果该文件在指定路径下不存在,并且该文件是目录,并且该文件可能不为空并且无法删除,则此方法将引发NoSuchFileException。

  • deleteIfExists(Path path):此方法在删除文件之前检查文件是否存在,如果给定路径上的文件被成功删除,则返回布尔值true;如果给定路径上不存在文件,则返回false。
    如果文件是目录,并且它可能不为空并且无法删除,在这种情况下它将抛出

  • exist(Path path):此方法检查文件是否在指定路径处存在,并且如果文件存在,它将返回true,否则返回false。

  • getLastModifiedTime(路径,Linkoption…选项):此方法从给定路径返回文件的上次修改时间,如下所示:

  • 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 hidden属性,则该文件被视为隐藏文件。
    如果将给定路径下的文件视为隐藏文件,则返回true,否则返回false。

  • isReadable(Path path):此方法测试给定路径下的文件是否可读。
    如果指定路径下的文件存在并且可读,则重新运行true;如果文件不存在,则重新运行false;或者由于JVM没有足够的特权或者无法确定访问而拒绝读取访问。

  • isWritable(Path path):此方法测试给定路径下的文件是否可写。
    如果指定路径上的文件存在且可写,则重新运行true;如果文件不存在或者由于JVM没有足够的特权或者无法确定访问而拒绝写访问,则重新运行false。

  • move(路径源,路径目标,CopyOption…选项):此方法将源文件移动或者重命名为目标文件,并返回目标文件的路径。
    选项参数可能包括:
    REPLACE_EXISTING:表示目标文件是否存在,如果不是非空目录则替换该文件.ATOMIC_MOVE:表示移动是作为原子文件系统操作执行的,所有其他选项都将被忽略。
    但由于未指定REPLACE_EXISTING选项而无法替换。
    如果指定了REPlACE_EXISTING选项,则此方法将抛出DirectoryNotEmptyException,但由于该文件是非空目录而无法替换。

  • newBufferedReader(Path path,Charset cs):此方法通过返回用于从文件读取文本的BufferedReader使用给定的路径打开文件以进行读取。
    使用指定的字符集将文件中的字节解码为字符。

  • newBufferedWriter(路径,Charset cs,Openoption…选项):此方法通过返回用于将文本写入文件的BufferedWriter来使用给定的写入路径打开或者创建文件。
    options参数指定如何创建或者打开文件。
    如果未指定任何选项,则默认情况下考虑CREATE,TRUNCATE_EXISTING和WRITE选项,这意味着它将打开要写入的文件并创建文件是否不存在,或者将现有文件截断为0(如果存在)。
    如果指定了不支持的选项,则此方法将引发UnsupportedOperationException。

  • newByteChannel(路径路径,OpenOption…选项):此方法通过返回可搜索的字节通道来访问文件,从而使用指定的路径创建或者打开文件。
    如果指定了不支持的选项,则此方法将引发UnsupportedOperationException。

  • newDirectoryStream(Path path):此方法通过返回DirectoryStream来从指定路径遍历目录中的所有条目来打开目录。
    DirectoryStream的迭代器返回的元素的类型为Path,每个元素代表目录中的一项。
    如果给定路径下的文件不是目录,则无法打开该方法将引发NotDirectoryException。

  • newDirectoryStream(路径路径,Filter <?超级路径>过滤器):此方法通过返回DirectoryStream来从指定路径迭代目录中的所有条目来打开目录。
    DirectoryStream的迭代器返回的元素的类型为Path,每个元素代表目录中的一个条目,并且这些条目由指定的过滤器过滤。
    如果由于给定路径下的文件不是目录而无法打开,则此方法将引发NotDirectoryException。

  • newDirectoryStream(Path path,String glob):此方法通过返回DirectoryStream以从指定路径遍历目录中的所有条目来打开目录。
    DirectoryStream的迭代器返回的元素的类型为Path,每个元素代表目录中的一项,并且通过将其文件名的String表示与指定的glob模式匹配来过滤这些项。
    如果由于给定路径下的文件不是目录而无法打开该方法,则抛出NotDirectoryException;如果模式无效,则抛出PatternSyntaxException。

  • newInputStream(路径路径,Openoption…选项):此方法通过返回输入流以从指定路径读取文件来打开文件。
    options参数确定打开文件的方式,如果未指定选项,则使用READ打开文件。
    如果指定了无效的选项组合,则此方法引发IllegalArgumentException;如果指定了不受支持的选项,则引发UnsupportedOperationException。

  • newOutputStream(Path path,Openoption ... options):此方法通过返回输出流以将字节写入指定路径的文件中来打开文件。
    options参数确定打开文件的方式,如果未指定任何选项,则默认情况下考虑CREATE,TRUNCATE_EXISTING和WRITE选项,这意味着它将打开文件进行写入并创建文件(如果文件不存在)或者将现有文件截断成大小如果存在,则为0。
    如果指定了无效的选项组合,则此方法引发IllegalArgumentException;如果指定了不受支持的选项,则引发UnsupportedOperationException。

  • notExists(路径,LinkOption选项):此方法测试指定路径处的文件是否不存在。
    options参数用于指示如果文件是符号链接,则如何处理符号链接。
    默认情况下,遵循符号链接。
    如果存在选项NOFOLLOW_LINK,则不遵循符号链接。
    如果文件在指定路径中不存在,则此方法返回true;如果文件存在或者无法确定其存在,则返回false。

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

  • readAllLines(Path path,Charset cs):此方法从给定路径的文件中读取所有行,并返回包含文件中的行的List。

  • size(Path path):此方法返回指定路径上文件的大小(以字节为单位)。

  • walkFileTree(路径开始,FileVisitor <?超级路径>访问者):此方法用于遍历目录。
    它递归地遍历指定路径下的目录,并返回起始文件。

  • write(路径,byte []个字节,OpenOption…选项):此方法将字节写入指定路径的文件。
    options参数指定如何创建或者打开文件。
    如果未指定任何选项,则默认情况下考虑CREATE,TRUNCATE_EXISTING和WRITE选项,这意味着它将打开要写入的文件并创建文件是否不存在,或者将现有文件截断为0(如果存在)。
    字节数组中的所有字节均写入文件。
    此方法可确保在写入所有字节后关闭文件,并返回写入文件的路径。

使用文件类创建文件

Files类提供createFile(Path filePath,FileAttribute &lt;?>…attrs)方法,以使用指定的Path创建文件。

让我们看下面的示例程序。

package com.theitroad.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 hyman
 *
 */
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类提供createDirectory(Path dir,FileAttribute &lt;?>…attrs)createDirectories(Path dir,FileAttribute &lt;?>…attrs)方法,以使用指定的Path创建单级和多级目录。

让我们看下面的示例程序。

package com.theitroad.examples;

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

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

	public static void main(String[] args) {
		//initialize Path objects
		Path path1 = Paths.get("D:/hyman");
		Path path2 = Paths.get("D:/hyman/java7");
		Path path3 = Paths.get("D:/hyman/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:\hyman
Second Level Directory Created at Path : D:\hyman\java7
All Level Directories Created at Path : D:\hyman\java7\Files

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

可以使用以下方法将文件和路径对象彼此转换:

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):此方法从给定路径的文件中读取所有行,并返回包含文件中的行的List。

让我们看下面的示例程序。

package com.theitroad.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 hyman
 *
 */
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类提供了" copy(路径源,路径目标,CopyOption…选项)"方法,该方法将给定的源文件复制到指定的目标文件,并返回目标文件的路径。

让我们看下面的示例程序:

package com.theitroad.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 hyman
 *
 */
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

使用文件类移动文件

Java Files类提供了" move(路径源,路径目标,CopyOption…选项)"方法,该方法将源文件移动或者重命名为目标文件并返回目标文件的路径。

选项参数可以包括:

REPLACE_EXISTING:这意味着目标文件是否存在,如果它不是非空目录,则将其替换。

ATOMIC_MOVE:这意味着移动是作为原子文件系统操作执行的,所有其他选项都将被忽略。

如果目标文件存在,但是由于未指定REPLACE_EXISTING选项而无法替换,则此方法将抛出FileAleadyExistsException

如果指定了REPlACE_EXISTING选项,则此方法抛出DirectoryNotEmptyException,但由于该文件是非空目录,因此无法替换。

让我们看下面的示例程序:

package com.theitroad.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 hyman
 *
 */
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();
		}
	}

}

使用文件类写入文件

Java NIO Files类提供write(Path path,byte [] bytes,OpenOption ... options)方法,该方法将字节写入指定路径的文件。

options参数指定如何创建或者打开文件。
如果未指定任何选项,则默认情况下会考虑CREATE,TRUNCATE_EXISTING和WRITE选项。
这意味着它将打开要写入的文件,并创建不存在的文件,如果存在则将其截断为0。

字节数组中的所有字节均写入文件。
此方法可确保在写入所有字节后关闭文件,并返回写入文件的路径。

package com.theitroad.examples;

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

/**
 * Java Files write file example
 * 
 * @author hyman
 *
 */
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 <?Super Path> visitor)方法。
它递归地遍历指定路径下的目录,并返回起始文件。

package com.theitroad.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 hyman
 *
 */
public class FilesWalkFileTreeExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/hyman");
		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:\hyman
Pre Visit Directory: D:\hyman\java6
Pre Visit Directory: D:\hyman\java6\Files
Visit File: D:\hyman\java6\Files\file.txt.txt
Post Visit Directory: D:\hyman\java6\Files
Post Visit Directory: D:\hyman\java6
Pre Visit Directory: D:\hyman\java7
Pre Visit Directory: D:\hyman\java7\Files
Visit File: D:\hyman\java7\Files\file.txt.txt
Post Visit Directory: D:\hyman\java7\Files
Post Visit Directory: D:\hyman\java7
Pre Visit Directory: D:\hyman\java8
Pre Visit Directory: D:\hyman\java8\Files
Visit File: D:\hyman\java8\Files\file.txt.txt
Post Visit Directory: D:\hyman\java8\Files
Post Visit Directory: D:\hyman\java8
Post Visit Directory: D:\hyman

请注意,所有文件和文件夹都是递归处理的。
当您要对所有文件进行一些通用处理时,例如递归重命名目录中的所有文件,这非常有用。