经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
6.1(java学习笔记)File类
来源:cnblogs  作者:gcmh  时间:2018/10/25 9:36:37  对本文有异议

1.路径分隔符,文件分隔符。

路径分隔符(“;”)

文件名称分隔符(“\”windows,“/”Linux等)。

不同平台使用的文件分隔符是不一样的,所以File类中提供了分隔符常量,它会根据平台的不同自行选择对应的分隔符。

这样便于跨平台,假如我们写死的话,就具有一定的局限性。

 

路径分割符:File.PathSeparator

文件名称分割符:File.separator

 

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. System.out.println(File.pathSeparator);//路径分隔符
  5. System.out.println(File.separator);//文件名称分隔符
  6. }
  7. }
  1. 运行结果:
  2. ;
  3. \ //由于这是在windows平台上,所有打印出来的是“\”,如果是Linux上打印的就是“/”

 

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. System.out.println(File.pathSeparator);
  5. System.out.println(File.separator);
  6. String path1 = "E:\\test\\a.txt";//路径表示方法1,
  7. String path2 = "E:" + File.separator + "test" + File.separator +"a.txt";//路径表示方法2
  8. System.out.println(path1);
  9. System.out.println(path2);
  10. }
  11. }
  1. 运行结果:
  2. ;
  3. E:\test\a.txt
  4. E:\test\a.txt

上列代码中的路径表示方法1,方法2都可以用于表示路径,但是建议使用第二种,无论是从动态的更改路径,还是从跨平台角度考虑,第二组都要好一些。

 

2.File构造方法

创建一个文件实例用于对该文件进行操作。构造参数是被操作文件的路路径。

简单的说就是和需要进行操作的文件之间建立一个联系,而这个联系的关键就是文件的路径。

 

File(String parent, String child)

File(File parent, String child)

File(String pathname)

 

String getPath()

将抽象路径名转换为路径字符串

String getAbsolutePath()

将抽象路径名转换为绝对路径字符串

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. // System.out.println(File.pathSeparator); // ';'
  5. // System.out.println(File.separator); // '\'
  6. String parent = "E:" + File.separator;
  7. String childTestTxt = "test.txt";
  8. String childTestWord = "text.docx";
  9. File f1 = new File(parent,childTestTxt);//文件路径parent + chideTestTxt,绝对路径创建
  10. File f2 = new File(new File(parent),childTestWord);//文件路径parent+childTestDoc,绝对路径创建
  11. File f3 = new File(parent+"text.xls");//绝对路径创建
  12. System.out.println(f1.getPath());//获取路径地址
  13. System.out.println(f2.getPath());
  14. System.out.println(f3.getPath());
  15. }
  16. }
  1. 运行结果:
  2. E:\test.txt
  3. E:\text.docx
  4. E:\text.xls

 

就像上列代码中parent是E:\,后面添加的child都是相对于parent而言的,就是说child在parent后面。

建立路径简单的说就是parent+child。

 

我们来看下面这样一个例子

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. String parent = "ft";
  5. String child ="t.txt";
  6. File f1 = new File(parent,child);
  7. File f2 = new File(new File(parent),child);
  8. File f3 = new File("ft\\t.txt");
  9. System.out.println(f1.getPath());
  10. System.out.println(f1.getAbsolutePath());
  11. System.out.println(f2.getPath());
  12. System.out.println(f2.getAbsolutePath());
  13. System.out.println(f3.getPath());
  14. System.out.println(f3.getAbsolutePath());
  15. }
  16. }
  1. 运行结果:
  2. ft\t.txt //getPaht()
  3. E:\eclipse\IO\ft\t.txt //getAbsolutePaht()
  4. ft\t.txt
  5. E:\eclipse\IO\ft\t.txt
  6. ft\t.txt
  7. E:\eclipse\IO\ft\t.txt

没有加盘符创建的就是相对路径,这个相对路径是相对于我们目前这个工程保存的位置而言的。

我这里的工程是E:\eclipse\IO\,相对路径前面会自动加上当前工程地址(E:\eclipse\IO\),然后才是我们输入的的地址(ft\t.txt)。

相对地址,绝对地址的区别就是加不加盘符的区别。我们也可以发现使用getPath获取相对路径时获取的不是完整的绝对地址。

使用getPath()获取只会获取传递进去那部分路径的地址,传递进去的是绝对路径返回的就是绝对路径,传递进去的是相对地址就返回相对路径,

不会加上相对路径前面一部分的地址。而要获取绝对地址则需要用getAbsolutePath().

 

3.File常用方法

3.1String getName()  //获取文件名

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. String parent = "E:\\";
  5. String child ="t.txt";
  6. File f1 = new File(parent,child);
  7. File f3 = new File("ft\\t.txt");
  8. System.out.println(f1.getName());
  9. System.out.println(f3.getName());
  10. }
  11. }
  1. 运行结果:
  2. t.txt
  3. t.txt

 

3.2 String getParent()//返回上一级目录,相对返回null

  1. public class Test {
  2. public static void main(String[] args) {
  3. String parent = "E:\\";
  4. String child ="t.txt";
  5. File f1 = new File(parent,child);
  6. File f3 = new File("t.txt");
  7. System.out.println(f1.getAbsolutePath());
  8. System.out.println(f1.getParent());
  9. System.out.println(f3.getAbsolutePath());
  10. System.out.println(f3.getParent());
  11. }
  12. }
  1. 运行结果:
  2. E:\t.txt
  3. E:E:\eclipse\IO\t.txt
  4. null

 

3.2

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. String parent = "E:\\";
  5. String child ="t.txt";
  6. File f1 = new File(parent,child);
  7. // File f3 = new File("t.txt");
  8. System.out.println(f1.getAbsolutePath());
  9. System.out.println(f1.exists());//判断文件(t.txt)是否存在,存在返回true,反之false
  10. }
  11. }
  1. 运行结果:
    E:\t.txt
  2. false

 

3.3

boolean canRead()
boolean canWrite()

判断文件,文件夹是否可读、可写。

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. String parent = "E:\\";
  5. String child ="t.txt";
  6. File f1 = new File(parent,child);
  7. File f3 = new File("E:\\");
  8. System.out.println(f1.getAbsolutePath());
  9. System.out.println("文件是否存在:"+f1.exists());
  10. System.out.println("文件是否可写:"+f1.canWrite());
  11. System.out.println(f3.getAbsolutePath());
  12. System.out.println("文件是否存在:"+f3.exists());
  13. System.out.println("文件是否可写:"+f3.canWrite());
  14. }
  15. }
  1. 运行结果:
  2. E:\t.txt
  3. 文件是否存在:false
  4. 文件是否可写:false
  5. E:文件是否存在:true
  6. 文件是否可写:true

上列代码中t.txt文件并不存在只是构建了路径,但文件本身不存在,文件不存在的话自然不可读。

如果文件存在,也要考虑其是否可读、可写。因为可能有些文件进行了读写权限的设置。

 

3.4

boolean isFile()//判断是否是文件,是文件返回true反之返回false。若文件不存在返回false。
boolean isDirectory()//判断是否是文件夹,是文件夹返回true反之返回false。若文件夹不存在返回false。

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. String parent = "E:\\";
  5. String child ="t";
  6. File f1 = new File(parent,child);
  7. File f2 = new File(parent,"t.txt");
  8. File f3 = new File("E:\\ssm\\pom.xml");
  9. System.out.println(f1.getAbsolutePath());
  10. System.out.println("文件是否存在:"+f1.exists());
  11. System.out.println("是不是文件?"+f1.isFile());
  12. System.out.println("是不是文件夹?"+f1.isDirectory());
  13. System.out.println(f2.getAbsolutePath());
  14. System.out.println("文件是否存在:"+f2.exists());
  15. System.out.println("是不是文件?"+f2.isFile());
  16. System.out.println("是不是文件夹?"+f2.isDirectory());
  17. System.out.println(f3.getAbsolutePath());
  18. System.out.println("文件是否存在:"+f3.exists());
  19. System.out.println("是不是文件?"+f3.isFile());
  20. System.out.println("是不是文件夹?"+f1.isDirectory());
  21. }
  22. }
  1. E:\t //创建的一个文件夹实例,但实际的路径是不存在的
  2. 文件是否存在:false
  3. 是不是文件?false
  4. 是不是文件夹?false
  5. E:\t.txt //创建一个文件实例,但实际的路径是不存在的
  6. 文件是否存在:false
  7. 是不是文件?false
  8. 是不是文件夹?false
  9. E:\ssm\pom.xml //创建一个文件实例,该路径存在。
  10. 文件是否存在:true
  11. 是不是文件?true
  12. 是不是文件夹?false

上列代码E:\t,E:\t.txt都不存在,E:\ssm\pom.xml存在,

可以看出如果构造的文件就不会被作为文件,同样构造的文件夹不存在也不会作为文件夹。

 

3.5

boolean isAbsolute();//判断是否为绝对路径

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. String parent = "E:\\";
  5. String child ="t";
  6. File f1 = new File(parent,child);
  7. File f2 = new File("t.txt");
  8. System.out.println(f1.getPath());
  9. System.out.println(f1.isAbsolute());
  10. System.out.println(f2.getPath());
  11. System.out.println(f2.isAbsolute());
  12. }
  13. }
  1. 运行结果:
  2. E:\t
  3. true
  4. t.txt
  5. false

 

3.6

long length()//返回文件的字节数

  1. import java.io.File;
  2. public class Test {
  3. public static void main(String[] args) {
  4. String parent = "E:\\";
  5. String child ="ssm";
  6. File f1 = new File(parent,child);
  7. File f2 = new File("E:\\ssm\\pom.xml");
  8. System.out.println(f1.getPath());
  9. System.out.println(f1.length());
  10. System.out.println(f2.getPath());
  11. System.out.println(f2.length());
  12. }
  13. }
  1. 运行结果:
  2. E:\ssm
  3. 4096
  4. E:\ssm\pom.xml
  5. 4644

  

 

可以看到文件的字节数正常读取了,而文件夹读取的确是有问题的,这是因为length只能读取文件,读取文件夹的数值并不准确。

如果文件夹不存在或为空文件夹可能读取的字节数是0,这个可以自行实验。

 

3.7

boolean createNewFile()/如果文件不存在且创建成功返回true,文件已存在返回false

  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Test {
  4. public static void main(String[] args) {
  5. String parent = "E:\\";
  6. String child ="t.txt";
  7. File f1 = new File(parent,child); //该文件不存在
  8. File f2 = new File("E:\\ssm\\pom.xml");//该文件已存在
  9. try {
  10. System.out.println(f1.createNewFile());
  11. System.out.println(f2.createNewFile());
  12. } catch (IOException e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }
  16. }
  17. }
  1. 运行结果;
  2. true
  3. false

可以看到E盘多了一个我们指定创建的文件。

 

3.8

boolean delete()//删除文件或文件夹,

  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Test {
  4. public static void main(String[] args) {
  5. String parent = "E:\\";
  6. String child ="t.txt";
  7. File f1 = new File(parent,child);
  8. File f2 = new File("E:\\ssm\\pom.xml");
  9. f1.delete();
  10. }
  11. }
  1. 运行结果:
  2. true

这样就将我们之前创建的t.txt删除了。

 

3.9

public static File createTempFile(String prefix, String suffix, File directory)

//prefix前缀,suffix后缀,directory创建文件所在文件夹.suffix可以为null,此时将使用.tmp。

如果需要文件自动删除,需配合deleteOnExit()方法。该方法为静态方法,可通过类名调用,

调用完会返回一个File对象,对临时文件进行操作。

void deleteOnExit()//虚拟机终止时,删除该文件。

 

  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Test {
  4. public static void main(String[] args) {
  5. String parent = "E:\\";
  6. String child ="";
  7. File f1 = new File(parent,child);
  8. try {
  9. File temp = File.createTempFile("temp",".txt",f1);
  10. Thread.sleep(5000);
  11. temp.deleteOnExit();
  12. } catch (IOException e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. } catch (InterruptedException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. }
  20. }

程序运行后会在E盘下创建一个已temp开头,后缀为.txt的文件。

5s后程序自动删除。注意这里删除文件是在程序运行结束后才删除,

例如我们在temp.deleteOnExit();后面加上Thread.sleep(50000);

会发现过了五十秒后文件才会自动删除。

 

3.10

boolean mkdir()//创建文件夹,所有上一级目录必须存在
boolean mkdirs()//创建文件夹,如果上一级目录不存在,则自动创建

 

  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Test {
  4. public static void main(String[] args) {
  5. String parent = "E:\\";
  6. String child ="parent\\child";//E盘下parent文件夹不存在
  7. File f1 = new File(parent,child);//E:\parent目录下创建child文件夹
  8. System.out.println(f1.mkdir());
  9. System.out.println(f1.mkdirs());
  10. }
  11. }

  1. 运行结果:
    false
  2. true

使用mkdir创建文件夹时,最后一级目录之前的目录必须全部存在,否则就会创建失败。

而mkdirs创建时,如果有目录不存在就会直接创建。

 

3.11

String[] list()//返回一个字符串数组该抽象路径名所表示的目录中的文件和目录,
由这个抽象路径名表示的目录中的文件和目录的字符串数组。如果目录为空,则数组将为空。
如果此抽象路径名不表示目录,或发生I/O错误,则返回NULL。


File[] listFiles()
返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。

如果此抽象路径名不表示目录,则此方法返回null。否则返回一个文件对象数组,一个目录中的每个文件或目录。

  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Test {
  4. public static void main(String[] args) {
  5. String parent = "E:\\";
  6. String child ="java";
  7. File f1 = new File(parent,child);
  8. String[] fString = f1.list();
  9. File[] fFile = f1.listFiles();
  10. for(String temp:fString){
  11. System.out.println(temp);
  12. }
  13. System.out.println("------------------------------------");
  14. for(File temp:fFile){
  15. System.out.println(temp.getAbsolutePath());
  16. }
  17. }
  18. }
  1. bin
  2. COPYRIGHT
  3. db
  4. include
  5. javafx-src.zip
  6. jre
  7. lib
  8. LICENSE
  9. README.html
  10. release
  11. src.zip
  12. THIRDPARTYLICENSEREADME-JAVAFX.txt
  13. THIRDPARTYLICENSEREADME.txt
  14. ------------------------------------
  15. E:\java\bin
  16. E:\java\COPYRIGHT
  17. E:\java\db
  18. E:\java\include
  19. E:\java\javafx-src.zip
  20. E:\java\jre
  21. E:\java\lib
  22. E:\java\LICENSE
  23. E:\java\README.html
  24. E:\java\release
  25. E:\java\src.zip
  26. E:\java\THIRDPARTYLICENSEREADME-JAVAFX.txt
  27. E:\java\THIRDPARTYLICENSEREADME.txt

我们要首先要注意调用list和listFiles方法的抽象路径是文件夹,

其次list返回的是该文件夹下所有文件夹和文件的名称,是以字符数组的形式返回的。

而listFiles返回的是该文件夹下所有文件夹和文件的抽象路径对象,拥有这个对象我们可以对这些文件夹及文件进行操作。

 

利用listFiles我们就可以打印出指定文件夹下所有文件了。

  1. import java.io.File;
  2. import java.io.IOException;
  3. public class Test {
  4. public static void main(String[] args) {
  5. String parent = "E:\\";
  6. String child ="java";
  7. File f1 = new File(parent,child);
  8. String[] fString = f1.list();
  9. File[] fFile = f1.listFiles();//获取指定目录下所有文件及目录的抽象路径对象
  10. printAllFileName(fFile);
  11. }
  12. public static void printAllFileName(File[] fileArray){//打印所有文件名
  13. for(File temp:fileArray){
  14. if(temp.isDirectory()){//如果当前对象为文件夹,则继续获取该文件夹下所有对象。
  15. File[] fFile = temp.listFiles();
  16. printAllFileName(fFile);//递归
  17. }
  18. System.out.println(temp.getAbsolutePath());//输出所有对象的绝对地址
  19. }
  20. }
  21. }
  1. 运行结果://文件很多只截取了一部分。
    E:\java\lib\missioncontrol\features\org.eclipse.equinox.p2.rcp.feature_1.2.0.v20140523-0116\epl-v10.html
  2. .
  3. .
  4. .
  5. E:\java\THIRDPARTYLICENSEREADME-JAVAFX.txt
  6. E:\java\THIRDPARTYLICENSEREADME.txt

 

3.12

File[] listFiles(FileFilter filter)//返回一个抽象路径名数组,该数组中的元素必须满足文件过滤器的筛选条件。

 我们来看下过滤器是如何起作用的,我们先来看下listFiles(FileFilter filter)的源码

主要看if(filter == null || filater.accept(f))这一句,accept是FileFilter接口中的方法,

是用于指导筛选条件的,满足条件返回ture反之返回false。我们接着看后面

满足筛选条件就会返回true,则该文件对象会被加入到一个文件对象数组中,

最后会返回这个文件数组对。

可见指定accept方法中的条件才是关键。

我们接着来看下accept方法的定义。

传递进去的是一个文件的地址名,也可以理解为是一个文件对象,

在该方法中对pathname文件对象指定规则返回true,则该文件就通过了筛选,反之亦然。

我们接下里看一个实际的例子,例如我要输出某一个文件夹下所有后缀为.xml的文件。

  1. import java.io.File;
  2. import java.io.FileFilter;
  3. import java.io.IOException;
  4. public class Test {
  5. public static void main(String[] args) {
  6. String parent = "E:\\";
  7. String child ="java";
  8. File f1 = new File(parent,child);
  9. String[] fString = f1.list();
  10. File[] fFile = f1.listFiles(new FileFilter(){
  11. @Override
  12. public boolean accept(File pathname) {
  13. // TODO Auto-generated method stub
  14. return pathname.isDirectory() || pathname.getName().endsWith(".xml");
  15. }
  16. });
  17. printAllFileName(fFile);
  18. }
  19. public static void printAllFileName(File[] fileArray){
  20. if(fileArray == null)
  21. return;
  22. for(File temp:fileArray){
  23. if(temp.isDirectory()){
  24. File[] fFile = temp.listFiles(new FileFilter(){//由于fileFilter是接口,所以需要构造匿名内部类。
  25. @Override //这里也可以定义一个类实现FileFileter接口,然后new一个对象
  26. public boolean accept(File pathname) {
  27. // TODO Auto-generated method stub
  28. return pathname.isDirectory() || pathname.getName().endsWith(".xml");
  29. }//指定规则,当前文件是以.xml结尾或者是文件夹则通过筛选。虽然文件夹不用输出,但是后续需要通过文件夹去寻找下一级中是否有.xml文件。
  30. });
  31. printAllFileName(fFile);
  32. }
  33. if(!temp.isDirectory())//当前对象为文件夹则不输出。
  34. System.out.println(temp.getAbsolutePath());
  35. }
  36. }
  37. }
  1. 运行结果:

 

3.12

public static File[] listRoots()//返回所有根目录对象

  1. import java.io.File;
  2. import java.io.FileFilter;
  3. import java.io.IOException;
  4. public class Test {
  5. public static void main(String[] args) {
  6. String parent = "E:\\";
  7. String child ="java";
  8. File f1 = new File(parent,child);
  9. String[] fString = f1.list();
  10. File[] fFile = f1.listRoots();//获取根目录文件对象
  11. for(File temp:fFile){
  12. System.out.println(temp.getAbsolutePath());
  13. }
  14. // printAllFileName(fFile);
  15. }
  16. public static void printAllFileName(File[] fileArray){
  17. if(fileArray == null)
  18. return;
  19. for(File temp:fileArray){
  20. if(temp.isDirectory()){
  21. File[] fFile = temp.listFiles(new OutXmlFile());
  22. printAllFileName(fFile);
  23. }
  24. if(!temp.isDirectory())
  25. System.out.println(temp.getAbsolutePath());
  26. }
  27. }
  28. }
  29. class OutXmlFile implements FileFilter{//创建类实现接口方法添加过滤器
  30. public boolean accept(File pathname) {
  31. // TODO Auto-generated method stub
  32. return pathname.isDirectory() || pathname.getName().endsWith(".xml");
  33. }
  34. }
  1. 运行结果;
  2. C:D:E:F:\

这里的根目录是指最顶端的根目录。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号