ITEEDU

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 fileList =
				new ArrayList();
				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