Java流和文件的读写
File类
操作文件的方法
createNewFile() //创建新文件。
delete(); //直接从磁盘上删除
exists(); //查询磁盘中的文件是否存在
getAbsolutePath(); //获取绝对路径
getPath(); //获取相对路径
getName(); //获取文件名相当于调用了一个toString方法。
isFile(); //判断是否是文件
length(); //查看文件中的字节数
isHidden(); //测试文件是否被这个抽象路径名是一个隐藏文件。
操作目录的方法
exists(); //查询目录是否存在
isDirectory(); //判断当前路径是否为目录
mkdir(); //创建目录
getParentFile(); //获取当前目录的父级目录。
list(); //返回一个字符串数组,包含目录中的文件和目录的路径名。
listFiles(); //返回一个File数组,表示用此抽象路径名表示的目录中的文件。
IO流类的体系
-
File:对文件或目录进行包装的类,使用io流以文件作为数据源或目的地时,需要用到File对其指定;
-
RandomAccessFile:只能对文件进行读写操作的随机访问;
-
FileInputStream:节点流,以字节为单位直接操作 "文件";
-
ByteArrayInputStream:节点流,以字节为单位直接操作 "字节数组对象";
-
ObjectInputStream:处理流,以字节为单位直接操作 "对象";
-
DataInputStream:处理流,以字节为单位直接操作 "基本数据类型与字符串类型";
-
FlieReader:节点流,以字符为单位直接操作 "文本文件";
-
BufferedReader:处理流,将Reader对象进行包装,增加缓存功能,提高读写效率;
-
BufferedInputStream:处理流,将InputStream对象进行包装,增加缓存功能,提高读写效率;
-
InputStreamReader:处理流,将字节流对象转化为字符流对象;
-
PrintStream:将OutputStream包装,更加灵活、方便的输出字符;
操作文件流
FileInputStream
FileInputStream fis = null;
fis = new FileInputStream("D:/test.txt"); //字节流读取字符文件时结果是ASCII码
int temp = 0;
while((temp = fis.read()) != -1){
System.out.println(temp);
}
字节流缓冲区
手动指定缓冲区
方式一:分批读取
创建一个指定长度的字节数组,适用于读取内存占用很大文件时,缓冲区长度定义在2的整数幂,一般是1024。效率慢,空间节省。
// todo 创建出FileInputStream(fis)
byte[] buff = new byte[1024]; // 字符缓存区只需定义char数组即可,其余不变
while ((temp = fis.read(buff)) != -1){ //之前是一次读一个字节,现在一次读一批
fos.write(buff,0,temp); // 从buff读取字节,从0开始到temp结束
}
fos.flush(); // 将数据从内存写入磁盘
// todo 关闭流
方式二:一次性读取
创建一个指定长度的字节数组,长度由available()返回当前文件的预估长度,适用于读取内存占用不是很大的文件。效率快,空间浪费。
// todo 创建出FileInputStream(fis)
byte[] buff = new byte[fis.available()]; // 返回当前文件的预估大小,一次读完,不需要while
fis.read(buff); // 读取文件存入buff
fos.write(buff); // 将buffer数据写出
fos.flush(); // 将数据从内存写入磁盘
// todo 关闭流
字节缓冲流
BufferedInputStream和BufferedOutputStream,在字节流或处理流上添加缓冲功能的流,是处理流,通过内部缓存数组(默认长度8192==2的13次幂)来提高效率。
// 读取文件
fis = new FileInputStream("D:/test.txt");
bis = new BufferInputStream(fis);
// 写入文件
fos = new FileOutputStream("D:/test1.txt");
bos = new BufferOutputStream(foa);
int temp = 0;
// bis字节缓冲流里面自带缓存数组
while((temp=bis.read()) != -1){
bos.write(temp);
}
bos.flush();
// todo 关闭流
字符缓冲流
BufferedReader / BufferedWriter,用此处理流包装节点流,使用readLine()方法,按行读取,newLine()换行,writer()按行写入。
FileWriter()默认覆盖原数据,指定参数true则开启追加模式。
写入:
FileWriter fileWriter = new FileWriter(new File(path));
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(strBean);
bufferedWriter.flush();
// 关闭流
bufferedWriter.close();
fileWriter.close();
读取:
FileReader fileReader = new FileReader(new File(path));
BufferedReader bufferedReader = new BufferedReader(fileReader);
String strBean = bufferedReader.readLine();
// 关闭流
bufferedReader.close();
fileReader.close();
转换流
注:为什么有转换流,作用是什么?https://blog.csdn.net/qq_43511405/article/details/108328792
InputStreamReader / OutputStreamWriter :将字节流转化字符流
使用场景:
实现从键盘按行输入,需要用到System.in字节流,而readLine()又需要Reader对象;
实现按行输出到显示器,需要用到System.out字节流,而Writer()又是Reader对象;
BufferedReader br = null;
BufferedWriter bw = null;
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = br.readLine();
bw.write(s);
字符输出流
PrintWriter对象:println(String str)方法,自动刷新缓冲字符流,自动换行。
PrintWriter pw = new PrintWriter("d:/test.txt");
pw.println("我是一行字符");
字节数组流
ByteArrayInputStream / ByteArrayOutputStream
常用在流和字节数组转化的情况。
在网络传输的时候会用到字节数据流将流中数据写到字节数组,字节数组经过Datagrampacket包装在网络中传递。
byte[] arr = "abcdefg".getBytes();
ByteArrayInputStream bis = null; // 输入流
ByteArrayOutputStream bos = null; // 输出流
bis = new ByteArrayInputStream(arr); // 字节数组arr作为数据源读取数据
bos = new ByteArrayOutputStream;
int i = 0;
while((i = bis.read()) != -1){
bos.write(i);
}
byte[] bytes = bos.toByteArray(); // 转化成字节数组
for(byte b : bytes){
System.out.println(b);
}
数据流
处理流,DtatInputStream / DataOutputStream,将基本数据类型和字符串类型作为数据源,操作 int、double时可以使用字节流、操作String时可以使用字符流,这就导致操作时需要类型转化处理,数据流解决了这一麻烦。读取数据的时候注意按照写入的顺序读取,否则不能正确读取数据。
FileOutputStream fos = new FileOutputStream("D:/data.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(10);
dos.writeChar("a");
对象流
- 可以实现对Java基本数据类型的读写,还可对对象进行读写;
- ObjectOutputStream:对象输出流,writeObject(Object obj)可对指定参数对象进行序列化,得到的字节序列写入目标输出流。
- ObjectInputStream:对象输入流,readObject()读取字节序列,并反序列化,返回对象。
序列化:把Java对象转化成字节序列,实现在网络上的对象传输,也可以存储在硬盘,实现持久化。
反系列化:接收网络传输的字节序列,恢复成Java对象。
只有实现Serializable接口的类的对象才能被序列化和反序列化,空接口,标识作用。
序列化:将字符序列写到 D:/TestSerializable.txt
ObjectOutputStream oos = null;
oos = new ObjectOutputStream(new FileOutputStream("D:/TestSerializable.txt"));
User user = new User("zyg",18);
oos.writeObject(user);
oos.flush();
// todo 关闭流
反序列化:
ObjectInputStream ois = null;
ois = new ObjectInputStream(new FileInputStream("D:/TestSerializable.txt"));
User user = (User)ois.readObject();
// todo 关闭流
Apache-IO
FileUtils
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
// 写入
FileUtils.writeStringToFile(file, str, StandardCharsets.UTF_8, false); // false:拒绝追加
// 读取
String s = FileUtils.readFileToString(new File("d:/RandomAccessFile.txt"), "utf-8");
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤