zoukankan      html  css  js  c++  java
  • Java IO流:(一)File 文件类

    一、File 类概述

      1、java.io.File类: 文件和文件目录路径的抽象表示形式,主要用于文件和目录的创建、查找和删除等操作。

      2、File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法。

      3、File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。

      4、File 是文件和目录路径名的抽象表示形式,即File类的对象代表一个文件或一个目录(文件夹)的路径,而不是文件本身。

      5、想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录

      6、File对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。

      路径问题

        绝对路径:从盘符开始的路径,这是一个完整的路径。如:E:\a.txt

        相对路径:相当于项目目录的路径,这个一个便捷的路径。如:../a.txt

      注意

        1. 路径不区分大小写

        2. 路径中的文件名称分隔符 window 使用反斜杠()也支持斜杠(/),反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠

        3. 其他的平台都使用斜杠作为分隔符(/),网络地址也是(http://www.baidu.com)。

        4. window 的路径分隔符使用“”,而Java程序中的“”表示转义字符,所以在Windows中表示路径,需要用“\”。或者直接使用“/”也可以,Java程序支持将“/”当成平台无关的路径分隔符。或者直接使用File.separator常量值表示。

        5. 路径中如果出现 “..” 表示上一级目录,路径名如果以“/”开头,表示从“根目录”下开始导航。

    二、File 类结构

      1、File 类继承结构

          

      2、File 类声明

    public class File
        implements Serializable, Comparable<File>{...}
    

      

      3、File 类方法列表

        

    三、File 构造器

       File 类提供了六个构造器,下面为常用的几种构造器。

      1、方式一

    public File(String pathname)
        ① 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。

         ②  pathname为路径创建File对象,可以是绝对路径或者相对路径

         ③  如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。

          (1)绝对路径:是从一个固定的路径,从盘符开始;

          (2)相对路径:是相对于某个位置开始;

         ④  路径可以是存在,也可以是不存在,创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况

      2、方式二

    public File(String parent,String child)
    

          以 parent 为父路径,child 为子路径创建 File 对象。

        优点:父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化

      3、方式三

    public File(File parent,String child)
    

          根据一个父 File 对象和子文件路径创建 File 对象。

        从父抽象路径名和子路径名字符串创建新的 File实例。

        注意

          ① 一个 File 对象代表硬盘实际存在一个文件或者目录。

          ② 无论该路径下是否存在文件或者目录,都不影响 File 对象的创建。

        优点

          ① 父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化

          ② 父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象

      4、方式四

    public File(URI uri):通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

      5、案例

     1     @Test
     2     public void test1() {
     3         //构造器1
     4         File file1 = new File("hello.txt");//相对于当前module
     5         File file2 =  new File("D:\Java—Workspaceing\JavaSenior\Java");
     6 
     7         System.out.println(file1);
     8         System.out.println(file2);
     9 
    10         //构造器2:
    11         File file3 = new File("D:\Java—Workspaceing","JavaSenior");
    12         System.out.println(file3);
    13 
    14         //构造器3:
    15         File file4 = new File(file3,"hi.txt");
    16         System.out.println(file4);
    17     }
    18 }

        运行结果:

        

         默认调用 File 类的 toString() 方法,

        

           

         在这里并不关心文件是否真正的存在,只是把文件的 path(路径)打印出来。

     

    四、File 类:路径分隔符

      1、上面的案例中,路径中的每级目录之间用一个 路径分隔符 隔开。

      2、路径分隔符和系统有关:

          (1)Windows 和 DOS 系统默认使用 "" 来表示;

          (2)UNIX 和 URL 使用 "/" 来表示;

      3、Java 程序支持跨平台运行,因此路径分隔符要慎用。

      4、为了解决这个隐患,File 类提供了一个常量:

    public static final String separator = "" + separatorChar;
    
    public static final char separatorChar = fs.getSeparator();
    

      

        能根据操作系统,动态的提示分隔符。

        例如:

    1     @Test
    2     public void test2() {
    3         File file1 = new File("D:\Java—Workspaceing\JavaSenior\Java");
    4         File file2 = new File("D:" + File.separator + "Java—Workspaceing" + File.separator + "JavaSenior" + File.separator + "Java");
    5         System.out.println("file1 = " + file1);
    6         System.out.println("file2 = " + file2);
    7     }

        运行结果:

        

    五、File 类常用方法

      1、File 类的获取功能

    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数组
    

        Demo:

     1     @Test
     2     public void test2(){
     3         File file1 = new File("hello.txt");
     4 
     5         System.out.println(file1.getAbsolutePath());
     6         System.out.println(file1.getPath());
     7         System.out.println(file1.getName());
     8         System.out.println(file1.getParent());
     9         System.out.println(file1.length());
    10         System.out.println(new Date(file1.lastModified()));   //返回毫秒数
    11 
    12         System.out.println();
    13 
    14         File file2 = new File("D:\Java—Workspaceing\hi.txt");
    15 
    16         System.out.println(file2.getAbsolutePath());
    17         System.out.println(file2.getPath());
    18         System.out.println(file2.getName());
    19         System.out.println(file2.getParent());
    20         System.out.println(file2.length());
    21         System.out.println(file2.lastModified());
    22     }

        运行结果:

        

         Demo2:

     1     @Test
     2     public void test3(){
     3         File file = new File("D:\Java—Workspaceing");
     4 
     5         String[] list = file.list();
     6         for(String s : list){
     7             System.out.println(s);
     8         }
     9 
    10         System.out.println();
    11 
    12         File[] files = file.listFiles();
    13         for(File f : files){
    14             System.out.println(f);
    15         }
    16 
    17     }

      2、File 类的重命名功能

    public boolean renameTo(File dest):把文件重命名为指定的文件路径
    

        Demo:

    1     @Test
    2     public void test4(){
    3         File file1 = new File("hello.txt");
    4         File file2 = new File("D:\IO\hi.txt");
    5 
    6         boolean renameTo = file1.renameTo(file2);
    7         System.out.println(renameTo);
    8 
    9     }

        注意:要想保证返回 true,即修改成功,需要 file1 在硬盘中是存在的,且  file2 不能在硬盘中存在。

      3、File 类的判断功能

    public boolean isDirectory():判断是否是文件目录
    
    public boolean isFile() :判断是否是文件
    
    public boolean exists() :判断是否存在
    
    public boolean canRead() :判断是否可读
    
    public boolean canWrite() :判断是否可写
    
    public boolean isHidden() :判断是否隐藏
    

        Demo:

     1     @Test
     2     public void test5(){
     3         File file1 = new File("hello.txt");
     4         //file1 = new File("hello1.txt");
     5 
     6         System.out.println(file1.isDirectory());
     7         System.out.println(file1.isFile());
     8         System.out.println(file1.exists());
     9         System.out.println(file1.canRead());
    10         System.out.println(file1.canWrite());
    11         System.out.println(file1.isHidden());
    12 
    13         System.out.println();
    14 
    15         File file2 = new File("D:\Java—Workspaceing\IO");
    16         //file2 = new File("D:\Java—Workspaceing\IO1");
    17         System.out.println(file2.isDirectory());
    18         System.out.println(file2.isFile());
    19         System.out.println(file2.exists());
    20         System.out.println(file2.canRead());
    21         System.out.println(file2.canWrite());
    22         System.out.println(file2.isHidden());
    23 
    24     }

      4、File 类的创建功能

    public boolean createNewFile() : 创建文件。 若文件存在, 则不创建, 返回false
    
    public boolean mkdir() : 创建文件目录。 如果此文件目录存在, 就不创建了。如果此文件目录的上层目录不存在, 也不创建。
    
    public boolean mkdirs() : 创建文件目录。 如果上层文件目录不存在, 一并创建
    

        注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。

       Demo1:

     1     @Test
     2     public void test6() throws IOException {
     3         File file1 = new File("hi.txt");
     4         if(!file1.exists()){
     5             //文件的创建
     6             file1.createNewFile();
     7             System.out.println("创建成功");
     8         }else{//文件存在
     9             file1.delete();
    10             System.out.println("删除成功");
    11         }
    12     }

       Demo2:

     1     @Test
     2     public void test7(){
     3         //文件目录的创建
     4         File file1 = new File("D:\IO\IO1\IO3");
     5 
     6         boolean mkdir = file1.mkdir();
     7         if(mkdir){
     8             System.out.println("创建成功1");
     9         }
    10 
    11         File file2 = new File("D:\IO\IO1\IO4");
    12 
    13         boolean mkdir1 = file2.mkdirs();
    14         if(mkdir1){
    15             System.out.println("创建成功2");
    16         }
    17         
    18     }

        如果没有 IO3 的上级目录,则 file1 不会创建成功,而 file2 无论是否有上级目录,都会创建成功。

      5、File 类的删除功能

    public boolean delete(): 删除文件或者文件夹
    

        删除注意事项:

        (1)Java 中的删除不走回收站

        (2)要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。

        Demo :

    1     @Test
    2     public void test7() {
    3         File file = new File("D:\Java—Workspaceing\IO");
    4         //要想删除成功,io4文件目录下不能有子目录或文件
    5         System.out.println(file.delete());
    6     }

    六、案例

      1、断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称

        代码:

     1     @Test
     2     public void test1() {
     3         File srcFile = new File("D:\img");
     4 
     5         String[] fileNames = srcFile.list();
     6         for (String fileName : fileNames) {
     7             if (fileName.endsWith(".jpg")) {
     8                 System.out.println(fileName);
     9             }
    10         }
    11     }
    12 
    13 
    14     @Test
    15     public void test2() {
    16         File srcFile = new File("D:\img");
    17 
    18         File[] listFiles = srcFile.listFiles();
    19         for (File file : listFiles) {
    20             if (file.getName().endsWith(".jpg")) {
    21                 System.out.println(file.getAbsolutePath());
    22             }
    23         }
    24     }
    25 
    26 
    27     /**
    28      * File类提供了两个文件过滤器方法
    29      * public String[] list(FilenameFilter filter)
    30      * public File[] listFiles(FileFilter filter)
    31      */
    32     @Test
    33     public void test3() {
    34         File srcFile = new File("D:\img");
    35 
    36         File[] listFiles = srcFile.listFiles(new FilenameFilter() {
    37             @Override
    38             public boolean accept(File dir, String name) {
    39                 return name.endsWith(".jpg");
    40             }
    41         });
    42 
    43         for (File file : listFiles) {
    44             System.out.println(file.getAbsolutePath());
    45         }
    46     }

      2、遍历指定目录所有文件名称,包括子文件目录中的文件。

        代码:

     1     //打印目录下所有的文件
     2     public static void printSubFile(File dir) {
     3         File[] listFiles = dir.listFiles();
     4 
     5         for (File file : listFiles) {
     6             if (file.isDirectory()) {  //文件目录
     7                 printSubFile(file);
     8             } else {  //文件
     9                 System.out.println(file.getAbsolutePath());
    10             }
    11         }
    12     }
    13 
    14     //列出file目录的下级,如果它的下级还是目录,接着列出下级的下级,依次类推
    15     public static void listAllSubFiles(File file) {
    16         if (file.isFile()) {
    17             System.out.println(file.getAbsolutePath());
    18         } else {
    19             File[] listFiles = file.listFiles();
    20             // 如果all[i]是文件,直接打印
    21             // 如果all[i]是目录,接着再获取它的下一级
    22             for (File f : listFiles) {
    23                 listAllSubFiles(f);
    24             }
    25         }
    26     }

      3、求指定目录所在空间的大小(求任意一个目录的总大小)

        代码:

     1     public static long getDirectorySize(File file) {
     2         // file是文件,那么直接返回file.length()
     3         // file是目录,把它的下一级的所有大小加起来就是它的总大小
     4 
     5         long size = 0;
     6 
     7         if (file.isFile()) {
     8             size += file.length();
     9         } else {
    10             File[] listFiles = file.listFiles(); //获取file的下一级
    11 
    12             // 累加all[i]的大小
    13             for (File f : listFiles) {
    14                 size += getDirectorySize(f);
    15             }
    16         }
    17 
    18         return size;
    19     }

      4、删除指定文件目录及其下的所有文件

        代码:

     1     public static void deleteDirectory(File file) {
     2         // 如果file是文件,直接delete
     3         // 如果file是目录,先把它的下一级干掉,然后删除自己
     4         if (file.isDirectory()) {
     5             File[] listFiles = file.listFiles();
     6             //循环删除的是 file 的下一级
     7             for (File f : listFiles) {
     8                 deleteDirectory(f);
     9             }
    10         }
    11         //删除自己
    12         file.delete();
    13     }

      5、拷贝目录

     1 import java.io.File;
     2 import java.io.FileInputStream;
     3 import java.io.FileOutputStream;
     4 import java.io.IOException;
     5 
     6 public class FileUtils {
     7 
     8     //复制文件
     9     public static void copyFile(File src, File dest) throws IOException{
    10         if(!src.isFile()){
    11             throw new RuntimeException(src.getPath() + "不存在");
    12         }
    13         FileInputStream fis = new FileInputStream(src);
    14         FileOutputStream fos = new FileOutputStream(dest);
    15         
    16         byte[] data = new byte[1024];
    17         int len;
    18         while((len = fis.read(data))!=-1){
    19             fos.write(data, 0, len);
    20         }
    21         
    22         fos.close();
    23         fis.close();
    24     }
    25 
    26     //复制文件夹
    27     public static void copyDirectory(File srcDir,File destDir)throws IOException{
    28        //父目录不能拷贝到子目录中
    29         if(destDir.getAbsolutePath().contains(srcDir.getAbsolutePath())){
    30             throw new IOException("父目录不能拷贝到子目录中");
    31         }
    32         if(!destDir.isDirectory()){
    33             throw new IOException("目标对象不是目录");
    34         }
    35         File dest = new File(destDir,srcDir.getName());
    36         //如果srcDir是个文件,那么直接复制文件到destDir中
    37         if(srcDir.isFile()){
    38             copyFile(srcDir, dest);
    39         }else{
    40             dest.mkdirs();//先在destPath目录中创建srcDir对应的文件夹
    41             File[] list = srcDir.listFiles();//准备复制srcDir的子目录或子文件
    42             for(File f: list){
    43                 copyDirectory(f,dest);
    44             }
    45         }
    46     }
    47 }

      6、剪切目录

     1     //剪切文件夹
     2     public static void cutDirectory(File srcDir,File destDir)throws IOException{
     3         if(destDir.getAbsolutePath().contains(srcDir.getAbsolutePath())){
     4             throw new IOException("父目录不能剪切到子目录中");
     5         }
     6         if(!destDir.isDirectory()){
     7             throw new IOException("目标对象不是目录");
     8         }
     9         File dest = new File(destDir,srcDir.getName());
    10         if(srcDir.isFile()){
    11             copyFile(srcDir, dest);
    12         }else{
    13             dest.mkdirs();
    14             File[] list = srcDir.listFiles();
    15             for(File f: list){
    16                 cutDirectory(f,dest);
    17             }
    18         }
    19         srcDir.delete();
    20     }

    七、File 总结

  • 相关阅读:
    OPENGL_三角形带GL_TRIANGLE_STRIP详解
    OPENGL_单位长度对应屏幕像素
    OPENGL2_基本框架
    WINDOWS编程基础-最简单的windows程序
    着色语言(Shader Language)
    Ogre 学习记录
    Ogre RT Shader System
    Perception Neuron系统,让动作捕捉技术不再高冷
    Ogre 中基于蒙皮骨骼的OBB碰撞检测
    Ogre 绘制基本图形
  • 原文地址:https://www.cnblogs.com/niujifei/p/14825211.html
Copyright © 2011-2022 走看看