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
...
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:\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);
}
}
}
}