“嗨,阿米戈。好久不见。”

“嗨,Bilaabo。你要谈什么?”

“今天我要给大家讲讲文件操作。Java 有一个特殊的类(File),可以用来管理硬盘上的文件。对于管理文件内容,还有其他类:FileInputStream、FileOutputStream 等。 “

文件,文件,路径 - 1

“有趣。但是当你说‘管理文件’时,你是什么意思?”

“这正是我现在要解释的。文件可以创建、删除、重命名等等。您可以将 File 对象传递给几乎每个处理(读取、写入、更改)文件内容的类。 例如:”

您可以将文件名直接传递给 FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
或者可以单独创建一个File对象,然后传给FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

“但是第二个选项更长。我还是不明白为什么我们需要这些文件对象。”

“对于这个具体的例子,你是对的。”这不是你必须如何做的例子,而是你可以如何做的例子。
但是想象一下,您需要显示位于特定目录中的所有文件的列表。以下是如何使用 File 对象完成此操作:"

代码
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

“ listFiles()是一种返回由 «c:/path/» 指示的文件夹中的文件列表的方法吗?”

“是啊,不过程序员一般都说‘目录’,‘文件夹’这个词是最近才用的,不过原则上这两个词都是对的,你说哪个都行。”

“好的。那么getName ()是做什么的呢?返回文件名?文件名中到底包含什么?是包含路径的全名,还是文件本身的名称?”

“只有文件本身的名称。对于完整路径,有 file.getAbsolutePath()。”

“那么 File 类还有哪些其他方法?”

“看看这个:”

方法 描述
boolean isDirectory() File 对象是一个目录吗?
boolean isFile() 对象是文件吗?
long length() 以字节为单位返回文件大小/长度。
boolean createNewFile() 如果具有此名称的文件尚不存在,则创建一个新的空文件。
boolean mkdir() 创建一个目录。名称 «mkdir» 来自 «make directory»。
boolean mkdirs() 创建目录及其所有子目录。
boolean delete() 删除与对象关联的文件。如果对象是目录,则仅当目录中没有文件时才删除该目录。
void deleteOnExit() 将文件添加到一个特殊的文件列表中,该列表将在程序退出时自动删除。
File createTempFile(
String prefix,
String suffix,
File directory)
使用随机生成的唯一名称创建一个临时文件,类似于 «dasd4d53sd»。
附加参数是名称前缀和后缀。如果未指定目录,则会在临时文件的特殊操作系统目录中创建该文件。
boolean exists() 如果硬盘驱动器上存在同名文件,则返回真。
String getAbsolutePath() 返回文件及其所有子目录的完整路径。
String getCanonicalPath() 返回规范文件路径。
例如,将路径 «c:/dir/dir2/../a.txt» 转换为 «c:/dir/a.txt»
String[] list() 返回当前对象表示的目录中包含的文件名数组。
File[] listFiles() 返回包含在当前 File 对象表示的目录中的文件数组。
long getTotalSpace() 返回文件所在磁盘上的总空间量(字节数)。
long getFreeSpace() 返回文件所在磁盘上的可用空间量(字节数)。
boolean renameTo(File) 重命名文件,即文件的内容实际上得到一个新名称。换句话说,您可以将文件 «c:/dir/a.txt» 重命名为 «d:/out/text/b.doc»。
String getName() 只返回没有路径的文件名。
String getParent() 仅返回当前文件的路径(目录),不返回名称本身。
Path toPath() 返回对应于当前 File 对象的 Path 对象。

“哇!不是一个非常小的列表,是吧?而且你似乎可以用它做很多事情:创建和删除文件,重命名它们,......”

“所以要获取当前文件的目录,我需要调用getParent()?”

“是的,但它返回一个字符串——文件路径——而不是一个 File 对象。实际上,File 类几乎复制了它的所有方法:一个版本返回一个字符串,另一个——一个 File 对象。检查一下:”

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

如果您有一个带有文件路径的 String 并且您需要一个File对象,则使用构造函数。如果情况相反(你有一个File对象但你需要一个 String),那么使用getAbsolutePath ()。例如:”

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

“知道了。”

“太好了。那么给你一个小任务:显示与当前文件位于同一目录下的所有文件的名称。”

“没有比这更容易的了。看,看:”

代码
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

“嗯。没错。”

“但有点令人困惑的是,同一个类——文件——同时用于文件和目录。这对我来说似乎不太合逻辑。”

“由于历史原因,它是这样解决的。目录曾经是磁盘上一个特殊的‘空’文件。当然,现在发生了很多变化,但不是全部。这就是我今天所拥有的。”

“感谢有趣的课程,Bilaabo。”