目录
Java File类的使用
概述
java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对 象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
File对象可以作为参数传递给流的构造器。
常用构造器
序号 | 构造方法及描述 |
---|---|
1 | public File(String pathname) 绝对路径:是一个固定的路径,从盘符开始 |
2 | public File(String parent, String child) 以parent为父路径,child为子路径创建File对象。 |
3 | public File(File parent, String child) 根据一个父File对象和子文件路径创建File对象。 |
路径分隔符
路径中的每级目录之间用一个路径分隔符隔开。
路径分隔符和系统有关:windows和DOS系统默认使用“\”来表示,UNIX和URL使用“/”来表示。
Java程序支持跨平台运行,因此路径分隔符要慎用。为了解决这个隐患,File类提供了一个常量:public static final String separator。根据操作系统,动态的提供分隔符。
File file1 = new File("D:\\test\\info.txt");
File file2 = new File("D:" + File.separator + "test" + File.separator + "info.txt");
File file3 = new File("D:/test");
常用方法
序号 | 方法及描述 |
---|---|
1 | public String getAbsolutePath() |
2 | public String getPath() 获取路径 |
3 | public String getName() 获取名称 |
4 | public String getParent() 获取上层文件目录路径。若无,返回null |
5 | public long length() 获取文件长度(即:字节数)。不能获取目录的长度 |
6 | public long lastModified() 获取最后一次的修改时间,毫秒值 |
7 | public String[] list() 获取指定目录下的所有文件或者文件目录的名称数组 |
8 | public File[] listFiles() 获取指定目录下的所有文件或者文件目录的File数组 |
9 | public boolean renameTo(File dest) 把文件重命名为指定的文件路径 |
10 | public boolean isDirectory() 判断是否是文件目录 |
11 | public boolean isFile() 判断是否是文件 |
12 | public boolean exists() 判断是否存在 |
13 | public boolean canRead() 判断是否可读 |
14 | public boolean canWrite() 判断是否可写 |
15 | public boolean isHidden() 判断是否隐藏 |
16 | public boolean createNewFile() 创建文件。若文件存在,则不创建,返回false |
17 | public boolean mkdir() 创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建。 |
18 | public boolean mkdirs() 创建文件目录。如果上层文件目录不存在,一并创建。 注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。 |
19 | public boolean delete() 删除文件或者文件夹。 删除注意事项:Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。 |
创建目录和文件
File dir1 = new File("D:/IOTest/dir1");
if (!dir1.exists()) { // 如果D:/IOTest/dir1不存在,就创建为目录
dir1.mkdir();
}
// 创建以dir1为父目录,名为"dir2"的File对象
File dir2 = new File(dir1, "dir2");
if (!dir2.exists()) { // 如果还不存在,就创建为目录
dir2.mkdirs();
}
File dir4 = new File(dir1, "dir3/dir4");
if (!dir4.exists()) {
dir4.mkdirs();
}
// 创建以dir2为父目录,名为"test.txt"的File对象
File file = new File(dir2, "test.txt");
if (!file.exists()) { // 如果还不存在,就创建为文件
file.createNewFile();
}
读取目录
一个目录其实就是一个 File 对象,它包含其他文件和文件夹。如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。
String dirname = "/tmp";
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println("目录 " + dirname);
String s[] = f1.list();
for (int i = 0; i < s.length; i++) {
File f = new File(dirname + "/" + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + " 是一个目录");
} else {
System.out.println(s[i] + " 是一个文件");
}
}
} else {
System.out.println(dirname + " 不是一个目录");
}
删除目录和文件
public static void main(String[] args) {
// 这里修改为自己的测试目录
File folder = new File("/tmp/java/");
deleteFolder(folder);
}
// 删除文件及目录
public static void deleteFolder(File folder) {
File[] files = folder.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
deleteFolder(f);
} else {
f.delete();
}
}
}
folder.delete();
}
NIO.2中Path、Paths、Files类的使用
Java NIO概述
Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。
Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
|-----java.nio.channels.Channel
|-----FileChannel:处理本地文件
|-----SocketChannel:TCP网络编程的客户端的Channel
|-----ServerSocketChannel:TCP网络编程的服务器端的Channel
|-----DatagramChannel:UDP网络编程中发送端和接收端的Channel
随着 JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。因为 NIO 提供的一些功能,NIO已经成为文件处理中越来越重要的部分。
Path、Paths和Files核心API
早期的Java只提供了一个File类来访问文件系统,但File类的功能比较有限,所提供的方法性能也不高。而且,大多数方法在出错时仅返回失败,并不会提供异常信息。
NIO. 2为了弥补这种不足,引入了Path接口,代表一个平台无关的平台路径,描述了目录结构中文件的位置。Path可以看成是File类的升级版本,实际引用的资源也可以不存在。
在以前IO操作都是这样写的:
import java.io.File;
File file = new File("index.html");
但在Java7 中,我们可以这样写:
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get("index.html");
同时,NIO.2在java.nio.file包下还提供了Files、Paths工具类,Files包含了大量静态的工具方法来操作文件;Paths则包含了两个返回Path的静态工厂方法。
Paths 类提供的静态 get() 方法用来获取 Path 对象:
static Path get(String first, String … more) : 用于将多个字符串串连成路径
static Path get(URI uri): 返回指定uri对应的Path路径
Path接口
序号 | 方法及描述 |
---|---|
1 | String toString() 返回调用 Path 对象的字符串表示形式 |
2 | boolean startsWith(String path) 判断是否以 path 路径开始 |
3 | boolean endsWith(String path) 判断是否以 path 路径结束 |
4 | boolean isAbsolute() 判断是否是绝对路径 |
5 | Path getParent() 返回Path对象包含整个路径,不包含 Path 对象指定的文件路径 |
6 | Path getRoot() 返回调用 Path 对象的根路径 |
7 | Path getFileName() 返回与调用 Path 对象关联的文件名 |
8 | int getNameCount() 返回Path 根目录后面元素的数量 |
9 | Path getName(int idx) 返回指定索引位置 idx 的路径名称 |
10 | Path toAbsolutePath() 作为绝对路径返回调用 Path 对象 |
11 | Path resolve(Path p) 合并两个路径,返回合并后的路径对应的Path对象 |
12 | File toFile() 将Path转化为File类的对象 |
Files 类
java.nio.file.Files 用于操作文件或目录的工具类。
序号 | 方法及描述 |
---|---|
1 | Path copy(Path src, Path dest, CopyOption … how) 文件的复制 |
2 | Path createDirectory(Path path, FileAttribute<?> … attr) 创建一个目录 |
3 | Path createFile(Path path, FileAttribute<?> … arr) 创建一个文件 |
4 | void delete(Path path) 删除一个文件/目录,如果不存在,执行报错 |
5 | void deleteIfExists(Path path) Path对应的文件/目录如果存在,执行删除 |
6 | Path move(Path src, Path dest, CopyOption…how) 将 src 移动到 dest 位置 |
7 | long size(Path path) 返回 path 指定文件的大小 |
8 | boolean exists(Path path, LinkOption … opts) 判断文件是否存在 |
9 | boolean isDirectory(Path path, LinkOption … opts) 判断是否是目录 |
10 | boolean isRegularFile(Path path, LinkOption … opts) 判断是否是文件 |
11 | boolean isHidden(Path path) 判断是否是隐藏文件 |
12 | boolean isReadable(Path path) 判断文件是否可读 |
13 | boolean isWritable(Path path) 判断文件是否可写 |
14 | boolean notExists(Path path, LinkOption … opts) 判断文件是否不存在 |
15 | SeekableByteChannel newByteChannel(Path path, OpenOption…how) 获取与指定文件的连接,how 指定打开方式 |
16 | DirectoryStream<Path> newDirectoryStream(Path path) 打开 path 指定的目录 |
17 | InputStream newInputStream(Path path, OpenOption…how) 获取 InputStream 对象 |
18 | OutputStream newOutputStream(Path path, OpenOption…how) 获取 OutputStream 对象 |