一:知识点总结
1.File类只用于表示文件(目录)的信息,不能对文件的内容进行访问。
2.创建File对象时候的路径问题
(1)File file=new File(“绝对路径”);
“绝对路径”:
1)windows:
A. “d:/test” -------Java提供的自动处理的方法,程序员比较常用
B. “d:\\test”-----转义字符
C. “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=newFile(“name”);
(2)File parent= new File(“demo”);
Filefile= new File(parent,name);
二:代码练习:
1. 利用File API创建了文件夹,文件
//只是在内存中创建一个对象,硬盘上没有文件夹
File file=newFile("e:"+File.separator+"fileTest");
//在硬盘上创建文件夹,返回值为true,创建成功(原先没有)
反之,创建失败(已经有文件夹或文件)
booleanok=file.mkdir();
System.out.println(ok);
//同理,创建文件----注意此处抛出异常,需要加上throws IOException
File f=new File("e:"+File.separator+"fileTest"+File.separator+"test.txt");
boolean ok=f.createNewFile();
System.out.println(ok);
2.//在当前文件夹中创建一个新的文件夹demo
“当前文件夹”就是当前项目的文件夹!使用刷新(F5)查看结果
“其中“demo”参数是相对路径
//在demo文件夹中创建文件
File f=new File("demo");
f.mkdir();
File file=new File("hello");
file.createNewFile();
//访问f指向的demo文件夹中的文件
File a=new File(f,"test.txt");
a.createNewFile();
//在demo文件夹中创建一个子文件夹
File file1=new File(f,"one");
file1.mkdir();
3. 一次在硬盘上创建系列路径(多级文件夹)
File file= new File("myhome/job/days/day01/am");
file.mkdirs();
4. //file.exists()用于检查硬盘上是否存在文件,文件夹
//file.isFile()如果被检查的是文件返回true
//file.isDirectory()如果检查的是文件夹返回true
booleanfound=file.exists();
System.out.println(found);
booleanf=file.isFile();
booleand=file.isDirectory();
System.out.println(f);
System.out.println(d);
5. 访问已经存在的文件,获取文件相关的信息
File file= new File("D:/Welcome.html");
//文件的长度:文件中字节数据个
longl = file.length();
System.out.println(l);
System.out.println(l/1024D);
//文件的最后last修改Modify时间----
输出的是里面文件夹里(包括子文件的最后修改时间)
long time = file.lastModified();
SimpleDateFormat format =
new SimpleDateFormat(
"yyyy-MM-ddHH:mm:ss");
System.out.println(format.format(time));
System.out.println(file.canWrite());
6. delete() 删除one指向的硬盘文件,不能删除有内容的文件夹(文件夹含有子文件或者子文件夹不可以)!
File one= new File("demo", "one");
boolean ok = one.delete();
System.out.println(ok);//true
7. 在Linux上以.开头的文件或文件夹是隐藏的
File file2 = newFile(".home");
8. 将file指向的文件夹(文件)改名为 file2 的名字,返回true表示修改成功
9. 改名将file指向的文件夹(文件)改名为 file2 的名字,
返回true表示修改成功,
Filefile2 = new File("myhome");
File file= new File("home");
booleansuccess=file.renameTo(file2);
System.out.println(success);
注意:file2一定不能在硬盘中创建,输出false。而file必须是已经创建的文件夹
10. 在文件或者不存在的文件上调用了listFiles(),底层出现IO错误时候,返回null!
11. 在文件夹上调用listFiles()方法,返回文件夹的全部内容(子文件、文件夹)
含隐藏文件!返回File类型的数组,元素是文件夹或文件
File myhome=newFile("myhome");
File[]files=myhome.listFiles();
System.out.println(Arrays.toString(files));
注意:只输出myhome\job,job下面的子文件夹不会输出
12.
/**
* 计算一个目录中全部文件的总长度,只检索当前目录中的文件总长度,不包含子文件夹
* @param dir 目录名
* @return 文件的总长度
* @throws FileNotFoundException 文件
* 夹不存在,或者不是文件夹时候抛出异常。
*/
public class IOUtils {
public static longsize(String dir)
throwsFileNotFoundException{
/*
* 创建File对象
* 检查是否存在,抛出异常!
* 检查是否是文件夹!抛出异常!
* 获取文件的全部内容(子文件、子文件夹)。
* 遍历全部内容。
* 如果是文件(isFile())的时候
* 统计文件的长度。
* 返回统计结果
*/
File file = newFile(dir);
//exists 存在
if(! file.exists()){
//抛异常是方法的结束,是不正确结束!
throw newFileNotFoundException(
"文件夹不存在:"+dir);
}
//file已经存在,检查是文件吗
if(file.isFile()){
throw newFileNotFoundException(
"不是文件夹:"+dir);
}
//获取文件夹全部内容(子文件、文件夹)
File[] files =file.listFiles();
//File[] files =file.listFiles(onlyFile);
//统计文件的长度
long count = 0;
for(File f:files){
//f 代表文件夹中的子文件、文件夹
if(f.isFile()){
count+=f.length();
}
//count+=f.isFile()?f.length():0;
}
return count;
}
}
测试
public static void main(String[] args) throws IOException {
// TODO Auto-generatedmethod stub
File file=newFile("Demo/demo.txt");
file.createNewFile();
try{
longs=IOUtils.size("Demo/demo.txt");
System.out.println(s);
System.out.println(s/1024D/1024);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}
}
注意:出现问题,不知道为什么?
Exception in thread "main"java.lang.NullPointerException
long s=IOUtils.size("Demo/demo.txt");
public static void main(String[] args) {
13. 有条件的获取文件夹的内容
//定义过滤器,只接受文件
/**
* 判断给定参数 file 是否是可接受的结果。
* 如果file是需要的对象返回true,否则返回false
*/
FileFilter onlyFile =new FileFilter(){
//accept 接受
public boolean accept(File file) {
returnfile.isFile();
}
};
//匿名内部类结束以后
File dir = newFile("d:/");
/**
* listFiles 方法会自动的调用 onlyFile
* 中的accept 方法,将满足条件的文件留下
* 来作为结果,不满足的抛弃。
*/
File[] files =dir.listFiles(onlyFile);
for (File file : files){
//getName 返回文件的名字
System.out.println(file.getName());
}
}
三.问题疑问
1. 获取文件中字节长度,依据是什么?为什么有的文件夹输出是0,有的几个文件夹的输出比较固定?都是
File file3=newFile("e:/1.JavaProgram");
long l=file3.length();
System.out.println(l);
System.out.println(l/1024D);
输出:4096 4.0
File file3=newFile("e:/1. 0.eclipse");
long l=file3.length();
System.out.println(l);
System.out.println(l/1024D);
输出:0 0.0
答案:File.length()的话如果读取的是一个文件夹 那么字节是不固定的?????
2.以下代码为什么在项目文件夹中刷新显示删除了文件,但是输出file是还有删除的文件,输出结果还是myhome/job/days/day01/am,但是file5.exists()输出语句返回false
File file5=newFile("myhome/job/days/day01/am");
System.out.println(file5.delete());
System.out.println(file5);
System.out.println(file5.exsits());
3.在当前目录下建立三个文件,如果两个文件名拼写相同(大小写不一样时)时,为什么刷新不出后来建立的,但是输出表示已经建立了文件夹,输出:三个true?????
File file=new File("demo");
file.mkdir();
System.out.println(file.exists());
File file1=newFile("Demo");
file1.mkdir();
System.out.println(file1.exists());
File file2=newFile("mo");
file2.mkdir();
System.out.println(file2.exists());