一、沉默王二-JavaIO
1、文件流
在 Java 中,一切皆是对象,File 类也不例外,不论是哪个对象都应该从该对象的构造说起,所以我们来分析分析File类的构造方法。
比较常用的构造方法有三个:
1、 File(String pathname) :通过给定的路径来创建新的 File 实例。
2、 File(String parent, String child) :从父路径(字符串)和子路径创建新的 File 实例。
3、 File(File parent, String child) :从父路径(File)和子路径名字符串创建新的 File 实例。
File 类的注意点:
- 一个 File 对象代表硬盘中实际存在的一个文件或者目录。
- File 类的构造方法不会检验这个文件或目录是否真实存在,因此无论该路径下是否存在文件或者目录,都不影响 File 对象的创建。
1)File 常用方法
File 的常用方法主要分为获取功能、获取绝对路径和相对路径、判断功能、创建删除功能的方法。
获取功能:
1、getAbsolutePath() :返回此 File 的绝对路径。
2、getPath() :结果和 getAbsolutePath 一致。
3、getName() :返回文件名或目录名。
4、length() :返回文件长度,以字节为单位。
绝对路径是从文件系统的根目录开始的完整路径,它描述了一个文件或目录在文件系统中的确切位置。
相对路径是相对于当前工作目录的路径,它描述了一个文件或目录与当前工作目录之间的位置关系。
判断功能的方法:
1、 exists() :判断文件或目录是否存在。
2、 isDirectory() :判断是否为目录。
3、isFile() :判断是否为文件。
创建、删除功能的方法:
createNewFile():文件不存在,创建一个新的空文件并返回true,文件存在,不创建文件并返回false。delete():删除文件或目录。如果是目录,只有目录为空才能删除。mkdir():只能创建一级目录,如果父目录不存在,则创建失败。返回 true 表示创建成功,返回 false 表示创建失败。mkdirs():可以创建多级目录,如果父目录不存在,则会一并创建。返回 true 表示创建成功,返回 false 表示创建失败或目录已经存在。
目录的遍历:
String[] list():返回一个 String 数组,表示该 File 目录中的所有子文件或目录。File[] listFiles():返回一个 File 数组,表示该 File 目录中的所有的子文件或目录。
2、字节流
字节流可以传输任意类型的文件数据。
InputStream 是字节输入流的抽象类,它定义了读取字节数据的方法,如 read()、read(byte[] b)、read(byte[] b, int off, int len) 等。OutputStream 是字节输出流的抽象类,它定义了写入字节数据的方法,如 write(int b)、write(byte[] b)、write(byte[] b, int off, int len) 等。这两个抽象类是字节流的基础。
FileInputStream 是从文件中读取字节数据的流,它继承自 InputStream。FileOutputStream 是将字节数据写入文件的流,它继承自 OutputStream。这两个类是字节流最常用的实现类之一。
字节输出流(OutputStream)
java.io.OutputStream 是字节输出流的超类(父类),我们来看一下它定义的一些共性方法:
1、 close() :关闭此输出流并释放与此流相关联的系统资源。
2、 flush() :刷新此输出流并强制缓冲区的字节被写入到目的地。
3、 write(byte[] b):将 b.length 个字节从指定的字节数组写入此输出流。
4、 write(byte[] b, int off, int len) :从指定的字节数组写入 len 字节到此输出流,从偏移量 off开始。 也就是说从off个字节数开始一直到len个字节结束
1)FileOutputStream类
OutputStream 有很多子类,我们从最简单的一个子类 FileOutputStream 开始。看名字就知道是文件输出流,用于将数据写入到文件。
1)FileOutputStream 的构造方法
1、使用文件名创建 FileOutputStream 对象。
String fileName = "example.txt";
FileOutputStream fos = new FileOutputStream(fileName);
以上代码使用文件名 "example.txt" 创建一个 FileOutputStream 对象,将数据写入到该文件中。如果文件不存在,则创建一个新文件;如果文件已经存在,则覆盖原有文件。
2、使用文件对象创建 FileOutputStream 对象。
File file = new File("example.txt");
FileOutputStream fos = new FileOutputStream(file);
2)FileOutputStream 写入字节数据
使用 FileOutputStream 写入字节数据主要通过 write 方法:
write(int b)
write(byte[] b)
write(byte[] b,int off,int len) //从`off`索引开始,`len`个字节
3)FileOutputStream实现数据追加、换行
在上面的代码示例中,每次运行程序都会创建新的输出流对象,于是文件中的数据也会被清空。如果想保留目标文件中的数据,还能继续追加新数据,该怎么办呢?以及如何实现换行呢?
我们来学习FileOutputStream的另外两个构造方法,如下:
1、使用文件名和追加标志创建 FileOutputStream 对象
String fileName = "example.txt";
boolean append = true;
FileOutputStream fos = new FileOutputStream(fileName, append);
以上代码使用文件名 "example.txt" 和追加标志创建一个 FileOutputStream 对象,将数据追加到该文件的末尾。如果文件不存在,则创建一个新文件;如果文件已经存在,则在文件末尾追加数据。
2、使用文件对象和追加标志创建 FileOutputStream 对象
File file = new File("example.txt");
boolean append = true;
FileOutputStream fos = new FileOutputStream(file, append);
以上代码使用文件对象和追加标志创建一个 FileOutputStream 对象,将数据追加到该文件的末尾。
这两个构造方法,第二个参数中都需要传入一个boolean类型的值,true 表示追加数据,false 表示不追加也就是清空原有数据。
2)字节输入流(InputStream)
java.io.InputStream 是字节输入流的超类(父类),我们来看一下它的一些共性方法:
1、close() :关闭此输入流并释放与此流相关的系统资源。
2、int read(): 从输入流读取数据的下一个字节。
3、read(byte[] b): 该方法返回的 int 值代表的是读取了多少个字节,读到几个返回几个,读取不到返回-1
FileInputStream类
InputStream 有很多子类,我们从最简单的一个子类 FileInputStream 开始。看名字就知道是文件输入流,用于将数据从文件中读取数据。
FileInputStream的构造方法
1、FileInputStream(String name):创建一个 FileInputStream 对象,并打开指定名称的文件进行读取。文件名由 name 参数指定。如果文件不存在,将会抛出 FileNotFoundException 异常。
2、FileInputStream(File file):创建一个 FileInputStream 对象,并打开指定的 File 对象表示的文件进行读取。
FileInputStream读取字节数据
1、读取字节:read()方法会读取一个字节并返回其整数表示。如果已经到达文件的末尾,则返回 -1。如果在读取时发生错误,则会抛出 IOException 异常。
代码示例如下:
// 创建一个 FileInputStream 对象
FileInputStream fis = new FileInputStream("test.txt");
// 读取文件内容
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
// 关闭输入流
fis.close();
2、使用字节数组读取:read(byte[] b) 方法会从输入流中最多读取 b.length 个字节,并将它们存储到缓冲区数组 b 中。
代码示例如下:
// 创建一个 FileInputStream 对象
FileInputStream fis = new FileInputStream("test.txt");
// 读取文件内容到缓冲区
byte[] buffer = new byte[1024];
int count;
while ((count = fis.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, count));
}
// 关闭输入流
fis.close();