关于File文件的一些事



1File类与文件操作就输入/输出的英文单词是Input/Output, 因此,输入/输出操作通常简称为I/O操作。Java的I/o类和接口主要包含在java.io包中(从JDK 1.4起引入了与缓冲区、通道有关的新I/O类库,它们位于Java.io包中) 。java.io包提供了通过数据流、序列化与反序列化和文件系统实现输人、输出的功能,如果程序中需要导人其中的类、接口,需要附加"import java.io.Xxx!"或"import java.io.*;”语句(Xxx是类或接口名)
由于受各种因素的影响 (如:访问的文件不存在),I/O操作有可能不成功,通常,需要用try...catch 结构来捕获lOException 异常,这一点务必注意。
9.1.1File类
计算机的操作系统是用路径名来标识文件和目录的,如果在编写管理文件程序时也采用这种方式,操作起来并不方便,且路径名依赖于操作系统。为此,Java 专门提供了File类来实现这一目标
“文件”的英文名称是file,将首字母大写变成File,就是java,io包中的一个类,它是Object的直接子类,其功能是以抽象方式表示文件和目录。通过构造File类的对象,可以标识计算机的文件和目录,以Windows 系统中的文件“d:\mydir\readme.txt”为例。"File file1=new File("d:\mydir\readme.txt”);”语句执行后,生成的file1不仅可以表示"readme.txt"文件,而且由于它是一个对象,还可以调用多个方法,来获取相关信息、实现文件管理功能,这是路径名所不具备的。
注意:不同的操作系统文件和目录的格式存在差异。在Windows 系统中有有盘符的概念,根目录和分属符用反斜杠“\”表示,例如: d:\mydir表示的是D盘的一级目录mydir; 而UNIX/Linux系统无盘符概念,最顶端的根目录( /)和分隔符都是用正斜杠“/”表示,例如,myjava/Hello.java 表示的是根目录之下的myjava 目录中的Hello.java 文件。
File 类的这种抽象表示是不依赖于操作系统的,可以利用File 类的静态常量separator或separatorChar来获取系统的分隔符( 为什么此处的常量不是大写字母呢? 原因是有的操作统可能将大写字母变成小写,如果设置为小写可以保证在所有系统中都一样)。不要认为File类对象所代表的文件、目录一定存在。事实上, File类对象也可以表示不存在的文件或目录因为它只用于文件管理,不涉及文件内容。
1. 构造方法的格式
构造方法有三种格式:
(1) File (String pathname): 参数是文件或目录的路径名,数据类型为String。
例如: File file1 = new File ("d: \mydir\ readme.txt"); 
和File dir1= new File("d.mydir") ;
问题:对象file1, dir1表示的内容有什么不同?
答案:
 file1 表示的是文件dir1表示的是目录,由此可知,文件与目录的表示并没有太大差别。
“\”特殊字符表示的是转义字符,若要表示字符“\”本身,需用“\\” 来实现。事实上,不使用 “\\” ,改为“/ ” 也是可以的,可以上机进行验证。
(2)File(Stringparent, Stringchild):第一个参数是父目录,第二个参数为子路径名,两者均为String类型。
例如:File file2= new File( “d:\mydir”, “readme.txt”);表示的对象与(1)种的File1相同。
 
(3) File( File parent, String child): 与(2)类似,只是第一个参教为File类型。
例如:File File3=new File( dir1,” readme.txt”); 表示的对象与(1)中的file1, (2)中的file2一致。

File类的对象通常用作文件管理、输入输出流类的参数,上述三种格式选用哪一种都可以,关键是要正确标识文件与目录。
2.常用方法
File 类的方法有几十个,没有必要死记硬背,只要掌握文件或目作的几个常用方法,了解主要属性的获取、测试,设置功能即可,其他的在使用时查阅API 文档。为方便大家理解,我们将这此方法分为几种类型
(1) 获取文件或目录某一属性的值
String getName(): 获取名字
String getParent(): 获取父目录
String getPath(): 获得路径名
String getAbsolutePath(): 获取绝对路径
(2) 测试文件或目录是否具备某一属性
boolean exists(): 是否存在
boolean isDiretory():是否为目录
boolean isFile( ): 是否为文件
boolean canRead( ): 是否能读
boolean canWrite ): 是否能写
boolean canExecute( );是否可运行
boolean isHidden ): 是否隐含
(3) 设置文件或目录某一属性。
boolean setExcutable (boolean executable): 设置可运行性
boolean setReadable (boolean readable): 设置可读性
boolean setReadOnly( ): 设置为只读
boolean set Writable(boolean writable(): 设置 可写性
boolean setLastModified (long time) : 设置最新修改时间
(4) 文件或目录操作。
long length( ): 获取文件长度(单位: byte)
long lastModified (): 获取文件/目录最新修改时间
String[] list(): 以字符串数组方式,返回目录中的所有文件或目录
File[] listFiles( ): 以File 数组方式,返回目录中的所有文件或目录
boolean createNewFile( ):创建新文件是否成功(所建文件内容为空)
boolean mkdir( ): 创建目录是否成功
boolean mkdirs(): 创建目录是否成功,与前一方法不同的是: 如果上层目录不存在,则先创建这些目录,再创建最后一级目
boolean renameTo( File dest ): 文件或目录改名是否成功
boolean delete( ): 文件或目录删除是否成功(只有空目录才能被删除)
这里,先通过两个简单的例子来熟悉上述方法的使用,在9.1.2小节再介绍一些综合
例1:显示文件的相关信息
import java.io.File;
import java.io.IOException;
public class FileDemo {
 public static void main(String[] args) {
   File myfile= new File("d:\test.txt");//文件分隔符用“/”或“\”表示
   if(myfile.exists()){
     System.out.println("文件名:"+myfile.getName());
     System.out.println("绝对路径:"+myfile.getAbsolutePath());
     System.out.println("父目录:"+myfile.getParent());
     System.out.println("文件长度:"+myfile.length());
   }else{
     System.out.println("对不起,找不到指定的文件");
     try {
       myfile.createNewFile();//创建一个新的文件
       System.out.println("已经创建一个新的文件!");
     } catch (IOException e) {
       System.out.println("出错信息:"+e);
     }
   }
 }
}
程序第一次运行结果:
对不起,指定的文件未找到。
已创建个新文件!
程序第二次运行结果:
文件名: test.txt
绝对路径: d:\test.txt
父目录: d:\
文件长度: 0 字节
说明:  开始时D盘根目录下无test.txt 文件。所以,程序第一次运行时,显示文件找不到信息,并创建一个新文件。第二次运行时,输出了新建文件的信息。不过,该文件没有内容,长度为0.
例2:显示当前目录下的文件,目录信息,代码如下:
public class DirDemo {
 public static void main(String[] args) {
   //当前目录由System类方法获得
   File dir=new File(System.getProperty("user.dir"));
   System.out.println("当前目录:"+dir.getAbsolutePath());
   File mylist[]=dir.listFiles();//返回指定目录的所有文件和目录
   for(int i=0;i<mylist.length;i++){
     if(mylist[i].isDirectory()){
       System.out.println("\t子目录:"+mylist[i].getName());
     }else{
       System.out.println("\t文件名:"+mylist[i].getName()+",大小:"+mylist[i].length()+"字节");
     }
   }
 }
}
程序运行结果(与当前日录有关):
当前日录: E: \Java 教材\cms\code_9
子日录: code
文件名: DirTree.class, 大小: 1205字节
文件名: DirTree.java, 大小: 549字节
文件名: FileDemo.class, 大小: 1448字节
文件名: FileDemo.java, 大小: 715字节
......
说明: 这里是通过调用System类的静态方法etProperty ("user. Dir”) 来获取当前目录的,当然用 “.” 表示也行,只是当前目录的输出结果会为: E: \Java 教材\cms\code_9\. , 最后带一个带个点号不够美观而已。
9.1.2文件操作
 使用计算机时,我们经常会进行文件或目录操作,例如: 单击右键,在看文件或目录属性;新建文件或目录;或目录政名;删除文件或目录等。File 类提供了相应的方法,可以实现类似的功能。限于篇幅,我们仅举两个例子做示范:  一个是获取文件或目录所占用的磁盘空间;另一个是删除文件或目录。
例9.3  获取指定文件或目录所占用的磁盘空间大小。
import java.io.File;
public class FileSpace {
 public static void main(String[] args) {
   System.out.println(" 占用的磁盘空间为:"+getTotal("c://angular//abc.txt")+"字节" );
 }
public static long getTotal(String pathname) {
   long total=0;
   File file= new File(pathname);
   if(file.isFile()){//如为文件,返回其大小
     return file.length();
   }else{//若是目录,用循环方式累计子目录和文件占用空间
     String[] childFilePathName=file.list();
     
     for (int i = 0; i < childFilePathName.length; i++) {
       //用递归方法得到文件成子日录所占空间
       total+=getTotal(pathname+"/"+childFilePathName[i]);
     }
   }
   return total;
 }
}
程序运行结果(与指定文件或目录有关)
占用的磁盘空间为:12863字节

File 类的delete()方法可删除文件和空目录,如果目录不为空,即目录中还包含子目录或文件,则需要用递归方法先删除该目录下的所有子目录和文件,再删除指定的目录,具体如例9.4所示。
例9.4  删除指定文件或目录。
import java.io.File;
public class DeleteFile {
 public static void main(String[] args) {
   DeleteFile df = new DeleteFile();
   if (df.del("c://angular//1")) {
     System.out.println("删除成功!");
   } else {
     System.out.println("删除失败!");
   }
 }
 public boolean del(String pathName) {
   boolean result = false;
   File file = new File(pathName);
   if (file.isFile()) {// 如果file是文件直接删除
     result = file.delete();
   } else if (file.isDirectory()) {// 若file是目录,先删除该目录下的所有子目录和文件
     System.out.println("asdasd");
     File[] list = file.listFiles();
     for (int i = 0; i < list.length; i++)
       // 递归删除当前目录下的所有子目录和文件
       del(list[i].getAbsolutePath());
     result = file.delete();// 最后删除当前目录
   }
   return result;
 }
}
程序运行结果:
不管是文件还是目录 只要存在都可以删除成功!!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值