java io系列08之 File总结

简介: 本文对File的API和常用方法进行介绍。 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_08.html File 介绍 File 是“文件”和“目录路径名”的抽象表示形式。


本文对File的API和常用方法进行介绍。

转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_08.html

File 介绍

File 是“文件”和“目录路径名”的抽象表示形式。
File 直接继承于Object,实现了Serializable接口和Comparable接口。实现Serializable接口,意味着File对象支持序 列化操作。而实现Comparable接口,意味着File对象之间可以比较大小;File能直接被存储在有序集合(如TreeSet、TreeMap 中)。


File 函数列表

复制代码
// 静态成员
public static final String     pathSeparator        // 路径分割符":" public static final char pathSeparatorChar // 路径分割符':' public static final String separator // 分隔符"/" public static final char separatorChar // 分隔符'/' // 构造函数 File(File dir, String name) File(String path) File(String dirPath, String name) File(URI uri) // 成员函数 boolean canExecute() // 测试应用程序是否可以执行此抽象路径名表示的文件。 boolean canRead() // 测试应用程序是否可以读取此抽象路径名表示的文件。 boolean canWrite() // 测试应用程序是否可以修改此抽象路径名表示的文件。 int compareTo(File pathname) // 按字母顺序比较两个抽象路径名。 boolean createNewFile() // 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 static File createTempFile(String prefix, String suffix) // 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 static File createTempFile(String prefix, String suffix, File directory) // 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 boolean delete() // 删除此抽象路径名表示的文件或目录。 void deleteOnExit() // 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 boolean equals(Object obj) // 测试此抽象路径名与给定对象是否相等。 boolean exists() // 测试此抽象路径名表示的文件或目录是否存在。 File getAbsoluteFile() // 返回此抽象路径名的绝对路径名形式。 String getAbsolutePath() // 返回此抽象路径名的绝对路径名字符串。 File getCanonicalFile() // 返回此抽象路径名的规范形式。 String getCanonicalPath() // 返回此抽象路径名的规范路径名字符串。 long getFreeSpace() // 返回此抽象路径名指定的分区中未分配的字节数。 String getName() // 返回由此抽象路径名表示的文件或目录的名称。 String getParent() // 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 File getParentFile() // 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 String getPath() // 将此抽象路径名转换为一个路径名字符串。 long getTotalSpace() // 返回此抽象路径名指定的分区大小。 long getUsableSpace() // 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。 int hashCode() // 计算此抽象路径名的哈希码。 boolean isAbsolute() // 测试此抽象路径名是否为绝对路径名。 boolean isDirectory() // 测试此抽象路径名表示的文件是否是一个目录。 boolean isFile() // 测试此抽象路径名表示的文件是否是一个标准文件。 boolean isHidden() // 测试此抽象路径名指定的文件是否是一个隐藏文件。 long lastModified() // 返回此抽象路径名表示的文件最后一次被修改的时间。 long length() // 返回由此抽象路径名表示的文件的长度。 String[] list() // 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 String[] list(FilenameFilter filter) // 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 File[] listFiles() // 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 File[] listFiles(FileFilter filter) // 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 File[] listFiles(FilenameFilter filter) // 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 static File[] listRoots() // 列出可用的文件系统根。 boolean mkdir() // 创建此抽象路径名指定的目录。 boolean mkdirs() // 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 boolean renameTo(File dest) // 重新命名此抽象路径名表示的文件。 boolean setExecutable(boolean executable) // 设置此抽象路径名所有者执行权限的一个便捷方法。 boolean setExecutable(boolean executable, boolean ownerOnly) // 设置此抽象路径名的所有者或所有用户的执行权限。 boolean setLastModified(long time) // 设置此抽象路径名指定的文件或目录的最后一次修改时间。 boolean setReadable(boolean readable) // 设置此抽象路径名所有者读权限的一个便捷方法。 boolean setReadable(boolean readable, boolean ownerOnly) // 设置此抽象路径名的所有者或所有用户的读权限。 boolean setReadOnly() // 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。 boolean setWritable(boolean writable) // 设置此抽象路径名所有者写权限的一个便捷方法。 boolean setWritable(boolean writable, boolean ownerOnly) // 设置此抽象路径名的所有者或所有用户的写权限。 String toString() // 返回此抽象路径名的路径名字符串。 URI toURI() // 构造一个表示此抽象路径名的 file: URI。 URL toURL() // 已过时。 此方法不会自动转义 URL 中的非法字符。建议新的代码使用以下方式将抽象路径名转换为 URL:首先通过 toURI 方法将其转换为 URI,然后通过 URI.toURL 方法将 URI 装换为 URL。
复制代码

 

1. 新建目录的常用方法

方法1:根据相对路径新建目录。

示例代码如下(在当前路径下新建目录“dir”):

File dir = new File("dir");
dir.mkdir();

方法2:根据绝对路径新建目录。

示例代码如下(新建目录“/home/skywang/dir”):

File dir = new File("/home/skywang/dir");
dir.mkdirs();

说明:上面是在linux系统下新建目录“/home/skywang/dir”的源码。在windows下面,若要新建目录“D:/dir”,源码如下:

File dir = new File("D:/dir");
dir.mkdir();

方法3

URI uri = new URI("file:/home/skywang/dir"); 
File dir = new File(uri);
sub.mkdir();

说明: 和“方法2”类似,只不过“方法2”中传入的是完整路径,而“方法3”中传入的是完整路径对应URI。


2. 新建子目录的几种常用方法

例如,我们想要在当前目录的子目录“dir”下,再新建一个子目录。有一下几种方法:

方法1

File sub1 = new File("dir", "sub1");
sub1.mkdir();

说明:上面的方法作用是,在当前目录下 "dir/sub1"。它能正常运行的前提是“sub1”的父目录“dir”已经存在!

方法2

File sub2 = new File(dir, "sub2");
sub2.mkdir();

说明:上面的方法作用是,在当前目录下 "dir/sub2"。它能正常运行的前提是“sub2”的父目录“dir”已经存在!

方法3

File sub3 = new File("dir/sub3");
sub3.mkdirs();

说明:上面的方法作用是,在当前目录下 "dir/sub3"。它不需要dir已经存在,也能正常运行;若“sub3”的父母路不存在,mkdirs()方法会自动创建父目录。

方法4

File sub4 = new File("/home/skywang/dir/sub4");
sub4.mkdirs();

说明:上面的方法作用是,新建目录"/home/skywang/dir/sub3"。它不需要dir已经存在,也能正常运行;若“sub4”的父母路不存在,mkdirs()方法会自动创建父目录。

方法5

URI uri = new URI("file:/home/skywang/dir/sub5"); 
File sub5 = new File(uri);
sub5.mkdirs();

说明: 和“方法4”类似,只不过“方法4”中传入的是完整路径,而“方法5”中传入的是完整路径对应URI。

 

3. 新建文件的几种常用方法

例如,我们想要在当前目录的子目录“dir”下,新建一个文件。有一下几种方法

方法1

复制代码
try {
    File dir = new File("dir");    // 获取目录“dir”对应的File对象
    File file1 = new File(dir, "file1.txt"); file1.createNewFile(); } catch (IOException e) { e.printStackTrace(); }
复制代码

说明:上面代码作用是,在“dir”目录(相对路径)下新建文件“file1.txt”。

方法2

try {
    File file2 = new File("dir", "file2.txt");
    file2.createNewFile();
} catch (IOException e) { e.printStackTrace(); }

说明:上面代码作用是,在“dir”目录(相对路径)下新建文件“file2.txt”。

方法3

try {
    File file3 = new File("/home/skywang/dir/file3.txt");
    file3.createNewFile();
} catch (IOException e) { e.printStackTrace(); }

说明:上面代码作用是,下新建文件“/home/skywang/dir/file3.txt”(绝对路径)。这是在linux下根据绝对路径的方法,在windows下可以通过以下代码新建文件"D:/dir/file4.txt"。

try {
    File file3 = new File("D:/dir/file4.txt");
    file3.createNewFile();
} catch (IOException e) { e.printStackTrace(); }

方法4

复制代码
try {
    URI uri = new URI("file:/home/skywang/dir/file4.txt"); 
    File file4 = new File(uri); file4.createNewFile(); } catch (IOException e) { e.printStackTrace(); }
复制代码

说明
和“方法3”类似,只不过“方法3”中传入的是完整路径,而“方法4”中传入的是完整路径对应URI。

File API使用示例

关于File中API的详细用法,参考示例代码(FileTest.java):

复制代码
  1 import java.io.File;
  2 import java.io.IOException;  3 import java.net.URI;  4 import java.util.Calendar;  5 import java.text.SimpleDateFormat;  6  7 public class FileTest {  8  9 public static void main(String[] args) {  10  testFileStaticFields() ;  11  testFileDirAPIS() ;  12  }  13  14 public static void testFileStaticFields() {  15 // 打印 路径分隔符":"  16 System.out.printf("File.pathSeparator=\"%s\"\n", File.pathSeparator);  17 // 打印 路径分隔符':'  18 System.out.printf("File.pathSeparatorChar=\"%c\"\n", File.pathSeparatorChar);  19 // 打印 分隔符"/"  20 System.out.printf("File.separator=\"%s\"\n", File.separator);  21 // 打印 分隔符'/'  22 System.out.printf("File.separatorChar=\"%c\"\n", File.separatorChar);  23  }  24  25 public static void testFileDirAPIS() {  26 try {  27 // 新建目录 "dir"  28 File dir = new File("dir");  29  dir.mkdir();  30  31 // 方法1:新建目录 "dir/sub1"。父目录“dir”必须已经存在!  32 File sub1 = new File("dir", "sub1");  33  sub1.mkdir();  34 // 方法2:新建目录 "dir/sub2"。父目录“dir”必须已经存在!  35 File sub2 = new File(dir, "sub2");  36  sub2.mkdir();  37 // 方法3:新建目录 "dir/sub3"。mkdirs()会自动创建不存在的父目录。  38 File sub3 = new File("dir/sub3");  39  sub3.mkdirs();  40 // 方法4:新建目录 "dir/sub4"。根据“绝对路径”创建,前面3个方法都是根据“相对路径”创建。  41 String dirPath = dir.getAbsolutePath(); // 获取“dir”的绝对路径  42 String sub4AbsPath = dirPath + File.separator + "sub4"; // File.separator是分隔符"/"  43 File sub4 = new File(sub4AbsPath);  44  sub4.mkdirs();  45 // 方法5:新建目录 "dir/sub5"。根据uri  46 String uri_sub5_path = "file:"+ dirPath + File.separator + "sub5";  47 URI uri_sub5 = new URI(uri_sub5_path);  48 File sub5 = new File(uri_sub5);  49  sub5.mkdirs();  50  51 // 方法1:新建文件 "dir/l1_normal.txt"  52 File l1_normal = new File(dir, "l1_normal.txt");  53  l1_normal.createNewFile();  54 // 方法2:新建文件 "dir/.l1_hide.txt"。  55 File l1_hide = new File("dir", ".l1_hide.txt"); // 在linux中, "."开头的文件是隐藏文件。  56  l1_hide.createNewFile();  57 // 方法3:新建文件 "dir/l1_abs.txt"。  58 String dirAbsPah = dir.getAbsolutePath(); // 获取dir的绝对路径  59 String l1_abs_path = dirAbsPah+File.separator+"l1_abs.txt";  60 File l1_abs = new File(l1_abs_path);  61  l1_abs.createNewFile();  62 //System.out.printf("l1_abs_path=%s\n", l1_abs_path);  63 //System.out.printf("l1_abs path=%s\n", l1_abs.getAbsolutePath());  64 // 方法4:新建文件 "dir/l1_uri.txt"。根据URI新建文件  65 String uri_path = "file:"+ dirAbsPah + File.separator + "l1_uri.txt";  66 URI uri_l1 = new URI(uri_path);  67 //System.out.printf("uri_l1=%s\n", l1_abs.getAbsolutePath());  68 File l1_uri = new File(uri_l1);  69  l1_uri.createNewFile();  70  71 // 新建文件 "dir/sub/s1_normal"  72 File s1_normal = new File(sub1, "s1_normal.txt");  73  s1_normal.createNewFile();  74  75 System.out.printf("%30s = %s\n", "s1_normal.exists()", s1_normal.exists());  76 System.out.printf("%30s = %s\n", "s1_normal.getName()", s1_normal.getName());  77 System.out.printf("%30s = %s\n", "s1_normal.getParent()", s1_normal.getParent()); 78 System.out.printf("%30s = %s\n", "s1_normal.getPath()", s1_normal.getPath()); 79 System.out.printf("%30s = %s\n", "s1_normal.getAbsolutePath()", s1_normal.getAbsolutePath()); 80 System.out.printf("%30s = %s\n", "s1_normal.getCanonicalPath()", s1_normal.getCanonicalPath()); 81 System.out.printf("%30s = %s is \"%s\"\n", "s1_normal.lastModified()", s1_normal.lastModified(), getModifyTime(s1_normal.lastModified())); 82 System.out.printf("%30s = %s\n", "s1_normal.toURI()", s1_normal.toURI()); 83 84 85 // 列出“dir”目录下的“文件”和“文件夹”。 86 // 注意:dir.listFiles()只会遍历目录dir,而不会遍历dir的子目录! 87 System.out.println("---- list files and folders ----"); 88 File[] fs = dir.listFiles(); 89 for (File f:fs) { 90 String fname = f.getName(); 91 String absStr = f.isAbsolute() ? "[Absolute]" : ""; 92 String hidStr = f.isHidden() ? "[Hidden]" : ""; 93 String dirStr = f.isDirectory() ? "[Directory]" : ""; 94 String fileStr = f.isFile() ? "[File]" : ""; 95 96 System.out.printf("%-30s %s%s%s%s\n", fname, fileStr, dirStr, absStr, hidStr); 97 } 98 99 } catch (Exception e) { 100 e.printStackTrace(); 101 } 102 } 103 104 private static String getModifyTime(long millis) { 105 // 获取Calendar对象 106 Calendar cal = Calendar.getInstance(); 107 // 设置时间为 millis 108 cal.setTimeInMillis(millis); 109 // 获取格式化对象,它会按照"yyyy-MM-dd HH:mm:ss"格式化日期 110 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 111 //System.out.printf("TIME %s\n", str); 112 return sdf.format(cal.getTime()); 113 } 114 115 }
复制代码

运行结果(在ubuntu 12.04系统下的运行结果,而不是windows!):

复制代码
File.pathSeparator=":"
File.pathSeparatorChar=":"
File.separator="/"
File.separatorChar="/"
            s1_normal.exists() = true
           s1_normal.getName() = s1_normal.txt
         s1_normal.getParent() = dir/sub1
           s1_normal.getPath() = dir/sub1/s1_normal.txt
   s1_normal.getAbsolutePath() = /home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt
  s1_normal.getCanonicalPath() = /home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt
      s1_normal.lastModified() = 1381730064000 is "2013-10-14 13:54:24"
             s1_normal.toURI() = file:/home/skywang/wind_talker/workout/java/skywang/io/io/src/file/dir/sub1/s1_normal.txt
---- list files and folders ----
l1_uri.txt                      [File]
sub1                            [Directory]
l1_abs.txt                      [File]
sub5                            [Directory]
sub4                            [Directory]
.l1_hide.txt                    [File][Hidden]
sub3                            [Directory]
sub2                            [Directory]
l1_normal.txt                   [File]
复制代码

结果说明:运行程序,会在源文件所在的目录新建目录"dir"及其子目录和子文件。如下图:

相关文章
|
21天前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
40 9
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
88 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
Java 编译器 Maven
Java“class file contains wrong class”解决
当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
59 3
|
3月前
|
Java
缓冲流和转换流的使用【 File类+IO流知识回顾③】
这篇文章介绍了Java中缓冲流(BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter)和转换流(InputStreamReader, OutputStreamWriter)的使用,包括它们的构造方法和如何利用它们提高IO操作的效率及处理字符编码问题。
缓冲流和转换流的使用【 File类+IO流知识回顾③】
|
3月前
|
存储 Java 调度
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
这篇文章回顾了Java中FileInputStream、FileOutputStream、FileReader和FileWriter类的基本使用方法,包括读取和写入文件的操作,以及字符流和字节流的区别和应用场景。
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
|
3月前
|
Java
File类的基本使用【 File类+IO流知识回顾①】
这篇文章回顾了Java中File类的基本使用,包括创建File对象、获取文件数据信息、判断文件存在与否、创建和删除文件目录,以及遍历文件目录的方法。
File类的基本使用【 File类+IO流知识回顾①】
|
3月前
|
存储 Java
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
这篇文章介绍了Java中ObjectInputStream和ObjectOutputStream类的基本使用,这两个类用于实现对象的序列化和反序列化。文章解释了序列化的概念、如何通过实现Serializable接口来实现序列化,以及如何使用transient关键字标记不需要序列化的属性。接着,通过示例代码演示了如何使用ObjectOutputStream进行对象的序列化和ObjectInputStream进行反序列化。
序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
39 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
97 1