Java IO教程之Java 文件一口气讲完!( *︾▽︾)

Java 文件

Java IO教程 - Java文件

File类的对象是文件或目录的路径名的抽象表示。

创建文件

我们可以从中创建一个File对象

  • 路径名
  • 父路径名和子路径名
  • URI(统一资源标识符)

我们可以使用File类的以下构造函数之一创建一个文件:

复制代码
File(String pathname)
File(File parent, String child)
File(String parent, String child)
File(URI uri)

如果我们有一个文件路径名字符串test.txt,我们可以创建一个抽象路径名作为下面的代码。

复制代码
File dummyFile = new File("test.txt");

名为test.txt的文件不必存在,以使用此语句创建File对象。

dummyFile对象表示抽象路径名,它可能指向或可能不指向文件系统中的真实文件。

File类有几个方法来处理文件和目录。

使用File对象,我们可以创建新文件,删除现有文件,重命名文件,更改文件的权限等。

File类中的isFile()和isDirectory()告诉File对象是否表示文件或目录。

当前工作目录

JVM的当前工作目录是根据我们如何运行java命令来设置的。

我们可以通过读取user.dir系统属性来获取JVM的当前工作目录,如下所示:

复制代码
String  workingDir = System.getProperty("user.dir");

使用System.setProperty()方法更改当前工作目录。

复制代码
System.setProperty("user.dir", "C:\\myDir");

要在Windows上指定C:\\ test作为user.dir系统属性值,我们运行如下所示的程序:

复制代码
java -Duser.dir=C:\test your-java-class

文件的存在

我们可以使用File类的exists()方法检查File对象的抽象路径名是否存在。

复制代码
boolean fileExists = dummyFile.exists();

完整源代码

复制代码
import java.io.File;

public class Main {
  public static void main(String[] argv) {
    // Create a File object
    File dummyFile = new File("dummy.txt");

    // Check for the file"s existence
    boolean fileExists = dummyFile.exists();
    if (fileExists) {
      System.out.println("The dummy.txt  file exists.");
    } else {

      System.out.println("The dummy.txt  file does  not  exist.");
    }

  }
}

上面的代码生成以下结果。

路径

绝对路径在文件系统上唯一标识文件。规范路径是唯一标识文件系统上文件的最简单路径。

我们可以使用getAbsolutePath()和getCanonicalPath()方法来分别获得由File对象表示的绝对路径和规范路径。

复制代码
import java.io.File;
import java.io.IOException;

public class Main {
  public static void main(String[] args) {
    printFilePath("dummy.txt");
    printFilePath(".." + File.separator + "notes.txt");
  }

  public static void printFilePath(String pathname) {
    File f = new File(pathname);
    System.out.println("File  Name: " + f.getName());
    System.out.println("File  exists: " + f.exists());
    System.out.println("Absolute Path: " + f.getAbsolutePath());

    try {
      System.out.println("Canonical Path: " + f.getCanonicalPath());
    }

    catch (IOException e) {
      e.printStackTrace();
    }
  }
}

上面的代码生成以下结果。

文件分隔符

不同的操作系统使用不同的字符来分隔路径名中的两个部分。

例如,Windows在路径名中使用反斜杠(\)作为名称分隔符,而UNIX使用正斜杠(/)。

File类定义了一个名为分隔符Char的常量,它是系统相关的名称分隔符。

我们可以使用File.separator Char常量来获取名称分隔符作为字符。

File.separator 常量将我们的名称分隔符作为String。

在程序中使用名称分隔符将使您的Java代码在不同的平台上工作。

Java 文件操作

Java IO教程 - Java文件操作

文件创建

我们可以使用File类的createNewFile()方法创建一个新文件:

复制代码
File dummyFile = new File("test.txt");
boolean fileCreated  = dummyFile.createNewFile();

该createNewFile()方法创建一个新的空文件,如果有指定名称的文件不存在。

如果文件已成功创建,则返回true;否则,返回false。如果发生I/O错误,该方法将抛出IOException。

我们还可以在默认的临时文件目录或目录中创建一个临时文件。要在默认临时目录中创建临时文件,请使用File类的createTempFile()静态方法,该方法接受前缀和后缀以生成临时文件名。

复制代码
File  tempFile = File.createTempFile("abc", ".txt");

文件夹创建

我们可以使用mkdir()或mkdirs()方法创建一个新目录。

仅当路径名中指定的父目录已存在时,mkdir()方法才创建目录。

复制代码
File newDir  = new File("C:\\users\\home");

只有当C:\users目录已经存在时,newDir.mkdir()方法才会创建主目录。

newDir.mkdirs()方法将创建users目录(如果它不存在于C:驱动器中),它将在C:\users目录下创建主目录。

文件删除

我们需要使用File类的delete()方法来删除文件/目录。

目录必须为空,我们才能删除它。

如果文件/目录被删除,该方法返回true; 否则,返回false。

我们还可以延迟删除文件,直到JVM通过使用deleteOnExit()方法终止。

如果我们在程序中创建临时文件,当程序退出时要删除,这将非常有用。

立即删除dummy.txt文件

复制代码
File dummyFile = new File("dummy.txt"); 
dummyFile.delete();

在JVM终止时删除dummy.txt文件

复制代码
File dummyFile = new File("dummy.txt"); 
dummyFile.deleteOnExit();

文件重命名

要重命名文件,我们可以使用renameTo()方法,它使用一个File对象来表示新文件:

复制代码
boolean fileRenamed = oldFile.renameTo(newFile);

完整的源代码

复制代码
import java.io.File;

public class Main {
  public static void main(String[] argv) {
    // Rename old-dummy.txt to new_dummy.txt
    File oldFile = new File("old_dummy.txt");
    File newFile = new File("new_dummy.txt");

    boolean fileRenamed = oldFile.renameTo(newFile);
    if (fileRenamed) {
      System.out.println(oldFile + "  renamed  to " + newFile);
    } else {
      System.out.println("Renaming " + oldFile + "  to " + newFile
          + "  failed.");
    }

  }
}

如果文件的重命名成功,renameTo()方法返回true;否则,返回false。

我们需要检查返回值,以确保重命名成功。

上面的代码生成以下结果。

例子

File对象是不可变的。创建后,它始终表示相同的路径名。当我们重命名文件时,旧的File对象仍然代表原始的路径名。

File对象表示路径名,而不是文件系统中的实际文件。

以下代码显示了如何进行文件创建,删除和重命名。

复制代码
import java.io.File;

public class Main {
  public static void main(String[] args) throws Exception {
    File newFile = new File("my_new_file.txt");
    printFileDetails(newFile);

    // Create a new file
    boolean fileCreated = newFile.createNewFile();
    if (!fileCreated) {
      System.out.println(newFile + "  could   not  be  created.");
    }
    printFileDetails(newFile);

    // Delete the new file
    newFile.delete();

    System.out.println("After deleting the new file:");
    printFileDetails(newFile);

    // recreate the file
    newFile.createNewFile();

    printFileDetails(newFile);

    // Let"s tell the JVM to delete this file on exit
    newFile.deleteOnExit();

    System.out.println("After  using deleteOnExit() method:");
    printFileDetails(newFile);

    // Create a new file and rename it
    File firstFile = new File("my_first_file.txt");
    File secondFile = new File("my_second_file.txt");

    fileCreated = firstFile.createNewFile();
    if (fileCreated || firstFile.exists()) {
      printFileDetails(firstFile);
      printFileDetails(secondFile);

      boolean renamedFlag = firstFile.renameTo(secondFile);
      if (!renamedFlag) {
        System.out.println("Could not  rename  " + firstFile);
      }
      printFileDetails(firstFile);
      printFileDetails(secondFile);
    }
  }
  public static void printFileDetails(File f) {
    System.out.println("Absolute Path: " + f.getAbsoluteFile());
    System.out.println("File exists:  " + f.exists());
  }
}

上面的代码生成以下结果。

文件属性

File类包含让我们获取/设置文件和目录的属性的方法。

我们可以设置分别使用setReadOnly(),setReadable(),setWritable()和setExecutable()方法将文件设置为只读,可读,可写和可执行。

我们可以使用lastModified()和setLastModified()方法来获取和设置文件的最后修改日期和时间。

我们可以使用isHidden()方法检查文件是否被隐藏。

文件大小

我们可以使用File类的length()方法获取文件的大小(以字节为单位)。

复制代码
File myFile  = new File("myfile.txt");
long  fileLength = myFile.length();

如果File对象表示不存在的文件,则length()方法返回零。

length()方法的返回类型是long,而不是int。

列出文件和目录

我们可以使用File类的listRoots()静态方法获取文件系统中可用根目录的列表。 它返回一个File对象数组。

复制代码
File[] roots = File.listRoots();

以下代码显示如何列出所有可用的根目录。

复制代码
import java.io.File;

public class Main {
  public static void main(String[] args) {
    File[] roots = File.listRoots();
    System.out.println("List  of  root directories:");
    for (File f : roots) {
      System.out.println(f.getPath());
    }
  }
}

我们可以使用File类的list()或listFiles()方法列出目录中的所有文件和目录。

list()方法返回一个String数组,而listFiles()方法返回一个File数组。

我们还可以使用这些方法的文件过滤器从返回的结果中排除一些文件和目录。

以下代码显示如何列出目录中的所有文件和目录。

复制代码
import java.io.File;

public class Main {
  public static void main(String[] args) {
    // Change the dirPath value to list files from your directory
    String dirPath = "C:\\";

    File dir = new File(dirPath);
    File[] list = dir.listFiles();

    for (File f : list) {
      if (f.isFile()) {
        System.out.println(f.getPath() + "  (File)");
      } else if (f.isDirectory()) {
        System.out.println(f.getPath() + "  (Directory)");
      }
    }
  }
}

上面的代码生成以下结果。

文件过滤器

要从列表中排除扩展名为.SYS的所有文件,我们可以使用由功能接口FileFilter的实例表示的文件过滤器来实现。

它包含一个accept()方法,它将File作为参数列出,如果应该列出文件,则返回true。返回false不会列出文件。

以下代码创建一个文件过滤器,将过滤扩展名为.SYS的文件。

复制代码
FileFilter filter = file ->  {
    if (file.isFile()) {
        String fileName   = file.getName().toLowerCase();
        if (fileName.endsWith(".sys"))  {
            return false;
        }
    }
    return true;
};

以下代码创建两个文件过滤器 - 一个仅过滤文件,另一个仅过滤目录:

复制代码
// Filters only  files
FileFilter fileOnlyFilter = File::isFile;

// Filters only  directories
FileFilter  dirOnlyFilter = File::isDirectory;

以下代码显示如何使用FileFilter过滤文件。

复制代码
import java.io.File;
import java.io.FileFilter;

public class Main {
  public static void main(String[] args) {
    String dirPath = "C:\\";
    File dir = new File(dirPath);

    // Create a file filter to exclude any .SYS file
    FileFilter filter = file -> {
      if (file.isFile()) {
        String fileName = file.getName().toLowerCase();
        if (fileName.endsWith(".sys")) {
          return false;
        }
      }
      return true;
    };

    File[] list = dir.listFiles(filter);

    for (File f : list) {
      if (f.isFile()) {
        System.out.println(f.getPath() + "  (File)");
      } else if (f.isDirectory()) {
        System.out.println(f.getPath() + "  (Directory)");
      }
    }
  }
}

上面的代码生成以下结果。

相关推荐
##学无止境##2 分钟前
从青铜到王者:Java设计模式——代理模式
java·设计模式·代理模式
pengzhuofan3 分钟前
Java设计模式-适配器模式
java·设计模式·适配器模式
越来越无动于衷5 分钟前
代理模式深度解析:从静态代理到 Spring AOP 实现
java·spring·代理模式
Meteors.6 分钟前
23种设计模式——适配器模式(Adapter)详解
java·设计模式·适配器模式
喂完待续17 分钟前
【序列晋升】12 Spring Boot 约定优于配置
java·spring boot·spring·架构·约定大于配置·序列晋升·tech arch
PAK向日葵44 分钟前
【算法导论】MT 0823笔试题题解
算法·面试
知秋丶1 小时前
大模型应用发展与Agent前沿技术趋势(下)
人工智能·python·ai agent
Yolo566Q1 小时前
“R语言+遥感”的水环境综合评价方法实践技术应用
开发语言·r语言
智驱力人工智能1 小时前
安全帽检测算法如何提升工地安全管理效率
人工智能·算法·安全·边缘计算·安全帽检测·口罩检测·安全鞋检测
2401_837088501 小时前
ref 简单讲解
前端·javascript·vue.js