Java的File类表示的是抽象的文件或目录路径名。(不但是文件,还有目录)用户界面和操作系统使用与系统相关的文件和目录路径名来命名文件或目录。这个类提供了一个抽象的、系统无关的分层路径名。一个抽象路径名包含两个组件:
1)一个可选的与系统相关的前缀字符串,如磁盘驱动器说明符、UNIX根目录"/"、或Windows UNC路径名
2)一个序列的零个或多个字符串名字.
抽象路径名的第一个名字可能是一个目录名称或者在Windows UNC路径名的情况下,一个主机名;每个后续的名称在抽象路径名表示一个目录;最后一个名字可以表示一个目录或者文件。空的抽象路径名没有前缀,只有一个空序列。
转换一个抽象路径名是与系统相关的。当将一个抽象路径名转换成路径名字符串时,每个名字被默认的seperator字符所分割,而这个默认的seperator是被定义在系统属性file.seperator并且在这个类中是通过公共域的形式可获得的,seperator和seperatorChar。当一个路径名字字符串被转换为抽象路径名时,这个名字会被默认的这个seperator所分割。而这些分隔符是依赖于系统的。
一个路径名,无论是以抽象路径还是以字符串形式表示,都可以是一个相对路径名或绝对路径名。绝对路径名就是不需要额外的信息就可以定位一个文件了,而相对路径名需要从别的路径名获得信息来推断。默认情况下,在java.io包中总是解决对当前 用户目录相对路径名。
抽象路径名的父抽象路径名可以通过getParent()方法获得,父路径名包含前缀和路径名中的每个序列,除了最后那一个。每个目录的抽象路径名是那些以这个抽象名开始的File对象的祖先。比如说"/user"是"/user/local/bin"的祖先.
前缀部分是用来处理在UNIX平台上的根目录和Windows平台上磁盘驱动符、根目录和UNX路径名。
1)对于UNIX平台,一个绝对路径名的前缀总是"/",相对路径名没有前缀。绝对路径名表示根目录有前缀“/”和一个空的名字序列,即“/”即表示根目录。
2)对于Windows平台,路径名的前缀包含驱动器说明符(包含驱动字母、“:”和),如果路径名为绝对路径名时,还需要包含“\\”。UNC的前缀为"\\\\";主机名和共享名为名字序列的前两个。相对路径名不需要指定驱动和前缀。
这个类的实例对象可能会或可能不会是一个实际的文件系统中的对象,比如说一个文件或目录。如果它表示一个对象,那么这个对象驻留在分区。分区是一个操作系统特定的存储文件系统的一部分。一个存储设备可以包含多个分区。
一个文件系统可能会限制在某些对象的操作,比如说读、写、执行。这些限定统称为访问权限。文件系统会在一个文件对象上有多中访问权限,比如说一份权限针对本用户,一份权限针对其他用户。访问权限可能会导致某些方法执行失败。
FIle类的实例是不可变的,也就是说,文件一旦被创建、抽象路径名表示的文件对象永远不会改变。
从官方Api可以看出几点:
1)File类表示的是文件和目录的抽象路径名。
2)抽象路径名包含前缀和名称序列。前缀依赖于系统、而名称的分隔符也依赖于系统。
3)文件可以以相对路径和绝对路径表示。
4)File对象不可变。
File f=new File("hello.txt");//相对路径名,通过将文件名转化为抽象路径名创建一个File实例 f.createNewFile();//以抽象路径名创建一个新的、空的文件,如果文件一开始不存在的话
有一点要牢记心中,File类表示的是一个抽象路径名,而不是真实的文件,所以第一行并没有创建真实的文件。执行完第二行后才出现了文件。
File dir=new File("Hello"); dir.mkdir();
同样和上面一样,第一行只是创建了一个抽象路径名,第二行执行后才产生了真实的目录。
System.out.println("Is File: "+f.isFile());//测试是否为文件 System.out.println("Is Absolute: "+f.isAbsolute());//测试抽象路径是否为绝对的 System.out.println("Absolute Path: "+f.getAbsolutePath()); System.out.println("Name: "+f.getName()); System.out.println("Parent Path: "+f.getParent()); System.out.println("Path: "+f.getPath());//将抽象路径名转换为路径名字符串
Output:
FileOutputStream fos=new FileOutputStream(f); fos.write("Hello World".getBytes()); FileInputStream fis=new FileInputStream(f); byte[] buff=new byte[128]; fis.read(buff); System.out.println("Read Content:"+new String(buff));
Output:
import java.io.*; class FileList { public static void main(String[] args){ File rootDir=new File("F:\\Workspace\\Editplus"); list(rootDir); } //列出目录f中的的所有文件和目录 public static void list(File f){ //如果f是目录 if(f.isDirectory()){ System.out.println("Directory: "+f.getName()); File[] childFiles=f.listFiles(); //遍历文件名称 for(int i=0;i<childFiles.length;i++){ //对文件进行判断,如果是目录,则递归查出其下的文件 if(childFiles[i].isDirectory()) list(childFiles[i]); else System.out.println("File: "+childFiles[i].getName()); } } } }
Output:
如果我们想只显示java文件而不显示字节码文件,该如何实现呢?这可以使用
listFiles(FileFilter filter)
方法。
//列出目录f中所有的java文件 public static void listJava(File f){ //只列出java文件 File[] childFiles=f.listFiles(new FileFilter(){ public boolean accept(File file){ Pattern p=Pattern.compile(".*\\.java");//以.java结尾 return p.matcher(file.getName()).matches(); } }); for(int i=0;i<childFiles.length;i++){ System.out.println("File: "+childFiles[i].getName()); } }
Output:
File f=new File("hello.txt"); f.createNewFile(); System.out.println("Can Read: "+f.canRead()); System.out.println("Can Write: "+f.canWrite()); System.out.println("Can Execute: "+f.canExecute()); f.setReadable(false); f.setWritable(false); f.setExecutable(false); System.out.println("Can Read? "+f.canRead()); System.out.println("Can Write? "+f.canWrite()); System.out.println("Can Execute?"+f.canExecute());
设置完支护再操作文件,发现可以修改,但是保存时会提醒保存为另外意外一份本件。而设置权限还有几个重载的方法,可以查看Api看一下。
删除文件提供了delete方法。
在Windows上文件名称的分隔符为“\”,再加上转义字符,所以在代码中应写为"\\",而在UNIX上文件名称分割符为“/”,所以要如果要编写跨平台的程序时,最好使用File类给我们提供的两个静态域,seperator和seperatorChar,这样就不需要我们担心这些区别了。
1)File类表示的是文件或目录的抽象路径名。可以分为绝对路径名和相对路径名。
2)了解文件的常规操作,新建。读写、删除等等。