一:知识点总结
1.File类只用于表示文件(目录)的信息,不能对文件的内容进行访问。
2.创建File对象时候的路径问题
(1)File file=new File(“绝对路径”);
“绝对路径”:
1)windows:
- “d:/test” -------Java提供的自动处理的方法,程序员比较常用
- “d:\\test”-----转义字符
- “d:”+File.separator+”test”
2)Linnux/Unix/Mac
A.”/home/soft01/test”
B. ”/home/soft01/”+File.separator+”test”
(2)File file=new File(“相对路径”);
相对路径:Windows和Linux没有差别
如:”demo/test” -------为了方便,跨平台,经常使用相对路径
相对的起点位置:main方法的启动路径,在Eclipse中是当前项目文件夹
File f=new Flie(“demo”);
f.mkdir()
提示:抽象路径应尽量使用相对路径,并且目录的层级分隔符不要直接写”/”或”\”,应使用File.separator这个常量表示,以避免不同系统带来的差异。
3. 构造方法:
(1)File file=new File(“name”);
(2)File parent= new File(“demo”);
File file= new File(parent,name);
二:代码练习:
1. 利用File API创建了文件夹,文件
1 //只是在内存中创建一个对象,硬盘上没有文件夹 2 File file=new File("e:"+File.separator+"fileTest");
//在硬盘上创建文件夹,返回值为true,创建成功(原先没有)
反之,创建失败(已经有文件夹或文件)
1 boolean ok=file.mkdir(); 2 System.out.println(ok);
//同理,创建文件----注意此处抛出异常,需要加上throws IOException
1 File f=new File("e:"+File.separator +"fileTest"+File.separator+"test.txt"); 2 boolean ok=f.createNewFile(); 3 System.out.println(ok);
2.//在当前文件夹中创建一个新的文件夹demo
“当前文件夹”就是当前项目的文件夹!使用刷新(F5)查看结果
“其中“demo”参数是相对路径
//在demo文件夹中创建文件
1 File f=new File("demo"); 2 f.mkdir(); 3 File file=new File("hello"); 4 file.createNewFile();
//访问f指向的demo文件夹中的文件
1 File a=new File(f,"test.txt"); 2 a.createNewFile();
//在demo文件夹中创建一个子文件夹
1 File file1=new File(f,"one"); 2 file1.mkdir();
3. 一次在硬盘上创建系列路径(多级文件夹)
1 File file = new File("myhome/job/days/day01/am"); 2 file.mkdirs();
4. //file.exists()用于检查硬盘上是否存在文件,文件夹
// file.isFile()如果被检查的是文件返回true
//file.isDirectory()如果检查的是文件夹返回true
1 boolean found=file.exists(); 2 System.out.println(found); 3 boolean f=file.isFile(); 4 boolean d=file.isDirectory(); 5 System.out.println(f); 6 System.out.println(d);
5. 访问已经存在的文件,获取文件相关的信息
1 File file = new File("D:/Welcome.html"); 2 //文件的长度:文件中字节数据个 3 long l = file.length(); 4 System.out.println(l); 5 System.out.println(l/1024D); 6 //文件的最后last修改Modify时间----
输出的是里面文件夹里(包括子文件的最后修改时间)
1 long time = file.lastModified(); 2 SimpleDateFormat format = 3 new SimpleDateFormat( 4 "yyyy-MM-dd HH:mm:ss"); 5 System.out.println(format.format(time)); 6 System.out.println(file.canWrite());
6. delete() 删除one指向的硬盘文件,不能删除有内容的文件夹(文件夹含有子文件或者子文件夹不可以)!
1 File one = new File("demo", "one"); 2 boolean ok = one.delete(); 3 System.out.println(ok);//true
7. 在Linux上以.开头的文件或文件夹是隐藏的
File file2 = new File(".home");
8. 将file指向的文件夹(文件) 改名为 file2 的名字,返回true表示修改成功
9. 改名 将file指向的文件夹(文件) 改名为 file2 的名字,
返回true表示修改成功,
1 File file2 = new File("myhome"); 2 File file = new File("home"); 3 boolean success=file.renameTo(file2); 4 System.out.println(success);
注意:file2一定不能在硬盘中创建,输出false。而file必须是已经创建的文件夹
10. 在文件或者不存在的文件上调用了 listFiles(),底层出现IO错误时候,返回null!
11. 在文件夹上调用listFiles() 方法,返回文件夹的全部内容(子文件、文件夹)
含隐藏文件!返回File类型的数组,元素是文件夹或文件
1 File myhome=new File("myhome"); 2 File[] files=myhome.listFiles(); 3 System.out.println(Arrays.toString(files));
注意:只输出myhome\job,job下面的子文件夹不会输出
12.
1 /** 2 3 * 计算一个目录中全部文件的总长度,只检索当前目录中的文件总长度,不包含子文件夹 4 5 * @param dir 目录名 6 7 * @return 文件的总长度 8 9 * @throws FileNotFoundException 文件 10 11 * 夹不存在,或者不是文件夹时候抛出异常。 12 13 */ 14 15 public class IOUtils { 16 17 public static long size(String dir) 18 19 throws FileNotFoundException{ 20 21 /* 22 23 * 创建File对象 24 25 * 检查是否存在,抛出异常! 26 27 * 检查是否是文件夹! 抛出异常! 28 29 * 获取文件的全部内容(子文件、子文件夹)。 30 31 * 遍历全部内容。 32 33 * 如果是文件(isFile())的时候 34 35 * 统计文件的长度。 36 37 * 返回统计结果 38 39 */ 40 41 File file = new File(dir); 42 43 //exists 存在 44 45 if(! file.exists()){ 46 47 //抛异常是方法的结束,是不正确结束! 48 49 throw new FileNotFoundException( 50 51 "文件夹不存在:"+dir); 52 53 } 54 55 //file已经存在,检查是文件吗 56 57 if(file.isFile()){ 58 59 throw new FileNotFoundException( 60 61 "不是文件夹:"+dir); 62 63 } 64 65 //获取文件夹全部内容(子文件、文件夹) 66 67 File[] files = file.listFiles(); 68 69 //File[] files = file.listFiles(onlyFile); 70 71 //统计文件的长度 72 73 long count = 0; 74 75 for(File f:files){ 76 77 //f 代表文件夹中的子文件、文件夹 78 79 if(f.isFile()){ 80 81 count+=f.length(); 82 83 } 84 85 //count+=f.isFile()?f.length():0; 86 87 } 88 89 return count; 90 91 } 92 93 }
测试
1 public static void main(String[] args) throws IOException { 2 3 // TODO Auto-generated method stub 4 5 File file=new File("Demo/demo.txt"); 6 7 file.createNewFile(); 8 9 try{ 10 11 long s=IOUtils.size("Demo/demo.txt"); 12 13 System.out.println(s); 14 15 System.out.println(s/1024D/1024); 16 17 }catch(FileNotFoundException e){ 18 19 e.printStackTrace(); 20 21 } 22 23 }
注意:出现问题,不知道为什么?
Exception in thread "main"java.lang.NullPointerException
long s=IOUtils.size("Demo/demo.txt");
public static void main(String[] args) {
13. 有条件的获取文件夹的内容
//定义过滤器,只接受文件
1 /**
2 * 判断给定参数 file 是否是可接受的结果。
3
4 * 如果file是需要的对象返回true,否则返回false
5
6 */
7 FileFilter onlyFile = new FileFilter(){
8 //accept 接受
9 public boolean accept(File file) {
10 return file.isFile();
11 }
12 };
13 //匿名内部类结束以后
14 File dir = new File("d:/");
15 /**
16
17 * listFiles 方法会自动的调用 onlyFile
18
19 * 中的accept 方法,将满足条件的文件留下
20
21 * 来作为结果,不满足的抛弃。
22
23 */
24 File[] files = dir.listFiles(onlyFile);
25 for (File file : files) {
26 //getName 返回文件的名字
27 System.out.println(file.getName());
28 }
29 }
三.问题疑问
1. 获取文件中字节长度,依据是什么?为什么有的文件夹输出是0,有的几个文件夹的输出比较固定?都是
1 File file3=new File("e:/1.JavaProgram"); 2 long l=file3.length(); 3 System.out.println(l); 4 System.out.println(l/1024D);
输出:4096 4.0
1 File file3=new File("e:/1. 0.eclipse"); 2 long l=file3.length(); 3 System.out.println(l); 4 System.out.println(l/1024D);
输出:0 0.0
答案:File.length()的话如果读取的是一个文件夹 那么字节是不固定的?????
2.以下代码为什么在项目文件夹中刷新显示删除了文件,但是输出file是还有删除的文件,输出结果还是myhome/job/days/day01/am, 但是file5.exists()输出语句返回false
1 File file5=new File("myhome/job/days/day01/am"); 2 System.out.println(file5.delete()); 3 System.out.println(file5); 4 System.out.println(file5.exsits());
3.在当前目录下建立三个文件,如果两个文件名拼写相同(大小写不一样时)时,为什么刷新不出后来建立的,但是输出表示已经建立了文件夹,输出:三个true?????
1 File file=new File("demo"); 2 file.mkdir(); 3 System.out.println(file.exists()); 4 File file1=new File("Demo"); 5 file1.mkdir(); 6 System.out.println(file1.exists()); 7 File file2=new File("mo"); 8 file2.mkdir(); 9 System.out.println(file2.exists());