IO之File类的应用


1.File类的基本介绍

在整个IO包中,唯一与文件本身有关的就是File类了,使用File类可以进行创建和删除文件等操作。要使用File类先要观察File类的构造方法,一般常用的构造方法如下
public File(String pathname)

所以如果要使用一个File类,必须向File类的构造方法中传递一个文件路径。
注意:如在java中文件分隔符用“\\”或者“/”表示。

2.File类的操作

File类中常见的方法如下:
public boolean createFile() throws IOException //创建新文件
public boolean delete() //删除文件
public boolean exists() //判断文件是否存在
public boolean isDirectory() //判断给定的路径是否是一个目录
public long length() //返回文件的大小
public String[] list() //返回指定目录的全部文件名称
public File[] listFile() //返回指定目录的全部文件
public boolean mkdir() //创建一个目录
public boolean renameTo(File dest) //为已有的文件重新命名


2.1创建一个新文件

File类的对象实例化了之后可以用createNewFile()创建一个新文件,此方法会抛出异常,所以使用的时候需要用try...catch进行异常的处理。例如现在要在D盘创建一个test.txt的文件,示例代码如下:
import java.io.File;

public class Test {
	public static void main(String[] args) {
		File file = new File("d:\\test.txt");
		try {
			file.createNewFile();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

运行程序之后,发现D盘下已经创建好了test.txt文件,需要注意的是,不同系统中的路径分隔符是不一样的
windows系统的分隔符是“\”,而Linux中使用正斜杠表示目录的分隔符“/”。Java本身也提供了分隔符常量,会根据不同的系统得到对应的分隔符,所以上面的程序修改之后应该是这样的:
import java.io.File;

public class Test {
	public static void main(String[] args) {
		File file = new File("d:" + File.separator + "test.txt");
		try {
			file.createNewFile();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

2.2删除一个指定的文件

File类中也支持删除文件的操作,如果要删除一个文件,则可以使用File类中的delete()方法。为了确保程序的严谨性,在删除文件之前应该用exists()方法判断文件是否存在,如果存在再进行删除操作:
import java.io.File;

public class Test {
	public static void main(String[] args) {
		File file = new File("d:" + File.separator + "test.txt");
		if (file.exists()) {
			file.delete();
		}
	}
}

2.3创建一个文件夹

File类除了可以创建文件以外,还可以创建文件夹,直接使用mkdir()的方法就可以完成,比如现在在D盘创建一个叫study的文件夹示例代码如下:
import java.io.File;

public class Test {
	public static void main(String[] args) {
		File file = new File("d:" + File.separator + "study");
		file.mkdir();
	}
}

这里需要注意的是mkdir()是创建目录的方法,就算文件名为test.txt也不会创建文件,而是一个名字叫“test.txt”的文件夹。

2.4列出指定目录的全部文件

如果现在给出一个目录,想要列出目录中的全部内容,可以使用list()方法或者listFile()方法。
如果使用list()方法得到D盘下所有文件,示例代码如下:
import java.io.File;

public class Test {
	public static void main(String[] args) {
		File file = new File("d:" + File.separator);
		String[] fileNames = file.list();
		for (String name : fileNames) {
			System.out.println(name);
		}
	}
}

程序运行结果为一系列的文件或文件夹名称例如:
apache-tomcat-7.0.42
MySqlData
mysql
apache-maven-3.1.0
dreamweaver cs5
myeclipse
...
上面的结果只是文件名,并不是文件的完整路径,如果想列出每一个文件的完整路径,就必须使用另一个方法——listFiles()
import java.io.File;

public class Test {
	public static void main(String[] args) {
		File file = new File("e:" + File.separator);
		File[] files = file.listFiles();
		for (File f : files) {
			System.out.println(f);
		}
	}
}

运行结果为:
d:\apache-tomcat-7.0.42
d:\MySqlData
d:\mysql
d:\apache-maven-3.1.0
d:\dreamweaver cs5
d:\myeclipse
...
以上直接打印的是File类的对象,可以把一个完整的路径取出,两者比较之后可以发现,使用listFiles()方法列出目录中的内容更加方便。

2.5判断文件是否是一个目录

判断一个文件是否是一个目录可以根据isDirectory()方法来实现。
import java.io.File;

public class Test {
	public static void main(String[] args) {
		File file = new File("e:" + File.separator + "study");
		if (file.isDirectory()) {
			System.out.println("该文件是一个目录");
		}
	}
}


3.两个问题及解答

3.1列出指定目录的全部内容

给定一个目录,要求列出此目录下的全部内容,因为目录内可能存在子文件夹,此时要求也把子文件夹内的所有子文件也列出来。
首先要判断给定的路径是否是目录,然后使用listFiles()列出一个目录中的全部内容,一个文件夹可能包含其他文件或者子文件夹,子文件夹中可能还包含子文件夹,所以需要采用递归。
import java.io.File;

public class Test {
	public static void main(String[] args) {
		File f = new File("d:\\study");
		getFile(f);
	}

	public static void getFile(File file) {
		File[] files = file.listFiles();
		for (File f : files) {
			if (f.isDirectory()) {
				System.out.println(f);
				getFile(f);
			} else {
				System.out.println(f);
			}
		}
	}
}

3.2将一个文件夹连同其所有内容复制到另一个文件夹

将一个文件夹内的所有文件复制到另一个文件夹内,结构不能发生变化,也就是说子文件和子文件夹的存放位置不能变化,这个问题需要用到io流,而且还是需要用到递归
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {

	/**
	 * 源文件夹
	 */
	static String url1 = "d:/source";

	/**
	 * 目标文件夹
	 */
	static String url2 = "d:/destination";

	public static void main(String[] args) throws IOException {
		File file1 = new File(url1);
		File file2 = new File(url2);
		// 创建目标文件夹
		file2.mkdirs();
		// 获取源文件夹当前下的文件或目录
		File[] file = file1.listFiles();
		for (int i = 0; i < file.length; i++) {
			if (!file[i].isDirectory()) {
				// 复制文件
				copyFile(file[i],
						new File(url2 + File.separator + file[i].getName()));
			}
			if (file[i].isDirectory()) {
				// 复制目录
				String sorceDir = url1 + File.separator + file[i].getName();
				String targetDir = url2 + File.separator + file[i].getName();
				copyDirectiory(sorceDir, targetDir);
			}
		}

	}

	public static void copyFile(File sourcefile, File targetFile)
			throws IOException {
		// 新建文件输入流并对它进行缓冲
		FileInputStream input = new FileInputStream(sourcefile);
		BufferedInputStream inbuff = new BufferedInputStream(input);

		// 新建文件输出流并对它进行缓冲
		FileOutputStream out = new FileOutputStream(targetFile);
		BufferedOutputStream outbuff = new BufferedOutputStream(out);
		// 缓冲数组
		byte[] b = new byte[1024 * 4];
		int len = 0;
		while ((len = inbuff.read(b)) != -1) {
			outbuff.write(b, 0, len);
			outbuff.flush();
		}
		// 关闭流
		inbuff.close();
		outbuff.close();
		out.close();
		input.close();

	}

	public static void copyDirectiory(String sourceDir, String targetDir)
			throws IOException {
		// 新建目标目录
		File target = new File(targetDir);
		File source = new File(sourceDir);
		target.mkdirs();

		// 获取源文件夹当下的文件或目录
		File[] file = source.listFiles();
		for (int i = 0; i < file.length; i++) {
			if (!file[i].isDirectory()) {
				// 源文件
				File sourceFile = file[i];
				// 目标文件
				File targetFile = new File(target.getAbsolutePath()
						+ File.separator + file[i].getName());
				copyFile(sourceFile, targetFile);
			}
			if (file[i].isDirectory()) {
				// 准备复制的源文件夹
				String dir1 = sourceDir + file[i].getName();
				// 准备复制的目标文件夹
				String dir2 = targetDir + "/" + file[i].getName();
				copyDirectiory(dir1, dir2);
			}
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值