在Java语言中,File类提供了描述文件和目录的方法。File类也在java.io包中,但它不是InputStream和OutputStream的子类,因为它不负责数据的输入输出,而是专门用来管理磁盘文件和目录。
若想获取文件的信息,就应该创建一个File类的对象。这个类能向系统询问从文件名字到文件上次修改时间的每件事情。也可以用File类来建立目录、删除文件和改变文件名。创建File对象由调用3个构造方法中的一个来实现,它们是:
File(String path)
File(String path,String name)
File(File dir,String name)
第一个构造方法从所给的完整路径名建立一个File对象,第二个构造方法从一个单独的路径名和文件名创建对象,第三个构造方法从一个单独的路径和文件名创建对象,这个路径是和另—个File对象相连的。
File类提供了—整套方法给程序以许多文件处理操作。表11-5列出了这些方法和它们的描述。
表11-5 File类的方法
方 法 |
描 述 |
getName ( ) |
得到文件名 |
getPath ( ) |
得到文件的目录 |
getAbsolutePath ( ) |
得到文件的绝对目录 |
getParent ( ) |
得到文件的父目录 |
exists ( ) |
如果文件存在,则返回true |
canWrite ( ) |
如果文件能被写,则返回true |
续上表
方 法 |
描 述 |
canRead ( ) |
如果文件能被读,则返回true |
isFile ( ) |
如果文件有效,则返回true |
isDirectory ( ) |
如果目录有效,则返回true |
isAbsolute ( ) |
如果文件名是绝对名,则返回true |
lastModified ( ) |
返回文件最后被修改的时间 |
length ( ) |
返回文件的长度 |
mkdir |
创建子目录 |
renameTo |
重命名文件 |
mkdirs |
创建目录树 |
list |
得到目录中的文件清单 |
delete |
删除文件 |
hashCode |
为文件创建散列代码 |
equals |
比较两个文件对象 |
toString |
得到含有文件目录的字符串 |
File类用来代表一个文件、一个目录名或一个文件和目录名的组合。所用到的文件名都是高度系统相关的,但是File类提供方便的方法以独立于系统的方式访问和操作文件。Java API按如下方式定义File类。
public class File extends Object implements Serializable, Comparable{
public File(String pathname) // 构造方法
西文
public static final String separator // 成员变量
…… // 成员方法
}
这个类实际上隐藏了大量与系统相关的复杂因素和细节。例如,在Windows系统中目录名和文件名被字符“\”分开,在UNIX系统中用分隔符“/”,而在Macintosh中用“:”分隔。而无论是哪个系统,Java程序都使用File.separator作为分隔符。这个字符串包含单个字符,它在当前的Java虚拟机所处的操作系统下总是正确的分隔符。File类中还有其他许多有效的方法,这些方法都有极大的系统相关性。
目录是一个包含其他文件和路径列表的File类。当创建一个File对象且它是目录时,isDirectory( )方法返回ture。这种情况下,可以调用该对象的list( )方法来提取该目录内部其他文件和目录的列表。
如果希望限制由list( )方法返回的文件数目,使它返回与一定的文件名方式或者过滤(Filter)相匹配的文件,则使用list( )的形式如下。
String[ ] list (FilenameFilter FFObj)
该形式中,FFObj是一个实现FilenameFilter(文件过滤器)接口的类的对象。
FilenameFilter接口仅定义了一个方法,即accept( )。该方法被列表中的每个文件调用一次。它的通常形式如下。
boolean accept ( File directory, String filename)
当被directory指定的目录中的文件(即与filename参数匹配的文件)包含在列表中时,accept( )方法返回true,当这些文件没有包括在列表中时,accept( )方法返回false。
【例11-5】本例的OnlyExt类实现FilenameFilter接口,它被用来修饰前面的程序,限制由list( )返回的文件名的可见度,把对象被创建时以指定扩展名结束的文件归档。
import java.yo.*;
public class OnlyExt implements FilenameFilter {
String ext ;
public OnlyExt (String ext) {
this.ext="."+ext;
}
public boolean accept (File dir,String name) {
return name.endsWith(ext);
}
}
修改过的目录列表程序如下所示。现在它只显示以.html为扩展名的文件。
// Directory of .HTML files.
import java.io.*;
class DirListOnly {
public static void main (String args[ ]) {
String dirname="/java";
File f1=new File(dirname);
FilenameFilter only=new OnlyExt (“html”);
String s[ ]=f1.list(only);
for(int i=0;i<s.length;i++) {
system.out.println(s[i]);
}
}
}
通过FileRandomAccess类,可以做任何想对文件做的事情。
通过调用这个类的两个构造方法中的任何一个可以创建Random AccessFile对象,这两个构造方法如下。
Random AccessFile(String name,String mode);
Random AccessFile(File file,String mode);
第一个构造方法从一个包含文件名字的字符串及一个包含访问模式的字符串中创建对象,第二个构造方法则从Fi1e对象以及模式串中创建对象。一旦创建了Random AccessFile对象,就可以用它的方法操作文件,这些方法见表11-6。
表11-6 随机存取文件类的方法
方 法 |
描 述 |
close ( ) |
关闭文件 |
getFD ( ) |
得到一个文件的FileDescriptor对象 |
getFilePointer ( ) |
得到文件指针的位置 |
length ( ) |
得到文件的长度 |
read ( ) |
从文件中读取数据 |
readBoolean ( ) |
从文件中读取布尔值 |
readByte ( ) |
从文件中读取一个字节 |
readChar ( ) |
从文件中读取一个字符 |
readDouble ( ) |
从文件中读取一个双精度的浮点数 |
readFloat ( ) |
从文件中读取一个浮点数 |
readFully ( ) |
从文件中把数据读取到数组中,完全充满数组 |
readInt ( ) |
从文件中读取一个int |
readLine ( ) |
从文件中读取一行文本 |
readLong ( ) |
从文件中读取一个long int |
readShort ( ) |
从文件中读取一个short int |
readUnsingByte ( ) |
从文件中读取一个无符号字节 |
readUnsingShort ( ) |
从文件中读取一个short int |
readUTF ( ) |
从文件中读取一个UTF字符串 |
seek ( ) |
文件中的文件指针位置 |
skipBytes ( ) |
在文件中跳过给定数目的字节 |
write ( ) |
往文件中写入数据 |
writeBoolean ( ) |
往文件中写入布尔值 |
writeByte ( ) |
往文件中写入一个字节 |
writeBytes ( ) |
以字节形式写入一个字符串 |
writechar ( ) |
往文件中写入一个字符 |
writechars ( ) |
以字符数据形式写入一个字符串 |
writeDouble ( ) |
往文件中写入一个双精度的浮点符 |
writeFloat ( ) |
往文件中写入一个浮点符 |
writeInt ( ) |
往文件中写入一个int |
writeLong ( ) |
往文件中写入一个long int |
writeShort ( ) |
往文件中写入一个short int |
writeUTF ( ) |
写入一个UTF字符串 |