IO之File类的应用

来源:互联网 发布:美版lol mac 编辑:程序博客网 时间:2024/05/16 00:25


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
原创粉丝点击