前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >File 类与文件操作

File 类与文件操作

作者头像
Java学习
发布2018-04-17 16:32:17
7080
发布2018-04-17 16:32:17
举报
文章被收录于专栏:java学习
1

File类与文件操作就

输入/输出的英文单词是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:显示文件的相关信息

代码语言:javascript
复制
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:显示当前目录下的文件,目录信息,代码如下:

代码语言:javascript
复制
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 获取指定文件或目录所占用的磁盘空间大小。

代码语言:javascript
复制
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 删除指定文件或目录。

代码语言:javascript
复制
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;
  }
}

程序运行结果:

不管是文件还是目录 只要存在都可以删除成功!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档