nio2 java_java NIO2(file io)
Technorati 標(biāo)簽: java,nio2
一、Path 類
從 java 7 開始引進(jìn)了一個(gè)類 Path,可以想當(dāng)然地認(rèn)為這個(gè)類就是為操作路徑而誕生的。Path 對(duì)象包含了其對(duì)應(yīng)的文件名和目錄列表,可以用來檢索、定位和操作文件。
1、創(chuàng)建一個(gè)Path 對(duì)象
可以使用輔助類輔助類 Paths.get()方法獲取一個(gè) Path 對(duì)象(注意輔助類是 Paths ),Demo:
Path p1 = Paths.get("/tmp/foo");
Path p2 = Paths.get(filename);
Path p3 = Paths.get(URI.create("C://File.java"));
方法 Paths.get()可以看成下面的縮寫:
Path path = FileSystems.getDefault().getPath("C:\\File.java");
2、提取 Path 對(duì)象的信息
Path path = Paths.get("D:\\Program Files\\Java\\text.txt");
System.out.format("toString: %s%n", path.toString()); //D:\Program Files\Java\text.txt
System.out.format("getFileName: %s%n", path.getFileName()); //text.txt
System.out.format("getName(0): %s%n", path.getName(0)); //Program Files
System.out.format("getNameCount: %d%n", path.getNameCount()); //3
System.out.format("subpath(0,2): %s%n", path.subpath(0,2)); // Program Files\Java
System.out.format("getParent: %s%n", path.getParent()); // D:\Program Files\Java
System.out.format("getRoot: %s%n", path.getRoot()); //D:\
Path 同樣可以是想對(duì)象路勁,如下:
Path path = Paths.get(“\\java\\text.txt”);
3、Path 的轉(zhuǎn)換
(1)將 path 轉(zhuǎn)換為 uri,使用Path.toUri() 方法,如下:
Path path = Paths.get("\\Java\\text.txt");
System.out.format("%s%n", path.toUri());
//輸出:file:///I:/Java/text.txt
(2)toAbsolutePath 轉(zhuǎn)換為絕對(duì)路徑,如下:
Path path = Paths.get("\\Java\\text.txt");
System.out.format("%s%n", path.toAbsolutePath());
//輸出:I:\Java\text.txt
(3)toFile() 轉(zhuǎn)換為文件,如下:
Path path = Paths.get("D:\\Program Files\\Java\\text.txt");
File filePath = path.toFile();
System.out.format("%s%n",filePath);
System.out.format("fileExist? %b%n",filePath.exists());
//輸出:D:\Program Files\Java\text.txt
//fileExist? true
4、連接兩個(gè) path
(1)當(dāng)被連接的 path 不包含的根路徑時(shí),會(huì)直接將此 path 連接到原 path 后面,如下:
Path path = Paths.get("D:\\Program Files\\Java");
System.out.format("%s%n",path.resolve("other.txt"));
//輸出:D:\Program Files\Java\other.txt
//注意:這里并沒有創(chuàng)建 other.txt這個(gè)文件
(2)當(dāng)被連接的 path 包含根路徑時(shí),resolve()h會(huì)返回此 path 對(duì)象,如下:
Path path = Paths.get("java").resolve("D:\\Program Files");
System.out.format("%s%n",path);
//輸出:D:\Program Files
5、在兩個(gè) path 之間創(chuàng)建它們的路徑
有時(shí)候我們需要知道兩個(gè)文件夾之間的路徑,如下:
Path p1 = Paths.get("jdk1.7.0_40");
Path p2 = Paths.get("java");
Path p1_to_p2 = p1.relativize(p2);//..\java
Path p2_to_p1 = p1_to_p2.relativize(p1);//..\..\jdk1.7.0_40
6、比較兩個(gè) path
Path 對(duì)象支持使用 equals()方法來判斷兩個(gè)path 是否一致,也可以使用 startWith() 和 endWith() 來判斷path 是否以 指定字符串開始或結(jié)束。如下:
Path path = ...;
Path otherPath = ...;
Path beginning = Paths.get("/home");
Path ending = Paths.get("java");
if (path.equals(otherPath)) {
} else if (path.startsWith(beginning)) {
// 以“/home”開始的path
} else if (path.endsWith(ending)) {
// 以 “java” 結(jié)束的 path
}
二、文件操作
當(dāng)存在一個(gè) path 對(duì)象時(shí),需要判斷這個(gè) path 對(duì)應(yīng)的文件(或目錄)是否存在,是否可讀,是否可寫??
...
1、判斷文件/目錄 是否存在
可以使用方法 exists(Path, LinkOption...) 和 notExists(Path, LinkOption...) 來判斷文件/目錄是否存在。值得引起注意的一件事是,!Files.exist(path) 并與 Files.exist(path) 等同,因?yàn)楫?dāng)你在測(cè)試一個(gè)文件/目錄是否存在時(shí),有可能出現(xiàn)以下三種結(jié)果:
(1)文件/目錄 確認(rèn)存在
(2)文件/目錄 確認(rèn)不存在
(3)無法判斷文件/目錄是否存在,這種情況會(huì)出在在程序無權(quán)訪問指定文件/目錄 時(shí)。
當(dāng) exists()和 notExists()都返回 false,無法判斷指定文件/目錄 是否存在。
2、檢查文件的訪問權(quán)
使用 isReadable(Path), isWritable(Path), 和 isExecutable(Path) 方法,可以判斷出文件是否可以被訪問。如下代碼,判斷文件是否可以執(zhí)行:
Path file = ...;
boolean isRegularExecutableFile = Files.isRegularFile(file) & Files.isReadable(file) & Files.isExecutable(file);
3、判斷兩個(gè) path 是否為同一文件/目錄
使用 isSameFile(Path, Path) 判斷是否為同一文件/目錄,如下:
Path p1 = ...;
Path p2 = ...;
if (Files.isSameFile(p1, p2)) {
...
}
4、刪除 文件/目錄
(1)使用 delete(path)方法可以刪除一個(gè)文件/目錄,如果刪除失敗,會(huì)判處一個(gè) IO 異常。如,當(dāng)文件不存在時(shí),會(huì)拋出 NoSuchFileException,如下:
try {
Files.delete(path);
} catch (NoSuchFileException x) {
System.err.format("%s: no such" + " file or directory%n", path);
} catch (DirectoryNotEmptyException x) {
System.err.format("%s not empty%n", path);
} catch (IOException x) {
// 在此捕捉無權(quán)操作文件異常
System.err.println(x);
}
(2)使用 deleteIfExists(Path) 同樣可以刪除文件/目錄,不過此方法不會(huì)拋出異常
5、復(fù)制文件/目錄
可以使用方法 copy(Path, Path, CopyOption...) 復(fù)制一個(gè)文件/目錄,除非指定了 REPLACE_EXISTING ,否則當(dāng)目標(biāo)文件已存在是,復(fù)制都會(huì)失敗。
另外當(dāng)復(fù)制目錄時(shí),并不會(huì)復(fù)制其內(nèi)的文件,換言之,無論被復(fù)制的目錄里有多少文件,新復(fù)制出來的為目錄都是空的。
當(dāng)復(fù)制一個(gè)快捷方式時(shí),會(huì)復(fù)制這個(gè)快捷方式對(duì)應(yīng)的文件。如果只是想復(fù)制快捷方式本事,可以指定 CopyOption 為 REPLACE_EXISTING? 或者 NOFOLLOW_LINKS。
CopyOption 支持一下枚舉變量:
(1)REPLACE_EXISTING? 復(fù)制和替換已存在的文件
(2)COPY_ATTRIBUTES 將原文件的文件屬性復(fù)制給目標(biāo)文件。
(3)NOFOLLOW_LINKS 只是復(fù)制快捷方式本身。
如下演示了如何使用 copy(Path, Path, CopyOption...) :
import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);
另外,在 Files 里,也定義其他方法,用來處理 流與文件 之間的復(fù)制。方法 copy(InputStream, Path, CopyOptions...) 可以將輸入的任意的 字節(jié)流飛復(fù)制到一個(gè)文件里;方法 copy(Path, OutputStream) 可以將任意文件以字節(jié)的形式復(fù)制到一個(gè)輸出流里。
6、移動(dòng)文件/目錄
可以使用方法 move(Path, Path, CopyOption...) 移動(dòng)文件/目錄,除非指定了 CopyOption 為 REPLACE_EXISTING ,否則當(dāng)目標(biāo)文件已存在時(shí),移動(dòng)失敗。
使用模板如下:
import static java.nio.file.StandardCopyOption.*;
...
Files.move(source, target, REPLACE_EXISTING);
7、操作文件的屬性
因?yàn)椴煌牟僮飨到y(tǒng),支持的文件屬性與操作方式不一致,在這里只是演示一下如何獲取基本的文件屬性。
public class FileIoTest {
public static void main(String[] args) throws IOException {
Path path = Paths.get("D:\\Program Files\\Java");
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());
System.out.println("isDirectory: " + attr.isDirectory());
System.out.println("isOther: " + attr.isOther());
System.out.println("isRegularFile: " + attr.isRegularFile());
System.out.println("isSymbolicLink: " + attr.isSymbolicLink());
System.out.println("size: " + attr.size());
}
}
總結(jié)
以上是生活随笔為你收集整理的nio2 java_java NIO2(file io)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java contions_Java数据
- 下一篇: hardfault常见原因_XMC实验分