Java:File与Files
0、说明
File:用于操作文件、目录的类。
Files:提供了许多静态方法用于操作文件、目录的类。
Files中全都是静态方法,只在本文第五节对这些方法加以说明,其他节都是File相关内容。
1、模块:java.io.File、java.nio.File.Files
2、字段:用法File.xxx
全是static修饰符,即静态字段,直接通过类名File访问
类型 |
字段 |
说明 |
| String | pathSeparator |
路径分隔符,String形式,Win10中是";" 这里的路径是指类似环境变量中的不同Path之间的分隔符 |
| char | pathSeparatorChar |
路径分隔符,char形式,Win10中是';' 注意与String形式的区别——引号 |
| String | separator | 路径中的文件分隔符,String形式,Win10中是"\" |
| char | separatorChar | 路径中的文件分隔符,char形式,Win10中是'\' |
3、构造方法
构造方法 |
说明 |
| File(File parent , String child) | 构造parent+child指定的文件对象 |
| File(String pathname) | 构造pathname指定路径的文件对象 |
| File(String parent , String child) | 构造parent+child指定的文件对象 |
| File(URI uri) | 构造URI指定的文件对象 |
File对象可以表示文件与目录,构造File时,即使传入的文件目录不存在也不会出错,因为单纯的构造并不会导致任何磁盘操作,只有当我们调用File的某些方法时,才真正进行磁盘操作。
4、路径
构造File时,可以传入绝对路径和相对路径,Windows平台用\作为文件分隔符,在Java字符串要用\\表示一个\。Linux平台使用/作为路径分隔符。
传入相对路径时,是相对于当前目录,也就是说当前目录+相对路径=绝对路径:
//假设当前目录是 C:\Docs File f1 = new File("sub\\javac"); // 绝对路径是C:\Docs\sub\javac File f3 = new File(".\\sub\\javac"); // 绝对路径是C:\Docs\sub\javac File f3 = new File("..\\sub\\javac"); // 绝对路径是C:\sub\javac
一个点.表示当前目录,两个点..表示父目录。
3种路径
| getPath() | 构造时传入的路径 |
| getAbsolutePath() | 绝对路径 |
| getCanonicalPath() | 规范路径 |
绝对路径:可能包含..与.的绝对路径;
规范路径:不包含..与.的绝对路径。
5、File静态方法:用法File.xxx( ... )
返回值类型 |
方法 |
说明 |
| File | createTempFile(String prefix , String suffix) | 在默认temporary-file目录下,用指定前后缀构造一个空文件 |
| File | createTempFile(String prefix , String suffix , File directory) | 在指定目录(参数directory)下,用指定前后缀构造一个空文件 |
| File[ ] | listRoots() |
列出可用的文件系统的roots |
5.5、Files静态方法:用法Files.xxx( ... )
返回值类型 |
方法 |
说明 |
| long | copy(InputStream in , Path target , CopyOption... options) | 从一个InputStream中复制全部bytes到文件中 |
| long | copy(Path source,OutputStream out) | 复制一个文件中的所有bytes到OutputStream中 |
| Path | copy(Path source , Path target , CopyOption... options) | 复制source到target处 |
| Path | createDirectories(Path dir , FileAttribute<?>... attrs) | 创建一个空目录 |
| Path |
createFile(Path dir ,FileAttribute<?> ... attrs) |
创建一个空文件 |
| Path | createLink(Path link , Path existing) | 为一个存在的文件构造link |
| Path | createSymbolicLink(Path link, Path target, FileAttribute<?>... attrs) | 为一个文件构造symbolic link |
| Path | createTempDirectory(String prefix, FileAttribute<?>... attrs) |
用给定前缀在默认临时文件夹中创建一个新目录 |
| Path | createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs) | 在给定目录中创建一个新目录 |
| Path | createTempFile(String prefix, String suffix, FileAttribute<?>... attrs) | 用给定前缀在默认临时文件夹中创建一个新文件 |
| Path | createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs) | 在给定目录中创建一个新文件 |
| void | delete(Path path) | 删除文件 |
| boolean | deleteIfExists(Path path) | 如果文件存在就删除文件 |
| boolean | exists(Path path, LinkOption... options) | 检查文件是否存在 |
| Stream<Path> | find(Path start, int maxDepth, BiPredicate<Path,BasicFileAttributes> matcher, FileVisitOption... options) | 返回搜索文件时,文件树上的Path构成的Stream |
| Object | getAttribute(Path path, String attribute, LinkOption... options) | 获取文件参数的值 |
| V | getFileAttributeView(Path path, Class<V> type, LinkOption... options) | 获取指定类型的文件参数的值 |
| FileStore | getFileStore(Path path) | 返回file所在的FileStore |
| FileTime | getLastModifiedTime(Path path, LinkOption... options) | 返回文件最近修改时间 |
| UserPrincipal | getOwner(Path path, LinkOption... options) | 返回文件所有者 |
| Set<PosixFilePermission> | getPosixFilePermissions(Path path, LinkOption... options) | 返回文件的POSIX权限 |
|
boolean |
isDirectory(Path path, LinkOption... options) isExecutable(Path path) isHidden(Path path) isReadable(Path path) isRegularFile(Path path, LinkOption... options) isSameFile(Path path, Path path2) isSymbolicLink(Path path) isWritable(Path path) |
文件是否是目录 是否可执行 是否是隐藏文件 是否可读 是否是规则文件 是否同一个文件 是否Sym link 是否可写 |
|
Stream<String> Stream<String> |
lines(Path path) lines(Path path, Charset cs) |
读取文件所有行为一个Stream |
| Stream<Path> | list(Path dir) | 以Stream的形式列出dir下的所有元素 |
| long | mismatch(Path path, Path path2) | 返回两个文件第一个不匹配的点,如果没有则返回-1L |
| Path | move(Path source, Path target, CopyOption... options) | 移动/重命名一个文件 |
| BufferedReader |
newBufferedReader(Path path) newBufferedReader(Path path, Charset cs) |
打开文件用以读取,返回它的BufferReader |
| BufferedWriter |
newBufferedWriter(Path path, Charset cs, OpenOption... options) newBufferedWriter(Path path, OpenOption... options) |
打开或创造一个文件用于写入,返回它的BufferWriter |
| SeekableByteChannel |
newByteChannel(Path path, OpenOption... options) newByteChannel(Path path, Set<? extends OpenOption> options, FileAttribute<?>... attrs) |
打开或创造一个文件用于访问,返回SeekableByteChannel |
| DirectoryStream<Path> |
newDirectoryStream(Path dir) newDirectoryStream(Path dir, String glob) newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) |
打开一个目录,返回一个DirectoryStream用于迭代该目录下的所有元素 |
| InputStream | newInputStream(Path path, OpenOption... options) | 打开一个文件,返回InputStream用于Read |
| OutputStream | newOutputStream(Path path, OpenOption... options) | 打开/创建一个文件,返回OutputStream用于Write |
| boolean | notExists(Path path, LinkOption... options) | 检查文件是否不存在 |
| String | probeContentType(Path path) |
检查文件的内容类型 |
| byte[ ] | readAllBytes(Path path) | 读取文件中的内容保存为byte[ ] |
| List<String> |
readAllLines(Path path) readAllLines(Path path, Charset cs) |
读取文件中的所有行,每行作为String List中的一个String |
|
A Map<String,Object> |
readAttributes(Path path, Class<A> type, LinkOption... options) readAttributes(Path path, String attributes, LinkOption... options) |
读取文件参数用于bulk操作 读取文件参数集合用于bulk操作 |
| String |
readString(Path path) readString(Path path, Charset cs) |
读取文件中所有内容到String中,默认解码方式为UTF-8(在第二个方法中可以指定) |
| Path | readSymbolicLink(Path link) |
读取link的Symbolic link |
| Path |
setAttribute(Path path, String attribute, Object value, LinkOption... options) setLastModifiedTime(Path path, FileTime time) setOwner(Path path, UserPrincipal owner) setPosixFilePermissions(Path path, Set<PosixFilePermission> perms) |
设置、更新文件相关信息 |
| long | size(Path path) | 返回文件大小(bytes) |
| Stream<Path> |
walk(Path start, int maxDepth, FileVisitOption... options) walk(Path start, FileVisitOption... options) |
返回Stream,用于遍历start以下的所有文件和目录 |
| Path |
walkFileTree(Path start, FileVisitor<? super Path> visitor) walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor) |
遍历文件树 |
| Path |
write(Path path, byte[] bytes, OpenOption... options) write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options) write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options)
|
向文件中写入bytes 向文件中按行写入text |
| Path |
writeString(Path path, CharSequence csq, Charset cs, OpenOption... options) writeString(Path path, CharSequence csq, OpenOption... options) |
向文件中写入CharSequence(字符序列) |
Files中提供的读写方法,受内存限制,只能读写小文件如配置文件等,不能一次读入几个G的大文件。读写大型文件仍然要使用文件流,每次只读写一部分文件内容。
6、实例方法:用法file.xxx( ... ),file是File类对象
返回值类型 |
方法 |
说明 |
| boolean | canExecute() | 检查该文件是否可执行 |
| boolean | canRead() | 检查该文件是否可Read |
| boolean | canWrite() | 检查该文件是否可Write |
| int | compareTo(File pathname) | 检查两个路径是否相同 |
| boolean | createNewFile() | 如果构造File的路径不存在同名文件,就构造一个新的、空的文件 |
| boolean | delete() | 删除文件/目录 |
| void | deleteOnExit() | 程序运行结束时删除文件 |
| boolean | equals(Object obj) | 检查该File是否与obj相等 |
| boolean | exists() | 检查文件是否存在 |
| File | getAbsoluteFile() | 得到该File的绝对File对象 |
| String | getAbsolutePath() | 得到该File的绝对路径 |
| File | getCanonicalFile() | 规范File对象 |
| String | getCanonicalPath() | 规范路径 |
| long | getFreeSpace() | 得到该File中的剩余空间(bytes) |
| String | getName() | 得到文件名 |
| String | getParent() | 得到父目录 |
| File | getParentFile() | 得到父目录对应的File对象 |
| String | getPath() | 得到构造方法传入的路径 |
| long | getTotalSpace() | 得到该File的总空间(bytes) |
| long | getUsableSpace() | 得到该File的可用空间(bytes) |
| int | hashCode() | 得到该File的hash code |
| boolean | isAbsolute() | 检测该File路径是否是绝对路径 |
| boolean | isDirectory() | 检查该File是否是目录 |
| boolean | isFile() | 检查该File是否是文件 |
| boolean | isHidden() | 检查该File是否被隐藏 |
| long | lastModified() | 上次修改时间戳 |
| long | length() | 返回该File的长度(文件实际大小 bytes) |
| String[ ] | list() | 返回该目录中的文件名 |
| String[ ] | list(FilenameFilter filter) | 筛选返回该目录中符合条件的文件名 |
| File[ ] | listFiles() | 返回上述两个方法的File类型 |
| File[ ] | listFiles(FilenameFilter filter) | |
| boolean | mkdir() | 创建一个空目录 |
| boolean | mkdirs() | 创建一个空目录,如果父目录不存在就同样创建 |
| boolean | renameTo(File dest) | 重命名该文件/目录 |
| boolean | setExecutable(boolean executable) | 设置权限(只针对owner) |
| boolean | setExecutable(boolean executable , boolean ownerOnly) | 设置权限(对owner及everybody) |
| boolean | setLastModified(long time) | 修改最近修改时间 |
| boolean | setReadable(boolean readable) | 设置owner的读取权限 |
| boolean | setReadable(boolean readable , boolean ownerOnly) | 设置owner或everybody的读取权限 |
| boolean | setReadOnly() | 设为只读文件 |
| boolean | setWritable(boolean writable) | 设置owner的写入权限 |
| boolean | setWritable(boolean writable , boolean ownerOnly) | 设置owner或everybody的写入权限 |
| Path | toPath() | 返回该文件的java.nio.file.Path对象 |
| String | toString() | 返回路径 |
| URI | toURI() | 构造一个file : URI |
7、具体方法
最常用
获取File对应的String:f.toString()
7.1、文件与目录
用isFile()、isDirectory()方法,可以判断该File是否是一个存在的文件、目录。
7.2、权限和大小
boolean canRead():是否可读;boolean canWrite():是否可写;boolean canExecute():是否可执行;long length():文件字节大小。
对于目录来说,可否执行表示能否列出它包含的文件和目录。
7.3、创建、删除
7.3.1、文件
当File表示一个文件时,通过createNewFile()创建新文件,delete()删除该文件:
File file = new File("/path/to/file"); if(file.createNewFile()){ //创建成功 ... if(file.delete()){ //删除成功 } }
有时,程序需要一些临时文件,可以通过File的静态方法createTempFile()来创建一个临时文件,以及deleteOnExit()在JVM退出时自动删除该文件:
File f = File.createTempFile("pre",".txt");//提供临时文件的前后缀
f.delteOnExit();//JVM退出时自动删除
需要注意的是,这个静态方法会抛出IOException,使用时要用try...catch...代码块,或者在调用方法处throws IOEception。
7.3.2、目录
boolean mkdir():创建当前File对象表示的目录;boolean mkdirs():创建当前File对象表示的目录,并在必要时将不存在的父目录也创建出来;boolean delete():删除当前File对象表示的目录,当前目录必须为空才能删除成功。
7.4、遍历文件与目录
当File表示一个目录时,可以使用list()、listFiles()列出目录下的文件、目录名。这两个都有一个重载方法(可以在之前6中实例方法中查看),可以过滤掉不想要的文件和目录:
File f = new File("C:\\Windows"); for(String s : f.list()) System.out.println(s);
File[] fs2 = f.listFiles(new FilenameFilter() { // 仅列出.exe文件 public boolean accept(File dir, String name) { return name.endsWith(".exe"); // 返回true表示接受该文件 } });
7.5、File→Path
- Path toPath():获取该File对应的java.nio.file.Path对象
Path和File类似,但是操作更简单,如果需要对Path进行拼接、遍历等操作,使用Path更方便。

浙公网安备 33010602011771号