File类
学习法则:当子类重写父类方法时,会根据实例化子类的不同,同一方法可以完成不同的功能。java.io包含了大部分常用的Io操作类,而这个包之中核心的组成部分就是五个类(File,InputStream,OutputStream,Reader,Writer)和一个接口(Serializable)
File类(重点)
File类是整个java.io包之中唯一一个与文件本身操作有关的类,文件本身操作指的是文件的创建,删除,重命名等等
但是如果要进行File类操作那么必须设置好要操作的文件或文件夹的路径,使用如下构造方法
构造方法:public File(String pathname);传入完整的路径,WEB开发此方法比较好用
构造方法:public File(File parent,String child);传入父路径和子路径
范例:基本的文件操作
创建新的文件:public boolean createNewFile() throws IOException
删除文件:public boolean delete();
判断文件是否存在:public boolean exists();
package io;
import java.io.File;
public class Filea {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
File file=new File("D:\\teat.txt");
if(file.exists()) {//文件存在
file.delete();
}else {
file.createNewFile();
}
}
}
此时的程序的确完成了所有的文件基本操作,但是本程序之中依然会存在有如下的几个问题:
问题一:java的最大特征是可移植性,但是如果是文件编程此处就需要考虑一个平台问题,在windows之中使用“\”作为路径分隔符,而在Linux中
使用“/”作为路径分隔符,那么在实际的工作之中,往往都会在windows下做开发,而后将项目部署到Linux之中,所以来讲就不能够将路径
的分隔符写固定了,为此在File类中提供了一个常量: public static final String separator
按命名规范来讲separator应该大写表示,但是此处是小写字母--历史原因
File file=new File("D:"+File.separator+"teat.txt");
问题二:在程序执行完成之后文件的并不会立刻删除或是创建,存在有一定的延迟,因为java程序是通过JVM间接调用系统函数实现的文件操作。
问题三:如果在进行文件创建的时候有目录,则需要先创建目录才可以创建文件。
第一步:找到父路径:public File getParentFile();
第二步:创建目录:public boolean mkdirs();
package io;
import java.io.File;
public class Filea {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
File file=new File("D:"+File.separator+"hello"
+File.separator+"haha"+File.separator+"teat.txt");
if(!file.getParentFile().exists()) {//父路径不存在
file.getParentFile().mkdirs();
}
if(file.exists()) {//文件存在
file.delete();
}else {
file.createNewFile();
}
}
}
除了以上的基本的文件和文件夹的操作之外,也提供有一些取得文件信息的操作方法:
判断路径是否是文件:public boolean isFile();
判断路径是否是文件夹:public boolean isDirectory()
最后一次修改日期:public long lastModfied()
取得文件大小:public long length()
修改文件名称:public boolean renameTo(File dest)
package io;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Fileb {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file =new File("D:"+File.separator+"hello");
if(file.exists()) {//文件存在
System.out.println(file.isFile()?"是文件":"不是文件");
System.out.println(file.isDirectory()?"是文件夹":"不是文件夹");
//System.out.println("最后一次修改日期:"+new Date(file.lastModified()));
System.out.println("最后一次修改日期:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
.format(new Date(file.lastModified())));
System.out.println("文件大小:"+file.length()+"MB");
file.renameTo(new File("D:"+File.separator+"haha"));
}
}
}
如果说现在给定的路径是一个文件夹,那么如果是文件夹则里面应该会包含有许多的文件或子文件夹,可以利用以下的方法列出目录之中的
所有内容
列出目录内容:public File [] listFiles() 返回的是一个对象数字
范例:列出目录内容
package io;
import java.io.File;
public class Filec {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file=new File("D:"+File.separator+"hanboshi");
if(file.exists()&&file.isDirectory()) {
File result[]=file.listFiles();//列出全部内容
for(int x=0;x<result.length;x++) {
System.out.println(result[x]);
}
}
}
}
但是此时列出来只是当前目录级别中的数据
范例:列出一个目录之中的所有文件(包括所有子目录的文件)
基本原则:首先要判断给定的File类对象是否是目录,如果是目录则继续列出,那么随后循环列出的File类数组,后依次进行判断是否是目录。
这样的实现最好使用递归完成
package io;
import java.io.File;
public class Filec {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file=new File("D:"+File.separator+"hanboshi");
print(file);
}
public static void print(File file) {
if(file.exists()&&file.isDirectory()) {
File result[]=file.listFiles();//列出全部内容
if(result!=null) {
for(int x=0;x<result.length;x++) {
print(result[x]);//递归调用
}
}
}
System.out.println(file);
}
}
如果此时的程序之中对于文件的路径不是输出而是执行删除昵?
提示:本操作具备危险性
package io;
import java.io.File;
public class Filec {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file=new File("D:"+File.separator+"hello");
print(file);
}
public static void print(File file) {
if(file.exists()&&file.isDirectory()) {
File result[]=file.listFiles();//列出全部内容
if(result!=null) {
for(int x=0;x<result.length;x++) {
print(result[x]);//递归调用
}
}
}
file.delete();
//System.out.println(file);
}
}