File类的使用
前言
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!
一、File类概述
(1)
java.io.File
类:文件和文件目录路径的抽象表示形式,与平台无关
(2)
File
类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用
IO
流来完成。
(3) 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个
File
对象,但是Java程序中的一个
File
对象,可能没有一个真实存在的文件或目录。
(4)
File
对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。
二、File类的使用
1. 绝对路径 vs 相对路径
(1)绝对路径:是一个固定的路径,从盘符开始
(2)相对路径:是相对于某个位置开始
main()
方法中的相对路径是相对于当前工程- 单元测试方法中的相对路径是相对于当前模块
2. 路径分隔符
(1) 路径中的每级目录之间用一个路径分隔符隔开。
(2)路径分隔符和系统有关:
windows
和DOS
系统默认使用"\"
来表示- UNIX和URL使用
"/"
来表示
(3) Java程序支持跨平台运行,因此路径分隔符要慎用。
为了解决这个隐患,File类提供了一个常量:public static final String separator
:根据操作系统,动态的提供分隔符。
File file1 =newFile("d:\\atguigu\\info.txt");File file2 =newFile("d:"+File.separator +"atguigu"+File.separator +"info.txt");File file3 =newFile("d:/atguigu");
3. 静态成员变量
静态成员变量描述
public static String pathSeparator
系统中多个路径的分隔符 windows;
public static String separator
系统中一个路径中多个名称之间的分隔符号 windows\
3. 常用构造器
构造器描述
public File(String pathname)
以
pathname
为路径创建
File
对象,可以是绝对路径或者相对路径,如果
pathname
是相对路径,则默认的当前路径在系统属性
user.dir
中存储。
public File(String parent,String child)
以
parent
为父路径,
child
为子路径创建File对象。
public File(File parent,String child)
根据一个父
File
对象和子文件路径创建
File
对象
代码演示:
//构造器1File file1 =newFile("hello.txt");//相对于当前moduleFile file2 =newFile("D:\\workspace_idea1\\JavaSenior\\day08\\he.txt");System.out.println(file1);System.out.println(file2);//构造器2:File file3 =newFile("D:\\workspace_idea1","JavaSenior");System.out.println(file3);//构造器3:File file4 =newFile(file3,"hi.txt");System.out.println(file4);}
4. 常用方法
4.1 获取功能
方法描述
public String getAbsolutePath()
获取绝对路径
public String getPath()
获取路径
public String getName()
获取名称
public String getParent()
获取上层文件目录路径。若无,返回
null
public long length()
获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified()
获取最后一次的修改时间,毫秒值
public String[] list()
获取指定目录下的所有文件或者文件目录的字符串数组
public File[] listFiles()
获取指定目录下的所有文件或者文件目录的File对象数组
代码演示:
@Testpublicvoidtest2(){File file1 =newFile("hello.txt");File file2 =newFile("d:\\io\\hi.txt");System.out.println(file1.getAbsolutePath());System.out.println(file1.getPath());System.out.println(file1.getName());System.out.println(file1.getParent());System.out.println(file1.length());System.out.println(newDate(file1.lastModified()));System.out.println();System.out.println(file2.getAbsolutePath());System.out.println(file2.getPath());System.out.println(file2.getName());System.out.println(file2.getParent());System.out.println(file2.length());System.out.println(file2.lastModified());}@Testpublicvoidtest3(){File file =newFile("D:\\workspace_idea1\\JavaSenior");String[] list = file.list();for(String s : list){System.out.println(s);}System.out.println();File[] files = file.listFiles();for(File f : files){System.out.println(f);}}
4.2 重命名功能
方法描述
public boolean renameTo(File dest)
把文件重命名为指定的文件路径
代码演示:
@Testpublicvoidtest4(){File file1 =newFile("hello.txt");File file2 =newFile("D:\\io\\hi.txt");boolean renameTo = file2.renameTo(file1);System.out.println(renameTo);}
4.3 判断功能
方法描述
public boolean isDirectory()
判断是否是文件目录
public boolean isFile()
判断是否是文件
public boolean exists()
判断是否存在
public boolean canRead()
判断是否可读
public boolean canWrite()
判断是否可写
public boolean isHidden()
判断是否隐藏
代码演示:
@Testpublicvoidtest5(){File file1 =newFile("hello.txt");
file1 =newFile("hello1.txt");System.out.println(file1.isDirectory());System.out.println(file1.isFile());System.out.println(file1.exists());System.out.println(file1.canRead());System.out.println(file1.canWrite());System.out.println(file1.isHidden());System.out.println();File file2 =newFile("d:\\io");
file2 =newFile("d:\\io1");System.out.println(file2.isDirectory());System.out.println(file2.isFile());System.out.println(file2.exists());System.out.println(file2.canRead());System.out.println(file2.canWrite());System.out.println(file2.isHidden());}
4.4 创建功能
方法描述
public boolean createNewFile()
创建文件。若文件存在,则不创建,返回
false
public boolean mkdir()
创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs()
创建文件目录。如果上层文件目录不存在,一并创建
注意事项: 如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
代码演示:
@Testpublicvoidtest6()throwsIOException{File file1 =newFile("hi.txt");if(!file1.exists()){//文件的创建
file1.createNewFile();System.out.println("创建成功");}else{//文件存在
file1.delete();System.out.println("删除成功");}}@Testpublicvoidtest7(){//文件目录的创建File file1 =newFile("d:\\io\\io1\\io3");boolean mkdir = file1.mkdir();if(mkdir){System.out.println("创建成功1");}File file2 =newFile("d:\\io\\io1\\io4");boolean mkdir1 = file2.mkdirs();if(mkdir1){System.out.println("创建成功2");}//要想删除成功,io4文件目录下不能有子目录或文件File file3 =newFile("D:\\io\\io1\\io4");
file3 =newFile("D:\\io\\io1");System.out.println(file3.delete());}}
4.5 删除功能
方法描述
public boolean delete()
删除文件或者文件夹
注意事项: Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
三、练习
1. 显示文件及文件夹内容
publicstaticvoidshowDir(File srcDir,int count){System.out.println("|-"+ srcDir.getName());File[] files = srcDir.listFiles();
count++;for(File file : files){System.out.print(printTab(count));if(file.isFile()){System.out.println("|-"+ file.getName());}else{showDir(file,count);}}}
2. 统计文件夹大小
publicstaticlongcalculateDirSize(File srcDir){long size =0;File[] files = srcDir.listFiles();for(File file : files){if(file.isDirectory()){
size +=calculateDirSize(file);}else{
size += file.length();}}return size;}
3. 复制文件夹
//使用 commons-io-2.11.0包的工具类,工具类忒好了publicstaticvoidcopyDirUtil(File srcDir,File desDir)throwsIOException{FileUtils.copyDirectory(srcDir, desDir);//底层也用的递归}//自己递归实现publicstaticvoidcopyDir(File srcDir,File desDir)throwsIOException{if(!desDir.exists()){
desDir.mkdir();}File newDir =newFile(desDir, srcDir.getName());
newDir.mkdir();File[] files = srcDir.listFiles();if(files ==null|| files.length ==0){return;}for(File file : files){if(file.isDirectory()){copyDir(file, newDir);}else{FileInputStream fis =newFileInputStream(file);FileOutputStream fos =newFileOutputStream(newFile(newDir, file.getName()));byte[] buffer =newbyte[1024];int len =0;while((len = fis.read(buffer))!=-1){
fos.write(buffer,0, len);}
fis.close();
fos.close();}}}
4. 剪切文件夹
//使用 commons-io-2.11.0包的工具类,工具类忒好了publicstaticvoidcutDirUtil(File srcDir,File desDir)throwsIOException{FileUtils.moveDirectory(srcDir,desDir);/*源码
先复制,再删除
*/}//自己实现,在复制后紧接着删除源文件publicstaticvoidcutDir(File srcDir,File desDir)throwsIOException{if(!desDir.exists()){
desDir.mkdir();//删除源文件夹}File newDir =newFile(desDir, srcDir.getName());
newDir.mkdir();File[] files = srcDir.listFiles();if(files ==null|| files.length ==0){
srcDir.delete();return;}for(File file : files){if(file.isDirectory()){cutDir(file, newDir);}else{FileInputStream fis =newFileInputStream(file);FileOutputStream fos =newFileOutputStream(newFile(newDir, file.getName()));byte[] buffer =newbyte[1024];int len =0;while((len = fis.read(buffer))!=-1){
fos.write(buffer,0, len);}
fis.close();
fos.close();//读写完后,删除源文件
file.delete();}}
srcDir.delete();}
5. 删除文件夹
publicstaticbooleandeleteDir(File srcDir){File[] files = srcDir.listFiles();if(files ==null|| files.length ==0){return srcDir.delete();}for(File file : files){if(file.isDirectory()){deleteDir(file);}else{
file.delete();}}return srcDir.delete();}
6. 复制指定类型文件
//将符合条件的 文件路径-文件名 存到map集合中publicstaticMap<File,String>serchTypeFile(File srcDir,String desFileSuffix){Map<File,String> map =newHashMap<>();File[] files = srcDir.listFiles();if(files ==null){return map;}for(File file : files){if(file.isDirectory()){
map.putAll(serchTypeFile(file, desFileSuffix));}else{if(file.getName().toLowerCase().endsWith(desFileSuffix)){
map.put(file.getAbsoluteFile(), file.getName());}}}return map;}publicstaticvoidcopyTypeDir(File srcDir,File desDir,String desFileSuffix)throwsIOException{Map<File,String> map =serchTypeFile(srcDir, desFileSuffix);Set<Map.Entry<File,String>> entries = map.entrySet();for(Map.Entry<File,String> entry : entries){File key = entry.getKey();String value = entry.getValue();System.out.println(key +"---"+ value);/*挑选代码
...
*///给文件加上时间戳,防止文件重名. //这里有点问题,时间戳到毫秒值,如果电脑够快,可能两个同名文件加的时间戳一样,会造成文件的覆盖,唉~~ //用(1)(2)的话,可以解决,但每次都要遍历新文件夹,好麻烦啊。String[] names = key.getName().split("\\.");//正则表达式的关系SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");String format = sdf.format(newDate());String s = names[0]+"("+ format +")."+ names[1];File file =newFile(desDir, s);FileUtils.copyFile(key,file);}}
版权归原作者 小老师ir 所有, 如有侵权,请联系我们删除。