file和io流
本文详细介绍了Java中的File类与IO流,涵盖了File类的基本操作、IO流的工作原理、分类(按流向、处理方式和功能),以及FileReader、FileWriter、InputStream/OutputStream、Buffered流和对象流的使用,包括序列化与反序列化示例
File类
- File类用于表示文件和目录的路径名抽象。
- File类的一个对象对应于操作系统下的一个文件或一个目录
- 通过File类,可以创建、删除、重命名文件或目录,也可以检查文件属性,如文件大小、最后修改时间等。
获取文件信息
File file = new File("D:\\xxx\\xx\\1.txt");
System.out.println(file.getName()); // 获取文件名
System.out.println(file.exists()); // 判断文件是否存在
System.out.println(file.getParent()); // 获取文件父级路径
System.out.println(file.isDirectory()); // 判断是否是文件夹
System.out.println(file.isFile()); // 判断是否是文件
创建文件
File file = new File("D:\\xxx\\xx\\1.txt");
// 判断本地硬盘中是否在已经存在要创建的文件
if(!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace(); // 当系统路径不存在时抛异常
}
}
创建目录
File file = new File("D:\\xxx\\xx\\test");
if(!file.exists()) {
file.mkdir(); // 创建单级目录
}
File file1 = new File("D:\\xxx\\xx\\test1\\test2");
if(!file1.exists()) {
boolean sign = file1.mkdirs(); // 创建多级目录
System.out.println(sign);
}
删除文件
File file = new File("D:\\xxx\\xx\\1.txt");
if(file.exists()) {
file.delete();
}
文件重命名
File file = new File("D:\\xxx\\xx\\1.txt");
File file1 = new File("D:\\xxx\\xx\\2.txt");
if(file.exists()) {
file.renameTo(file1);
}
文件获取
File file = new File("D:\\xxx\\xx");
String[] strArr = file.list(); // 获取目录下所有的文件夹/文件名
for(String str:strArr) {
System.out.println(str);
}
File[] fileArr = file.listFiles(); // 获取目录下所有的文件对象
for(File f:fileArr) {
System.out.println(f.getName());
}
IO流
java的IO(input/output)是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。
在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。
通过流的形式允许java程序使用相同的方式来访问不同的输入/输出源。
流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两个设备间的传输成为流,流的本质是数据传输。
在java.io包中操作文件内容主要有两大类:字节流、字符流,两类都分为输入和输出操作。
如果是音频文件、图片、歌曲、就用字节流好点,如果关系到中文的,用字符流好点。字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串,字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流可以。
字符流
字符输出流
FileWriter,BufferedWriter是字符输出流常用的类
-
FileWriter
字符输出流
FileWriter writer = null;
try {
// 构造器可以直接接收路径字符串,也可以接收Flie文件对象
// fileWriter = new FileWriter(new File("D:\\xxx\\xxx\\1.txt"));
writer = new FileWriter("D:\\xxx\\xxx\\1.txt");
writer.write("abc"); // 写入字符串
writer.write("abcdef", 2, 2); // 写入内容的时候可以只截取部分写入,写入cd
writer.write(new char[]{'a', 'b', 'c'}); // 写入字符数组
writer.write(new char[]{'a', 'b', 'c', 'd', 'e'}, 2, 2);
writer.write(99); // Ascii码值
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileWriter != null) {
try {
fileWriter.close(); // 记得关闭资源
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.BufferedWriter
高效字符输出流,使用方法基本与FileWriter相同。
BufferedWriter writer = new BufferedWriter(new FileWriter("D:\\xxx\\xxx\\1.txt"));
writer.write("abc");
writer.write("abcdef", 2, 2);
writer.write(new char[]{'a', 'b', 'c'});
writer.write(new char[]{'a', 'b', 'c', 'd', 'e'}, 2, 2);
writer.write(99);
writer.newLine(); // 换行
FileWriter和BufferedWriter区别
-
FileWriter和BufferWriter写入的都是字符流;
-
FileWriter和BufferWriter都有缓冲区,FileWriter的缓冲区大小是8192个字节,BufferWriter缓冲区大小是8192个字符;
-
FileWriter和BufferWriter调用write方法时都没有真正往硬盘里写数据,存入的都是缓冲区,只有调用flush或者close时才会刷新缓冲区并写入硬盘;
-
FileWriter每调用一次write就会进行一次转码,而BufferedWriter只有在缓冲区满了才会转码,这才是BufferedWriter高效的真正原因。
字符输入流
FileReader,BufferedReader是字符输入流常用的类。
-
FileReader
字符输入流。
read() : 每调用一次read()就返回一个字符对应的ascii码,如果结束就返回-1。
read(字符数组): 传入字符数组接收读取到的内容,返回读取到的个数,如果结束就返回-1。
// read()
FileReader reader = null;
try {
reader = new FileReader("D:\\xxx\\xxx\\1.txt");
int num1 = reader.read(); // 返回值ascii
System.out.println((char)num1); // ascii码强转为字符
int num2 = reader.read();
System.out.println((char)num2);
// 循环读取,获取文件全部的内容
int num = -1;
while((num = reader.read()) != -1) {
System.out.print((char)num);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// read(字符数组)
FileReader reader = null;
try {
reader = new FileReader("D:\\xxx\\xxx\\1.txt");
// char[] c = new char[3];
// int num1 = reader.read(c);
// System.out.println(num1);
// System.out.println(new String(c, 0, num1));
// 循环读取全部内容
char[] c = new char[3];
int num = -1;
while((num = reader.read(c)) != -1) {
System.out.print(new String(c,0, num)); // 利用String构造器把字符数组转为字符串
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2.BufferrdReader
高效字符输入流,使用方法与FileReader相似,多了一个readLine(),直接读取一行
BufferedReader reader = new BufferedReader(new FileReader("D:\\xxx\\xxx\\1.txt"));
String str = null;
while((str = reader.readLine()) != null) {
System.out.println(str);
}
字节流
字节输出流
FileOutputStream,BufferedOutputStream是字节输出流常用的类
-
FileOutputStream
OutputStream outputStream = new FileOutputStream("D:\\xxx\\xxx\\1.txt");
outputStream.write(new byte[]{97,98,99});
-
BufferedOutputStream
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("D:\\xxx\\xxx\\1.txt"));
outputStream.write(new byte[]{97,98,99});
字节输入流
FileInputStream,BufferedInputStream是字节输入流常用的类
-
FileInputStream
InputStream inputStream = new FileInputStream("D:\\xxx\\xxx\\1.txt");
byte[] bt = new byte[3];
int num = -1;
while((num = inputStream.read(bt)) != -1) {
System.out.print(new String(bt,0, num));
}
-
BufferedInputStream
BufferedInputStream input = new BufferedInputStream(new FileInputStream("D:\\xxx\\xxx\\1.txt"));
byte[] bt = new byte[3];
int num = -1;
while((num = input.read(bt)) != -1) {
System.out.println(new String(bt, 0, num));
}

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)