Java基础之IO—File类4月打卡day23
Java基础之IO—File类4月打卡day23
关于作者
-
作者介绍
🍓 博客主页:
🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。
🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨💻。
IO—File类
1、基本操作
如果要想学好IO,必须要清楚抽象类、IO的操作部分掌握两个代码模型。IO的核心组成五个类(File、OutputStream、InputStream、Writer、Reader)一个接口(Serializable)。
再java.io是一个与文本本身操作有关的程序(创建、删除、信息取得---)
如果要想使用File类操作文件的话,那么肯定要通过构造方法实例化File类对象,而实例化File类对象的过程之中主要使用以下两种构造方法:
-
方法一:public File(String pathname);
-
方法二: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类开发过程之中,都一定要考虑文件目录的问题。
2、取得文件信息
在File类之中还可以通过以下的方法取得一些文件的基本信息:
方法名称 | 描述 |
---|---|
public String getName() | 取得文件的名称 |
public boolean isDirectory() | 给定的路径是否为文件夹 |
public boolean isFile() | 给定的路径是否是文件 |
public boolean isHidden() | 是否是隐藏文件 |
public long lastModified() | 文件的最后一次修改日期 |
public long length() | 取得文件大小,是以字节为单位返回的。 |
获取文件的大小信息以及核心信息
package com.day14.demo;
import java.io.File;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
class MyMath{
public static double round(double num, int scale){
return Math.round(num * Math.pow(10, scale)) / Math.pow(10, scale);
}
}
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));
}
}
}
3、综合案例:目录列表
现在希望把一个目录下的全部文件都列出来,那么这种情况下只能采用递归:因为列出一个目录下的全部文件或着文件夹之后,如果发现列出的内容是文件夹,则应该向后继续列出。
列出指定目录下的所有文件
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);
}
}
- 点赞
- 收藏
- 关注作者
评论(0)