File
创建File对象(地址:D: \ \ text \ \ abc || D: / text / abc || File.separator(文件路径分隔符))
构造器 | 说明 |
public File(String pathname) | 根据文件路径创建文件对象 |
public File(String parent, String child) | 根据父路径和子路径名字创建文件对象 |
public File(File parent, String child) | 根据父路径对应文件对象和子路径名字创建文件对象 |
File提供的方法
方法名称 | 说明 |
public boolean exists() | 判断当前文件对象,对应的文件路径是否存在,存在返回true |
public boolean isFile() | 判断当前文件对象指代的是否是文件,是文件返回true,反之。 |
public boolean isDirectory() | 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。 |
public String getName() | 获取文件的名称(包含后缀) |
public long length() | 获取文件的大小,返回字节个数 |
public long lastModified() | 获取文件的最后修改时间。 |
public String getPath() | 获取创建文件对象时,使用的路径 |
public String getAbsolutePath() | 获取绝对路径 |
File创建文件
方法名称 | 说明 |
public boolean createNewFile() | 创建一个新的空的文件 |
public boolean mkdir() | 只能创建一级文件夹 |
public boolean mkdirs() | 可以创建多级文件夹 |
File删除文件
方法名称 | 说明 |
public boolean delete() | 删除文件、空文件夹 |
删除文件需要注意什么?
可以删除文件、空文件夹。
默认不能删除非空文件夹。
delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站
如何删除非空文件夹
File类提供的遍历文件夹的功能
方法名称 | 说明 |
public String[] list() | 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。 |
public File[] listFiles() | 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点) |
使用listFiles方法时的注意事项:
当主调是文件,或者路径不存在时,返回null
当主调是空文件夹时,返回一个长度为0的数组
当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
当主调是一个文件夹,但是没有权限访问该文件夹时,返回null
利用方法递归进行多级文件搜索
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
public class RecursiveFileSearch {
public static void main(String[] args) {
String rootDirectory = "path/to/search/from"; // 替换为要搜索的根目录路径
List<Path> matchingFiles = searchFiles(rootDirectory, ".*\\.txt"); // 示例:搜索所有.txt文件
for (Path filePath : matchingFiles) {
System.out.println(filePath);
}
}
public static List<Path> searchFiles(String directoryPath, String regexPattern) {
File directory = new File(directoryPath);
if (!directory.exists() || !directory.isDirectory()) {
throw new IllegalArgumentException("Invalid directory path: " + directoryPath);
}
List<Path> matchingFiles = new ArrayList<>();
searchFilesRecursively(directory.toPath(), regexPattern, matchingFiles);
return matchingFiles;
}
private static void searchFilesRecursively(Path directory, String regexPattern, List<Path> matchingFiles) {
try (var filesStream = Files.list(directory)) {
filesStream.forEach(file -> {
if (file.toFile().isDirectory()) {
searchFilesRecursively(file, regexPattern, matchingFiles);
} else if (file.toFile().isFile() && file.getFileName().toString().matches(regexPattern)) {
matchingFiles.add(file);
}
});
} catch (IOException e) {
System.err.println("An error occurred while searching directory: " + directory);
e.printStackTrace();
}
}
}
IO流
io流基本的四类
字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流
字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流。
字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流。
字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流。
FileInputStream(文件字节输入流)
构造器 | 说明 |
public FileInputStream(File file) | 创建字节输入流管道与源文件接通 |
public FileInputStream(String pathname) | 创建字节输入流管道与源文件接通 |
方法名称 | 说明 |
public int read() | 每次读取一个字节返回,如果发现没有数据可读会返回-1. |
public int read(byte[] buffer) | 每次用一个字节数组去读取数据,返回字节数组读取了多少个字节 如果发现没有数据可读会返回-1. |
import java.io.*;
public class FileInputStreamExample {
public static void main(String[] args) {
String filePath = "example.txt"; // 替换为你要读取的文件路径
try (FileInputStream fis = new FileInputStream(filePath)) {
// 读取文件字节
byte[] buffer = new byte[1024]; // 创建一个1024字节的缓冲区
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
// 处理读取到的字节数据
// 在这里,我们仅打印字节的十六进制表示
for (int i = 0; i < bytesRead; i++) {
System.out.printf("%02X ", buffer[i]);
}
System.out.println();
}
} catch (FileNotFoundException e) {
System.err.println("File not found: " + filePath);
e.printStackTrace();
} catch (IOException e) {
System.err.println("An error occurred while reading the file:");
e.printStackTrace();
}
}
}
文件字节输入流:一次读取完全部字节
方式一:自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节
方法名称 | 说明 |
public int read(byte[] buffer) | 每次用一个字节数组去读取,返回字节数组读取了多少个字节 如果发现没有数据可读会返回-1. |
方式二:Java官方为InputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。
方法名称 | 说明 |
public byte[] readAllBytes() throws IOException | 直接将当前字节输入流对应的文件对象的字节数据 装到一个字节数组返回 |
FileOutputStream(文件字节输出流)
作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。
构造器 | 说明 |
public FileOutputStream(File file) | 创建字节输出流管道与源文件对象接通 |
public FileOutputStream(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileOutputStream(File file,boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileOutputStream(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据 |
方法名称 | 说明 |
public void write(int a) | 写一个字节出去 |
public void write(byte[] buffer) | 写一个字节数组出去 |
public void write(byte[] buffer , int pos , int len) | 写一个字节数组的一部分出去。 |
public void close() throws IOException | 关闭流。 |
FileReader(文件字符输入流)
作用:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。
构造器 | 说明 |
public FileReader(File file) | 创建字符输入流管道与源文件接通 |
public FileReader(String pathname) | 创建字符输入流管道与源文件接通 |
方法名称 | 说明 |
public int read() | 每次读取一个字符返回,如果发现没有数据可读会返回-1. |
public int read(char[] buffer) | 每次用一个字符数组去读取数据,返回字符数组读取了多少个字符 如果发现没有数据可读会返回-1. |
FileWriter(文件字符输出流)
作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。
构造器 | 说明 |
public FileWriter(File file) | 创建字节输出流管道与源文件对象接通 |
public FileWriter(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileWriter(File file,boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileWriter(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据 |
方法名称 | 说明 |
void write(int c) | 写一个字符 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
字节缓冲流
字节缓冲输入流自带了8KB缓冲池;字节缓冲输出流也自带了8KB缓冲池。
构造器 | 说明 |
public BufferedInputStream(InputStream is) | 把低级的字节输入流包装成一个高级的缓冲字节输入流 从而提高读数据的性能 |
public BufferedOutputStream(OutputStream os) | 把低级的字节输出流包装成一个高级的缓冲字节输出流 从而提高写数据的性能 |
BufferedReader(字符缓冲输入流)
构造器 | 说明 |
public BufferedReader(Reader r) | 把低级的字符输入流包装成字符缓冲输入流管道 从而提高字符输入流读字符数据的性能 |
方法 | 说明 |
public String readLine() | 读取一行数据返回,如果没有数据可读了,会返回null |
BufferedWriter(字符缓冲输出流)
构造器 | 说明 |
public BufferedWriter(Writer r) | 把低级的字符输出流包装成一个高级的缓冲字符输出流管道 从而提高字符输出流写数据的性能 |
转换流
InputStreamReader字符输入转换流
OutputStreamWriter字符输出转换流
打印流
PrintStream/PrintWriter(打印流)
作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。
PrintStream
构造器 | 说明 |
public PrintStream(OutputStream/File/String) | 打印流直接通向字节输出流/文件/文件路径 |
public PrintStream(String fileName, Charset charset) | 可以指定写出去的字符编码 |
public PrintStream(OutputStream out, boolean autoFlush) | 可以指定实现自动刷新 |
public PrintStream(OutputStream out, boolean autoFlush, String encoding) | 可以指定实现自动刷新,并可指定字符的编码 |
PrintWriter
构造器 | 说明 |
public PrintWriter(OutputStream/Writer/File/String) | 打印流直接通向字节输出流/文件/文件路径 |
public PrintWriter(String fileName, Charset charset) | 可以指定写出去的字符编码 |
public PrintWriter(OutputStream out/Writer, boolean autoFlush) | 可以指定实现自动刷新 |
public PrintWriter(OutputStream out, boolean autoFlush, String encoding) | 可以指定实现自动刷新,并可指定字符的编码 |
PrintStream和PrintWriter的区别
打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)
PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法。
PrintWriter继承自字符输出流Writer,因此支持写字符数据出去。
数据流
DataOutputStream(数据输出流)
DataInputStream(数据输入流)
序列化流
ObjectOutputStream(对象字节输出流)
ObjectInputStream(对象字节输入流)