达内课程-File用法(上)
IO
Input/Output
输入/输出
相对于内存来说的
java.io包
File
RandomAccessFile
InputSteam/OutputStream
FileInputSteam/FileOutputStream
BufferedInputSteam/BufferedOutputStream
DataInputSteam/DataOutputStream
PrintStream
ByteArrayInputSteam/ByteArrayOutputStream
ObjectInputSteam/ObjectOutputStream
Reader/Writer
InputStreamReader/OutputStreamWriter
FileReader/FileWriter
BufferedReader/BufferedWriter
PrintReader
java.io.File
1、封装一个磁盘路径,例如
“d:/a/a.txt”
“d:/a/b/”
2、可以是文件路径,也可以是目录路径
3、可以封装不存在的路径
创建对象
1、File file = new File(“d:/abc/a.txt”);
2、File file = new File(“d:/abc/”,”a.txt”);
方法
文件或目录的属性
canRead()//是否可读
canWrite()//是否可写
canExecute()//是否可执行
isHidden()//是否隐藏文件
exists()//表示的路径是否存在
getAbsolutePath()//完整路径
getName()//文件名
getParent()//父目录
lastModified()//最后修改时间,毫秒值
length()//文件字节量,对目录无效
isDirectory()//是否文件夹
isFile()//是否文件
getTotalSpace//空间大小
getFreeSpace//可用空间
栗子
例如我要使用以下文件
我这样写是会报错的
原因是需要转义,所以需要写成
或者使用另一个方向的斜杠
String path;
path = "D:/Eclipse/eclipse/readme/readme_eclipse.html";//找一个存在的文件路径
File f = new File(path);
System.out.println("可读:"+f.canRead());
System.out.println("可写:"+f.canWrite());
System.out.println("可执行:"+f.canExecute());
System.out.println("是否隐藏:"+f.isHidden());
System.out.println("是否存在:"+f.exists());
System.out.println("完整路径:"+f.getAbsolutePath());
System.out.println("文件名:"+f.getName());
System.out.println("父目录:"+f.getParent());
System.out.println("最后修改时间:"+f.lastModified());
System.out.println("字节量:"+f.length());
System.out.println("是否目录:"+f.isDirectory());
System.out.println("是否文件:"+f.isFile());
System.out.println("总空间:"+f.getTotalSpace());
System.out.println("可用空间:"+f.getFreeSpace());
输出结果
可读:true
可写:true
可执行:true
是否隐藏:false
是否存在:true
完整路径:D:\Eclipse\eclipse\readme\readme_eclipse.html
文件名:readme_eclipse.html
父目录:D:\Eclipse\eclipse\readme
最后修改时间:1467166182000
字节量:101468
是否目录:false
是否文件:true
总空间:127806730240
可用空间:74330075136
当为存在的目录时
path = "D:/Eclipse/eclipse";//找一个存在的目录路径
输出结果
可读:true
可写:true
可执行:true
是否隐藏:false
是否存在:true
完整路径:D:\Eclipse\eclipse
文件名:eclipse
父目录:D:\Eclipse
最后修改时间:1512106921222
字节量:4096
是否目录:true
是否文件:false
总空间:127806730240
可用空间:74330066944
当path为不存在路径时
path = "E:/bucunzai/demulu";//瞎写一个不存在的路径
输出结果
可读:false
可写:false
可执行:false
是否隐藏:false
是否存在:false
完整路径:E:\bucunzai\demulu
文件名:demulu
父目录:E:\bucunzai
最后修改时间:0
字节量:0
是否目录:false
是否文件:false
总空间:0
可用空间:0
文件或目录操作
createNewFile()//创建文件
delete()//删除文件或”空目录”,能删除目录,但是里边有东西就不能删
mkdir()//创建单层目录
mkdirs()//创建多层目录,如果创建d:/aa/bb/cc/dd,这个方法会补全前面不存在的目录
renameTo()//改名、移动
创建删除重命名方法返回boolean,表示操作成功与否
File createTempFile(前缀,后缀)//在系统临时创建目录
栗子
public static void main(String[] args) throws IOException {
File f= new File("d:/abc/f1");
if(f.exists()){
//文件存在,删除
boolean b = f.delete();
System.out.println("删除是否成功:"+b);
}else{
//文件不存在,创建
/*
*1、文件已经存在,会返回 false
*2、目录不存在,会出现异常
*/
boolean b = f.createNewFile();
System.out.println("创建是否成功:"+b);
}
}
因为要创建”d:/abc/f1”,如果”d:/abc”这个目录不存在会出现异常
因此在d盘下新建”abc”目录后再执行
栗子
File f= new File("d:/abc/aa/bb/cc");
if(f.exists()){
//文件存在,删除
boolean b = f.delete();
System.out.println("删除是否成功:"+b);
}else{
boolean b = f.mkdir();
System.out.println("创建是否成功:"+b);
}
输出结果
创建是否成功:false
因为路径是”d:/abc/aa/bb/cc”,要创建cc目录,用mkdir()必须保证aa、bb、cc存在才能创建成功
所以可以采用mkdirs()方法,这个方法会补全缺失的目录
再次点击删除,只会删除cc目录,因为路径表示的是cc目录
在cc目录下创建cc.txt,再次执行,删除失败,因为delete能删除目录,但只能删除空目录
栗子
d盘下存在a.txt
d:/a.txt
把存在的路径d:/a.txt封装成File对象f1
把不存在的路径d:/a2.txt封装成File对象f2
调用f1.renameTo(f2)
结果是f1、f2对象都不变,d盘下的a.txt改名为了a2.txt
所以现在f1不存在了。f2存在
File f1 = new File("d:/abc/f1");
File f2 = new File("d:/abc/fi-copy");
//异或是找不同,不同返回true,相同返回false
if(!(f1.exists() ^ f2.exists())){
System.out.println("两个文件不能同时存在,"+
"也不能同时不存在,"+
"必须存在其中一个");
return;
}
//如果改名成功
if(f1.exists()){
boolean b = f1.renameTo(f2);
System.out.println("改名成功:"+b);
}else{
boolean b = f2.renameTo(f1);
System.out.println("改名成功:"+b);
}
输出结果
栗子
创建系统临时目录
查看系统临时目录路径
以下代码会在刚才的临时目录路径下创建临时文件
File f = File.createTempFile("abc", ".txt");
System.out.println(f.getAbsolutePath());
输出结果
C:\Users\00lix\AppData\Local\Temp\abc9158952096480806778.txt
创建完临时文件,可以不用删除,临时文件会被系统或者关键类的工具清理掉,不过最好可以手动删除一下
f.delete();
如果文件名只指定一个字母”a”
File f = File.createTempFile("a", ".txt");
System.out.println(f.getAbsolutePath());
会报错,前缀太短
这个方法对前缀有要求,至少3个字符
上一篇: 读写文件
下一篇: [GKCTF2020]web