nio2 java_java NIO2(file io)
Technorati 標簽: java,nio2
一、Path 類
從 java 7 開始引進了一個類 Path,可以想當然地認為這個類就是為操作路徑而誕生的。Path 對象包含了其對應的文件名和目錄列表,可以用來檢索、定位和操作文件。
1、創建一個Path 對象
可以使用輔助類輔助類 Paths.get()方法獲取一個 Path 對象(注意輔助類是 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 對象的信息
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 同樣可以是想對象路勁,如下:
Path path = Paths.get(“\\java\\text.txt”);
3、Path 的轉換
(1)將 path 轉換為 uri,使用Path.toUri() 方法,如下:
Path path = Paths.get("\\Java\\text.txt");
System.out.format("%s%n", path.toUri());
//輸出:file:///I:/Java/text.txt
(2)toAbsolutePath 轉換為絕對路徑,如下:
Path path = Paths.get("\\Java\\text.txt");
System.out.format("%s%n", path.toAbsolutePath());
//輸出:I:\Java\text.txt
(3)toFile() 轉換為文件,如下:
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、連接兩個 path
(1)當被連接的 path 不包含的根路徑時,會直接將此 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
//注意:這里并沒有創建 other.txt這個文件
(2)當被連接的 path 包含根路徑時,resolve()h會返回此 path 對象,如下:
Path path = Paths.get("java").resolve("D:\\Program Files");
System.out.format("%s%n",path);
//輸出:D:\Program Files
5、在兩個 path 之間創建它們的路徑
有時候我們需要知道兩個文件夾之間的路徑,如下:
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、比較兩個 path
Path 對象支持使用 equals()方法來判斷兩個path 是否一致,也可以使用 startWith() 和 endWith() 來判斷path 是否以 指定字符串開始或結束。如下:
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” 結束的 path
}
二、文件操作
當存在一個 path 對象時,需要判斷這個 path 對應的文件(或目錄)是否存在,是否可讀,是否可寫??
...
1、判斷文件/目錄 是否存在
可以使用方法 exists(Path, LinkOption...) 和 notExists(Path, LinkOption...) 來判斷文件/目錄是否存在。值得引起注意的一件事是,!Files.exist(path) 并與 Files.exist(path) 等同,因為當你在測試一個文件/目錄是否存在時,有可能出現以下三種結果:
(1)文件/目錄 確認存在
(2)文件/目錄 確認不存在
(3)無法判斷文件/目錄是否存在,這種情況會出在在程序無權訪問指定文件/目錄 時。
當 exists()和 notExists()都返回 false,無法判斷指定文件/目錄 是否存在。
2、檢查文件的訪問權
使用 isReadable(Path), isWritable(Path), 和 isExecutable(Path) 方法,可以判斷出文件是否可以被訪問。如下代碼,判斷文件是否可以執行:
Path file = ...;
boolean isRegularExecutableFile = Files.isRegularFile(file) & Files.isReadable(file) & Files.isExecutable(file);
3、判斷兩個 path 是否為同一文件/目錄
使用 isSameFile(Path, Path) 判斷是否為同一文件/目錄,如下:
Path p1 = ...;
Path p2 = ...;
if (Files.isSameFile(p1, p2)) {
...
}
4、刪除 文件/目錄
(1)使用 delete(path)方法可以刪除一個文件/目錄,如果刪除失敗,會判處一個 IO 異常。如,當文件不存在時,會拋出 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) {
// 在此捕捉無權操作文件異常
System.err.println(x);
}
(2)使用 deleteIfExists(Path) 同樣可以刪除文件/目錄,不過此方法不會拋出異常
5、復制文件/目錄
可以使用方法 copy(Path, Path, CopyOption...) 復制一個文件/目錄,除非指定了 REPLACE_EXISTING ,否則當目標文件已存在是,復制都會失敗。
另外當復制目錄時,并不會復制其內的文件,換言之,無論被復制的目錄里有多少文件,新復制出來的為目錄都是空的。
當復制一個快捷方式時,會復制這個快捷方式對應的文件。如果只是想復制快捷方式本事,可以指定 CopyOption 為 REPLACE_EXISTING? 或者 NOFOLLOW_LINKS。
CopyOption 支持一下枚舉變量:
(1)REPLACE_EXISTING? 復制和替換已存在的文件
(2)COPY_ATTRIBUTES 將原文件的文件屬性復制給目標文件。
(3)NOFOLLOW_LINKS 只是復制快捷方式本身。
如下演示了如何使用 copy(Path, Path, CopyOption...) :
import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);
另外,在 Files 里,也定義其他方法,用來處理 流與文件 之間的復制。方法 copy(InputStream, Path, CopyOptions...) 可以將輸入的任意的 字節流飛復制到一個文件里;方法 copy(Path, OutputStream) 可以將任意文件以字節的形式復制到一個輸出流里。
6、移動文件/目錄
可以使用方法 move(Path, Path, CopyOption...) 移動文件/目錄,除非指定了 CopyOption 為 REPLACE_EXISTING ,否則當目標文件已存在時,移動失敗。
使用模板如下:
import static java.nio.file.StandardCopyOption.*;
...
Files.move(source, target, REPLACE_EXISTING);
7、操作文件的屬性
因為不同的操作系統,支持的文件屬性與操作方式不一致,在這里只是演示一下如何獲取基本的文件屬性。
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());
}
}
總結
以上是生活随笔為你收集整理的nio2 java_java NIO2(file io)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java contions_Java数据
- 下一篇: hardfault常见原因_XMC实验分