在这里插入图片描述

一、学习内容

使用File类进行文件的操作,使用Java.io包完成一共有5个核心类和一个接口

  • 五个核心接口:File、InputStream、OutputStream、Reader、Writer
  • 一个标识接口:Serializable

一、创建文件
二、创建带有子目录的文件
三、取得文件内容
四、总结

二、具体内容

2.1 创建文件

在整个java.io包里面,File类是唯一 一个与文件本身操作有关的类,但是不涉及文件的具体内容,文件本身指的是文件的创建和删除。

要使用File类,那么首先就需要通过他提供的方法定义要操作的文件路径。

构造或方法释义
public File(String pathname)设置完整路径
public File(File parent,String child)(安卓)设置父路径与子文件路径
public boolean createNewFile() throws IOException创建文件,如果目录不能访问,如果文件重名,或者是文件名称错误
public boolean delete()删除文件
public boolean exists()判断存在

范例:示例代码

  public class Test2 {
    	public static void main(String args[]) throws Exception{
    		File file = new File("E:\\sublimefile\\test.txt"); // 设置文件路径
    		If (file.exists()) { // 文件存在
    			file.delete();
    		} else {
    			System.out.println(file.createNewFile());
    		}
    	}
    }

以上的程序已经可以完成具体文件的创建,此时存在两个问题。

  • 在window系统里面支持的是:“\”路径分隔符,Linux使用的是“/”路径分隔符;
    |--------在File类提供了一个常量:public static final String separator

但是这样代码 看起来有点 长

File file = new File("E:" + File.separator +  "sublimefile" + File.separator + "test.txt"); // 设置文件路径
  • 在进行java.io操作的过程之中,会出现延迟的问题,因为现在的问题是java程序是通过JVM间接地通过文件系统的文件处理函数,进行文件操作,所以中间会出现延迟情况。

2.2 创建带有子目录的文件

以上已经实现了文件的创建工作,但是这个时候是直接创建在了根路径下,下面来创建包含有子目录的文件

File file = new File("E:" + File.separator +  "sublimefile" + File.separator + "demo" + File.separator + "test.txt"); // 设置文件路径
  • 由于“demo”目录不存在,所以系统会认为此时的路径是不能够使用的,现在要判断父路径是否存在。
方法释义
public File getParentFile()找到父路径
public boolean mkdirs()创建多级目录(父路径)

代码示例:

  public class Test2 {
    	public static void main(String args[]) throws Exception{
    		File file = new File("E:" + File.separator +  "sublimefile" + File.separator 
    				+ "hello" +File.separator + "demo" + File.separator + "test.txt"); // 设置文件路径
    		System.out.println(file.getParentFile().exists());
    		If (! file.getParentFile().exists()) { // 父路径不存在
    			file.getParentFile().mkdirs(); // 创建父路径
    		}
    		If (file.exists()) { // 文件存在
    			file.delete();
    		} else {
    			System.out.println(file.createNewFile());
    		}
    	}
    }

2.3 取得文件内容

在File类里面提供了一系列取得文件信息内容的操作功能:

方法释义
public long length()取得文件大小
public boolean isFile()判断是否是文件
public boolean isDirectory()判断是否是目录
public long lastModified()最近一次修改日期

代码示例:

    import java.io.File;
    import java.math.BigDecimal;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Test2 {
    	public static void main(String args[]) throws Exception {
    		File file = new File("E:" + File.separator + "jpg.jpeg");
    		if (file.exists()) {
    			System.out.println("是否是文件:" + (file.isFile()));
    			System.out.println("是否是目录:" + (file.isDirectory()));
    			System.out.println("文件大小:" + new BigDecimal((double) file.length() / 1024 / 1024).divide(new BigDecimal(1),
    					2, BigDecimal.ROUND_HALF_UP) + "M");
    			System.out.println("上次修改时间" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
    		}
    	}
    }

在这里插入图片描述
整个取得过程里面取的文件相关信息,但是不包含有文件的内容。

  • 但是整个磁盘上除了文件之外,还会包含有使用的目录,那么对于目录最常用的功能就是列出目录组成,在File类中定义有如下的两个列出目录的方法:
方法释义
public String[] list()列出目录下的信息
public String[] list(FilenameFilter filter)列出所有信息以File类包装

代码示例:

     public class Test2 {
    	public static void main(String args[]) throws Exception {
    		File file = new File("E:" + File.separator);
    		if (file.isDirectory()) { // 现在给出的一个路径
    			String[] result = file.list();
    			for (int x = 0; x < result.length; x++) {
    				System.out.println(result[x]);
    			}
    		}
    	}
    }

在这里插入图片描述

  • 此时虽然可以列出目录了,但是所列出来的是目录下的子目录或文件名字 列出File类的对象

代码示例:

    public class Test2 {
    	public static void main(String args[]) throws Exception {
    		File file = new File("E:" + File.separator);
    		if (file.isDirectory()) { // 现在给出的一个路径
    			File[] result = file.listFiles();
    			for (int x = 0; x < result.length; x++) {
    				System.out.println(result[x]);
    			}
    		}
    	}
    }

下面看运行结果: 就不一样了
在这里插入图片描述
为了很好地体验出以上的操作的好处,下面输出一个类似于资源管器的界面。

示例代码(类似于资源管理器):

    public class Test2 {
    	public static void main(String args[]) throws Exception {
    		File file = new File("E:" + File.separator);
    		if (file.isDirectory()) { // 现在给出的一个路径
    			File[] result = file.listFiles();
    			for (int x = 0; x < result.length; x++) {
    				System.out.println(result[x].getName() + "\t\t\t" 
    			+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    			.format(new Date(result[x].lastModified())) + "\t\t" 
    			+ (result[x].isDirectory() ? "文件夹":"文件") 
    			+ new BigDecimal((double) result[x].length() / 1024 / 1024).divide(new BigDecimal(1),
    					2, BigDecimal.ROUND_HALF_UP) + "M");
    			}
    		}
    	}
    }

在这里插入图片描述
通过系列验证可以发现,取得对象列表会更加的方便,因为可以继续对列表进行操作。

思考题:列出指定目录下的所有子目录

原则:如果现在给定的依然是一个目录,则应该列出里面所有的组成,应该使用递归的方式完成。

代码示例(列出指定目录下的所有子目录):

   public class Test2 {
    	public static void main(String args[]) throws Exception {
    		File file = new File("E:" + File.separator );
    		print(file);
    	}
    	public static void print(File file) {
    		if (file.isDirectory()) {  // 如果现在给定的是一个路径
    			File[] result = file.listFiles(); // 列出子目录
    			if (result != null) {
    				for (int x = 0; x < result.length; x++) {
    					print(result[x]);
    				}
    			}
    		}
    		System.out.println(file);
    	}
    }

如果将以上输出操作换为删除操作,将会变为恶性程序。

三、总结

  1. File类本身只是操作文件的,不涉及到内容;
  2. File中的重要方法:
  • List item设置完整路径:public File(String pathname);
  • 删除文件:public boolean delete();
  • 判断文件是否存在:public boolean exists()
  • 找到父路径:public File getParentFile();
  • 创建目录:public boolean mkdir();
  1. 在使用File类操作的时候路径的分隔符使用:File.separator;
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐