File文件的读取和写入

File类

1. 概述

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

2.构造方法

public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。(可以写入文件是指定在哪个文件夹里创建文件,使用于Foreach循环中复制一个文件夹里的文件到另一个文件夹里)

public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

public class FileDemo {
	
	@Test
	public void test() {
		//创建一个File实例,构造器是传入一个路径名
		// windows:盘符  \  unix/linux:   /
		File file = new File("D:\\JAVASE\\day1\\code");
		System.out.println("file实例:" + file);
	}
	
	@Test
	public void test2() {
		//public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例
		String parent = "D:\\JAVASE";
		String child = "day1";
		String child2 = "day2";
		String child3 = "day3";
		
		//构建路径实例
		File file = new File(parent,child);
		File file2 = new File(parent,child2);
		File file3 = new File(parent,child3);
		System.out.println("file实例:" + file);
		System.out.println("file2实例:" + file2);
		System.out.println("file3实例:" + file3);
	}
	
	@Test
	public void test3() {
		//public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例
		File parent = new File("D:\\JAVASE\\");
		File parent2 = new File("D:\\JAVASE2\\");
		String child = "day1";
		
		File file = new File(parent,child);
		File file2 = new File(parent2,child);
		System.out.println("file实例:" + file);
		System.out.println("file2实例:" + file2);
	}
}
小贴士:

File对象是内存中的对象,代表硬盘中实际存在的一个文件或者目录。

无论该路径下是否存在文件或者目录,都不影响File对象的创建。(如果父路径不存在,则可以自动创建父路径)

3. 常用方法

获取功能的方法

  1. public String getAbsolutePath() :返回此File的绝对路径名字符串。

  2. public String getPath() :将此File转换为路径名字符串。

  3. public String getName() :返回由此File表示的文件或目录的名称

  4. public long length() :返回由此File表示的文件的长度。

使用示例:(绝对路径和相对路径的区别如下)

绝对路径:从盘符开始的路径,这是一个完整的路径。

相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。

注意:相对路径是相对于该 .java文件的所在位置而言,若文件和 .java在同级目录下,则is.exists()返回ture,不在同级目录下放回false,在eclipse中使用相对路径会把文件创建在该工程目录下
@Test
	public void test4() {
		File file = new File("D:\\JAVASE\\day1\\code");
		System.out.println("绝对路径名:" + file.getAbsolutePath());
		System.out.println("路径字符串:" + file.getPath());
		System.out.println("长度(文件大小):" + file.length());
		System.out.println("文件夹名称:" + file.getName());
		
		File file2 = new File("FileDemo.java");//相对路径 
		// C:\Users\Administrator\eclipse-workspace\day729(IO流)\FileDemo.java
		System.out.println("相对路径:" + file2.getAbsolutePath());
	}

判断功能的方法

  1. public boolean exists() :此File表示的文件或目录是否实际存在。

  2. public boolean isDirectory() :此File表示的是否为目录。

  3. public boolean isFile() :此File表示的是否为文件。

@Test
	public void test() {
		File file = new File("D:\\JAVASE\\day1\\code");
		System.out.println("file路径是否存在:" + (file.exists() == true ? "存在":"不存在"));
		System.out.println("file是目录吗:" + (file.isDirectory() == true ? "是":"不是"));
		System.out.println("file是文件吗:" + (file.isFile() == true ? "是":"不是"));
	}

创建删除功能的方法

  1. public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。

  2. public boolean delete() :删除由此File表示的文件或目录。(注意:删除文件夹该文件夹必须为空----先删文件夹里的文件,再删空文件夹)

  3. public boolean mkdir() :创建由此File表示的目录。

  4. public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。(父目录不存在)

@Test
	public void test2() throws IOException {
		//创建file实例
		File file = new File("D:\\JAVASE\\day1\\code\\a.txt");
		
		//创建一个新文件 
		file.createNewFile();
		
		//创建临时文件 
		File file2 = new File("D:\\JAVASE\\day1\\code");
		// 第一个参数是前缀,第二个是后缀,第三个是要在哪个路径下创建
		File.createTempFile(System.currentTimeMillis()+"", ".exe",file2);
		// java教程.api <-- 改名字
		
		//删除a.txt
		file.delete();//这是个文件 ,可以直接删除
		
		//删除文件夹 这个文件必须是空的才能删除
		File file3 = new File("D:\\JAVASE\\day1\\code2 - 副本");
		file3.delete();
		
		//创建新的文件夹
		File file4 = new File("D:\\JAVASE\\day1\\code3");
		//创建文件夹时,上级路径必须是存在
		file4.mkdir();
		
		File file5 = new File("D:\\JAVASE\\day1\\test\\code4");
		//boolean isCreateSuccess = file5.mkdir();
		
		//使用mkdirs:这时如果上级路径不存在,那么先创建上级路径 ,再创建目的文件夹
		boolean isCreateSuccess = file5.mkdirs();
		System.out.println("创建成功?" + isCreateSuccess);
	}

目录的遍历

  1. public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。

  2. public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

    用法如下:

@Test
	public void test3() {
		File file = new File("D:\\JAVASE\\day1\\code");
		//获取的是该文件夹下所有的字符串路径 
		String[] list = file.list();
		for (String name : list) {
			System.out.println(name);
		}	
		System.out.println("-----------------");
		//获取的是文件数组
		File[] listFiles = file.listFiles();
		for (File f : listFiles) {
			System.out.println(f);
		}
	}
小贴士:

调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。

练习例题:

package com.gec.work;

import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

import org.junit.Test;

public class Work1 {

	/*
	 * 【1】键盘录入一个文件夹路径,删除该路径下的文件夹。(录入的文件夹里面要有多个文件,不能包含有子文件夹)
	 * 提示:如果文件夹里面有文件,则需要先将文件删除才能删除文件夹
	 */
	@Test
	public void test() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入文件夹路径:");
		
		//接收路径 
		// next():不包含空格字符串,遇到空格就会结束 
//		String path = sc.next();
		//包含空格 
		String path = sc.nextLine();
		File file = new File(path);
		//删除文件 
		delFile(file);
	}

	private void delFile(File file) {
		//如果文件不存在,直接返回
		if(!file.exists()) {
			return;
		}
		
		if(file.isFile()) {
			file.delete();//是文件就删除
		}else {
			File[] fs = file.listFiles();
			for (File f : fs) {
				//自己调用自己
				delFile(f);
			}
			file.delete();//最终把当前的也删除掉
		}
	}
	
	//从键盘接收一个文件夹路径,获得该文件夹大小并输出到控制台
	//D:\JAVASE\day2
	@Test
	public void test2() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入文件夹路径:");
		
		//创建File实例
		File file = new File(sc.next());
		
		//接收文件大小数
		long size = getFile(file);
		System.out.println("文件大小:" + size);
	}

	private long getFile(File file) {
		//统计数
		if(!file.exists()) {
			return 0;
		}
		
		long length = 0;
		//获取文件夹下所有的文件和子文件等
		File[] fs = file.listFiles();
		for (File f : fs) {
			//先累加当前文件大小 
			length = length + f.length();
			//如果是文件夹
			if(f.isDirectory()) {
				long s = getFile(f);
				//666,666,541
				//666,637,869 
				length = length + s;
			}
		}
		return length;
	}
	
	@Test
	public void test3() {
		/*
		 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印(包括所有子文件夹的文件)
		 */
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入文件路径:");
		
		//创建File实例
		File file = new File(sc.next());
		//显示过滤后的文件信息
		showFile(file);
	}

	private void showFile(File file) {
		File[] fs = file.listFiles(new FileFilter() {
			
			@Override
			public boolean accept(File f) {
				//查找所有小于200k的文件
				return f.length() < 200*1024 && !f.isDirectory();
			}
		});
		
		//循环
		for (File f : fs) {
			System.out.println("文件名:" + f.getName() + ",大小:" + f.length());
		}
		
	}
	
	@Test
	public void test4() {
		//键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入文件路径:");
		
		//创建File实例
		File file = new File(sc.next());
		//显示过滤后的文件信息
		if(file.isDirectory()) {
			File[] fs = file.listFiles();
			for (File f : fs) {
				countType(f);
			}
		}else {
			countType(file);
		}
		
		Set<String> keySet = map.keySet();
		for (String key : keySet) {
			System.out.println("文件类型:" + key + ",个数:" + map.get(key));
		}
	}

	//统计用的集合
	static HashMap<String, Integer> map = new HashMap<>();
	private void countType(File file) {
		//判断
		if(file.isFile()) {
			//HelloWorld.java为例  用.分割后,得到[HelloWorld,java]
			String[] split = file.getName().split("\\.");
			if(map.containsKey(split[split.length-1])) {
				/*
				 * split[split.length-1]:{java=1}
				 * map.get:根据key获取map里面的值
				 *         split[split.length-1])+1
				 */
				map.put(split[split.length-1], map.get(split[split.length-1])+1);
			}else {
				//第一次或唯一的文件统计
				map.put(split[split.length-1],1);
			}
		}
	}
}

文件过滤器(筛选符合条件的文件)

筛选后缀名为mp4的文件

public void test() {
		// 路径实例
		File file = new File("D:\\JAVASE\\day6");
		// 获得过滤后的文件数组
		File[] fs = file.listFiles(new FilenameFilter() {//new FilenameFilter()是重点
			@Override
			public boolean accept(File dir, String name) {
				return name.endsWith(".mp4");
			}
		});

		// 循环
		for (File f2 : fs) {
			System.out.println("mp4:" + f2.getName());
		}

对于要重复筛选后缀名的文件,可以要重写一个类 ,作为文件名的过滤

//写一个类来继承FilenameFileter接口
class MyFileNameFilter implements FilenameFilter {
	//定义一个name来接受传入的后缀名
	private String name;
	//定义有参构造器来接受对象的初始赋值
	public MyFileNameFilter(String name) {
		this.name = name;
	}

	@Override
	public boolean accept(File dir, String name) {//可以选择,一个只传文件,一个可以传路径和定义的名字。本代码如此,也有其它可能
		return name.endsWith(this.name);//定义筛选条件
	}

}

public void test2() {
		// 路径实例
		File file = new File("\\JAVASE\\day6");
		// 获得过滤后的文件数组
		File[] fs = file.listFiles(new MyFileNameFilter(".mp4"));

		for (File file2 : fs) {
			System.out.println(file2.getName());
		}
		System.out.println("---------------------");

		// 路径实例
		File file2 = new File("D:\\JAVASE\\day7");
		// 获得过滤后的文件数组
		File[] fs2 = file2.listFiles(new MyFileNameFilter(".doc"));

		for (File f2 : fs2) {
			System.out.println(f2.getName());
		}
	}

你可能感兴趣的:(Java基础知识,java,开发语言)