1.什么是流?
在Java编程中,I/O(输入输出)是至关重要的一个方面,涉及到文件操作、数据流处理等。File类是Java中用于表示文件和目录路径的类,提供了一系列方法来操作文件系统。本章将重点介绍File类的基本用法和常见操作。
在Java编程中,流(Stream)是一种用于在程序中输入和输出数据的抽象概念。流可以看作是数据在程序中的传输通道,用于在程序中读取输入数据和将数据写出到输出目的地。流可以与各种数据源和目的地进行交互,如文件、网络连接、内存等。
流在Java中分为输入流(Input Stream)和输出流(Output Stream)两种类型,分别用于从数据源读取数据和向数据目的地写入数据。流可以是字节流(Byte Stream)或字符流(Character Stream)。
- 字节流(Byte Stream):以字节为单位进行数据传输,适用于处理二进制文件或非文本数据。
- 字符流(Character Stream):以字符为单位进行数据传输,适用于处理文本文件或包含文本的数据。
流的基本特点包括:
- 顺序性:数据按照流的顺序依次传输,保持数据的顺序性。
- 单向性:输入流用于读取数据,输出流用于写入数据,不能同时读写。
- 实时性:数据通过流即时传输,不需要整个数据都加载到内存中。
- 自动关闭:在使用完流之后,通常需要手动关闭流来释放资源。
在Java中,流是通过Java I/O库提供的类和接口来实现的。常见的流包括InputStream、OutputStream、Reader、Writer等。通过使用流,可以实现文件读写、网络通信、数据处理等功能。
2.本章知识点关系图
3.File类简介:
3.1 File类的作用和特点。
File类是Java中用于表示文件和目录路径的类,它提供了一种抽象的方式来操作文件系统中的文件和目录。File类的主要作用和特点包括:
表示文件和目录:File类可以用来表示文件和目录的路径,可以操作文件系统中的文件和目录。
创建、删除文件和目录:File类提供了方法来创建新文件或目录,以及删除现有的文件或目录。
获取文件属性:通过File类可以获取文件的各种属性,如文件名、路径、大小、修改时间等信息。
文件重命名和移动:File类提供了方法来重命名文件或目录,以及移动文件到其他目录。
判断文件和目录:File类可以判断指定路径是文件还是目录,以便进行相应的操作。
遍历目录内容:File类可以遍历指定目录下的所有文件和子目录,从而实现文件系统的文件管理功能。
文件内容读写:虽然File类本身不提供读写文件内容的功能,但可以配合其他输入输出流类来实现文件内容的读取和写入操作。
3.2 创建File对象的方式.
- 通过文件路径字符串创建:
String filePath = "path/to/file.txt";
File file = new File(filePath);
2.通过父目录和子文件/目录名称创建:
String parentDirectory = "path/to/directory";
String childFileName = "file.txt";
File file = new File(parentDirectory, childFileName);
4.文件操作:
4.1 文件的创建与删除。
下面通过一个案例演示如何使用File类的构造方法创建File对象。
1 import java.io.File;
2 public class Test {
3 public static void main(String[] args) {
4 File f = new File("D:\\file\\a.txt");//使用绝对路径构造File对象
5 File f1 = new File("src\\Hello.java");//使用相对路径构造File对象
6 System.out.println(f);
7 System.out.println(f1);
8 }
9 }
上述代码中,第1行代码导入了java.io下的File类,第4~5行代码分别在构造方法中传入了绝对路径和相对路径的方式创建File对象。
需要注意的是,在创建File对象时传入的路径使用了“\\”,这是因为在Windows中的目录符号为反斜线“\”,但反斜线“\”在Java中是特殊字符,表示转义符,所以使用反斜线“\”时,前面应该再添加一个反斜线,即为“\\”。除此之外,目录符号还可以用正斜线“/”表示,如:“D:/file/a.txt”。
4.2 File类的常用方法
File类提供了一系列方法,用于操作其内部封装的路径指向的文件或者目录。File类中的常用方法如下表。
方法声明 | 功能描述 |
boolean exists() | 判断File对象对应的文件或目录是否存在,若存在则返回ture,否则返回false |
boolean delete() | 删除File对象对应的文件或目录,若成功删除则返回true,否则返回false |
boolean createNewFile() | 当File对象对应的文件不存在时,该方法将新建一个此File对象所指定的新文件,若创建成功则返回true,否则返回false |
String getName() | 返回File对象表示的文件或文件夹的名称 |
String getPath() | 返回File对象对应的路径 |
String getAbsolutePath() | 返回File对象对应的绝对路径(在Unix/Linux等系统上,如果路径是以正斜线/开始,则这个路径是绝对路径;在Windows等系统上,如果路径是从盘符开始,则这个路径是绝对路径) |
String getParentFile() | 返回File对象对应目录的父目录(即返回的目录不包含最后一级子目录) |
方法声明 | 功能描述 |
boolean exists() | 判断File对象对应的文件或目录是否存在,若存在则返回ture,否则返回false |
boolean delete() | 删除File对象对应的文件或目录,若成功删除则返回true,否则返回false |
boolean createNewFile() | 当File对象对应的文件不存在时,该方法将新建一个此File对象所指定的新文件,若创建成功则返回true,否则返回false |
String getName() | 返回File对象表示的文件或文件夹的名称 |
String getPath() | 返回File对象对应的路径 |
String getAbsolutePath() | 返回File对象对应的绝对路径(在Unix/Linux等系统上,如果路径是以正斜线/开始,则这个路径是绝对路径;在Windows等系统上,如果路径是从盘符开始,则这个路径是绝对路径) |
String getParentFile() | 返回File对象对应目录的父目录(即返回的目录不包含最后一级子目录) |
接下来,通过一个案例演示如何使用这些方法。
1 import java.io.IOException;
2 import java.io.File;
3 class Examole01 {
4 public static void main(String[] args) throws IOException {
5 //磁盘下创建文件
6 File file=new File("d:\\hello\\demo.txt");
7 if(file.exists()){ //如果存在这个文件就删除,否则就创建
8 file.delete();
9 }else{
10 System.out.println(file.createNewFile());
11 }
12 //在磁盘下创建一层目录,并且在目录下创建文件文件
13 File fileDemo=new File("d:\\hello1\\demo.txt");
14 if(!(fileDemo.getParentFile().exists())){ //判断d:\demo目录是否存在
15 fileDemo.getParentFile().mkdir();
16 }
17 if(fileDemo.exists()){ //如果存在这个文件就删除,否则就创建
18 fileDemo.delete();
19 }else{
20 System.out.println(fileDemo.createNewFile());
21 }
22 }
23 }
运行上述程序之后,在“d:\hello1”目录下会创建demo.txt文件,并且会创建hello1目录,并在hello1目录下创建demo.txt文件。
4.3 遍历目录下的文件。
File类的list()方法用于遍历指定目录下的所有文件,接下来通过一个案例来演示如何使用list()方法遍历目录文件。
import java.io.File;
public class Example03{
public static void main(String[] args) throws Exception {
// 创建File对象,file.mkdir()创建文件目录对象
//windows Linux:Ubantu、命令操作
File file = new File("D:/IdeaWorkspace/chapter07");
if (file.isDirectory()) { // 判断File对象对应的目录是否存在
String[] names = file.list (); // 获得目录下的所有文件的文件名
for (String name : names) {
System.out.println(name); // 输出文件名
}
}
}
}
把以上代码稍作调整:文件路径调整成自己的一个文件夹,再运行看输出结果。
上述代码中,第5行代码创建了一个File对象,并指定了一个路径,通过调用File的isDirectory()方法判断路径指向的是否为存在的目录,如果存在就调用list()方法,获得一个String类型的数组names,数组中包含这个目录下所有文件的文件名。接着通过循环遍历数组names,依次打印出每个文件的文件名。
上述程序实现了遍历一个目录下所有文件的功能,然而有时程序只是需要得到指定类型的文件,如获取指定目录下所有的“.java”文件。针对这种需求,File类中提供了一个重载的list(FilenameFilter filter)方法,该方法接收一个FilenameFilter类型的参数。FilenameFilter是一个接口,被称作文件过滤器,当中定义了一个抽象方法accept(File dir,String name)。在调用list()方法时,需要实现文件过滤器FilenameFilter,并在accept()方法中做出判断,从而获得指定类型的文件。