From Gossip@Openhome

Java Gossip: File

不同的作業系統對於檔案系統路徑的設定各有差別,例如在Windows中,一個路徑的表示法可能是:
"c:\\Windows\\Fonts\\"

而在Linux下的路徑設定可能是:
"/home/justin/"

Windows的路徑指定是使用UNC(Universal Naming Convention)路徑名,以\\開始表示磁碟根目錄,如果沒有以\\開始表示相對路徑,c是可選的磁碟指定,後面跟隨著 : 字元。而UNIX-Like系統的路徑指定以 / 開始表示絕對路徑,不以 / 開始表示相對路徑。

因而在程式中設定路徑時會有系統相依性的問題,File類別提供一個抽象的、與系統獨立的路徑表示,您給它一個路徑字串,它會將它轉換為與系統無關的抽象路徑表示,這個路徑可以指向一個檔案、目錄或是URI,您可以用以下四種方式來建構File的實例:
File(File parent, String child)
File(String pathname)
File(String parent, String child)
File(URI uri)

一個File的實例被建立時,它就不能再被改變內容;File類別除了用來表示一個檔案或目錄的抽象表示之外,它還提供了不少相關操作方法,您可以用它來對檔案系統作一些查詢與設定的動作。

來看個簡單的程式:

  • FileDemo.java
package onlyfun.caterpillar;

import java.io.*;
import java.util.*;

public class FileDemo {
public static void main(String[] args) {
try {
File file = new File(args[0]);
if(file.isFile()) { // 是否為檔案
System.out.println(args[0] + " 檔案");
System.out.print(
file.canRead() ? "可讀 " : "不可讀 ");
System.out.print(
file.canWrite() ? "可寫 " : "不可寫 ");
System.out.println(
file.length() + "位元組");
}
else {
// 列出所有的檔案及目錄
File[] files = file.listFiles();
ArrayList<File> fileList =
new ArrayList<File>();
for(int i = 0; i < files.length; i++) {
// 先列出目錄
if(files[i].isDirectory()) { //是否為目錄
// 取得路徑名
System.out.println("[" +
files[i].getPath() + "]");
}
else {
// 檔案先存入fileList,待會再列出
fileList.add(files[i]);
}
}

// 列出檔案
for(File f: fileList) {
System.out.println(f.toString());
}
System.out.println();
}
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println(
"using: java FileDemo pathname");
}
}
}


執行結果:
 java onlyfun.caterpillar.FileDemo C:\
[C:\WINDOWS]
[C:\Documents and Settings]
[C:\Program Files]
[C:\System Volume Information]
[C:\Recycled]
C:\A3N_A3L.10
C:\bootfont.bin
C:\ntldr
C:\NTDETECT.COM
C:\boot.ini
C:\CONFIG.SYS
C:\AUTOEXEC.BAT
C:\IO.SYS
C:\MSDOS.SYS
C:\Finish.log
C:\pagefile.sys
C:\VIRTPART.DAT