学习Java必备的基础知识打卡12.20,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

Posted java厂长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习Java必备的基础知识打卡12.20,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#相关的知识,希望对你有一定的参考价值。

Day26-Java之IO—File类

@[toc]

关于作者

• 作者介绍

基本操作

如果要想学好IO,必须要清楚抽象类、IO的操作部分掌握两个代码模型。IO的核心组成五个类(File、OutputStream、InputStream、Writer、Reader)一个接口(Serializable)。

再java.io是一个与文本本身操作有关的程序(创建、删除、信息取得---)

如果要想使用File类操作文件的话,那么肯定要通过构造方法实例化File类对象,而实例化File类对象的过程之中主要使用以下两种构造方法:

  1. 方法一:public File(String pathname);
  2. 方法二:public File(File parent,String child).

文件的基本操作,主要有以下几种功能:

  • 创建一个新文件:public boolean createNewFile() throws IOException

  • 删除文件:public Boolean delete();

  • 判断路径是否存在:public Boolean exists();
package com.day14.demo;

import java.io.File;
import java.io.IOException;

public class FileDemo 
    public static void main(String[] args) throws IOException 
        File file = new File("f:\\\\hello.txt");
        file.createNewFile();
    
package com.day14.demo;

import java.io.File;
import java.io.IOException;

public class FileDemo 
    public static void main(String[] args) throws IOException 
        File file = new File("f:\\\\hello.txt");  
        if(file.exists())//文件存在
            file.delete();
        else//文件不存在
            file.createNewFile();//创建文件
        
    

本程序操作就表示如果文件存在则删除,如果不存在则创建一个新的文件,此时基本功能是实现了,不过这个程序此时存在三个问题:

在windows操作之中,使用“\\”作为路径分隔符,而在Linux系统下使用“/”作为路径分隔符,而实际的开发而言,大部分情况下会在windows中做开发,而后将项目部署在Linus,那么此时,路径的分隔符都需要进行修改,这样实在是国语麻烦,为此在File类之中提供了一个常量:public static final String separator(按照Java的命名规范来讲,对于全局常量应该使用大写字母的方式定义,而此处使用的是小写,是由Java的发展历史所带来的问题)。

//由不同的操作系统的JVM来决定最终的separator是什么内容File file = new File("f:" + File.separator + "hello.txt");    

发现程序执行完成之后,对于文件的创建或者是删除是会存在一些操作上的延迟,如果现在假设先删除了一个文件,而后立刻判断此文件是否存在,那么可能得到的结果就是错误的(为true),一位所有的*.class文件都要通过JVM与操作系统间接操作,这样就有可能会出现延迟的问题。

之前进行文件创建的时候都是在根目录下创建完成的,如果说现在要创建的文件有目录呢?例如,现在要创建一个f:\\hello\\hello.txt文件,而此时在执行程序的时候hello目录不存在,这个时候执行的话就会出现错误提示:

Exception in thread "main" java.io.IOException: 系统找不到指定的路径。

因为现在目录不存在,所以不能创建,那么这个时候必须首先判断要创建文件的父路径是否存在,如果不存在应该创建一个目录,之后再进行文件的创建,而要想完成这样的操作,需要一下几个方法支持:

找到一个指定文件的父路径:public File getParentFile();

创建目录:public boolean mldirs()。

package com.day14.demo;

import java.io.File;
import java.io.IOException;

public class FileDemo 
    public static void main(String[] args) throws IOException 
        //由不同的操作系统的JVM来决定最终的separator是什么内容
        File file = new File("f:" + File.separator +"hello" + File.separator + "hello.txt");    
        if(!file.getParentFile().exists())//父目录
            file.getParentFile().mkdirs();//创建父目录
        
        if(file.exists())//文件存在
            file.delete();
        else//文件不存在
            file.createNewFile();//创建文件
        
    

以后在任何的java.io.File类开发过程之中,都一定要考虑文件目录的问题。

取得文件信息

在File类之中还可以通过以下的方法取得一些文件的基本信息:

方法名称 描述
public String getName() 取得文件的名称
public boolean isDirectory() 给定的路径是否为文件夹
public boolean isFile() 给定的路径是否是文件
public boolean isHidden() 是否是隐藏文件
public long lastModified() 文件的最后一次修改日期
public long length() 取得文件大小,是以字节为单位返回的。
public class FileDemo2 
    public static void main(String[] args) 
        File file = new File("f:" + File.separator + "701_03_支付宝沙箱使用.avi");
        if(file.exists() && file.isFile())
            System.out.println("1文件大小为:" + MyMath.round(file.length() / (double) 1024 / 1024, 2));
            System.out.println("最后一次修改日期:"+ new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
            System.out.println("2文件大小为:" + new BigDecimal(file.length() / (double)1024 /1024).divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP).doubleValue());
        
    

列出目录内容:public File [] listFiles(),此方法将目录中的所有文件以File对象数组的方式返回;

package com.day14.demo;

import java.io.File;
import java.util.Arrays;

public class FileDemo3 
    public static void main(String[] args) 
        File file = new File("f:" + File.separator);
        if(file.exists() && file.isDirectory())
            File[] listFiles = file.listFiles();
            System.out.println(Arrays.toString(listFiles));
        
    

综合案例:目录列表

现在希望把一个目录下的全部文件都列出来,那么这种情况下只能采用递归:因为列出一个目录下的全部文件或着文件夹之后,如果发现列出的内容是文件夹,则应该向后继续列出。

package com.day14.demo;

import java.io.File;

public class FileListDemo 
    public static void main(String[] args) 
        File file = new File("f:" + File.separator);
        list(file);
    
    public static void list(File file)
        if(file.isDirectory())
            File[] files = file.listFiles();
            if(files != null)
                for (int i = 0; i < files.length; i++) 
                list(files[i]);//继续列出
                
               
        
        System.out.println(file);
    

现在代码都在main线程下执行,如果该程序执行完成后才能继续执行下一条语句,要想解决这种耗时的问题。最好产生一个新的线程进行列出。

package com.day14.demo;
import java.io.File;
public class FileListDemo 
    public static void main(String[] args) 
        new Thread(()->
            File file = new File("f:" + File.separator);
            list(file);
        ,"列出线程").start();
        System.out.println("开始进行文件信息列出。。。。");
    
    public static void list(File file)
        if(file.isDirectory())
            File[] files = file.listFiles();
            if(files != null)
                for (int i = 0; i < files.length; i++) 
                list(files[i]);//继续列出
                
            
            
        System.out.println(file);
    

以上是关于学习Java必备的基础知识打卡12.20,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#的主要内容,如果未能解决你的问题,请参考以下文章

学习Java必备的基础知识打卡12.16,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.19,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.22,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.23,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.7,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.29,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#