Java文件– java.nio.file.Files类
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 <?>…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 <?>…attrs)
和createDirectories(Path dir,FileAttribute <?>…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
请注意,所有文件和文件夹都是递归处理的。
当您要对所有文件进行一些通用处理时,例如递归重命名目录中的所有文件,这非常有用。