IO流第36天(BufferedWriter,使用Buffered完成字符流和字节流的拷贝,Object对象流)
BufferedWriter
案例,将”hello,龚嘉乐”写入到文件中
public static void main(String[] args) throws Exception {
//创建文件及位置
String filePath="d:\\BufferWrite.txt";
//创建写入
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
bufferedWriter.write("1hello,龚嘉乐");
bufferedWriter.newLine();//插入一个和系统相关的换行
bufferedWriter.write("2hello,龚嘉乐");
bufferedWriter.newLine();//插入一个和系统相关的换行
bufferedWriter.write("3hello,龚嘉乐");
bufferedWriter.newLine();//插入一个和系统相关的换行
bufferedWriter.close();
}
注意:
写入模式为追加时,在节点流出加一个参数true即可
覆盖:BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
追加:BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));
使用BufferedReader和BufferedWriter完成拷贝
注意:BufferedReader和BufferedWriter是按字符操作的,不要去操作二进制文件,否则可能会造成文件损坏
public static void main(String[] args) throws Exception {
//创建文件的源路径和目标路径
String srcFilePath="d:\\note.txt";
String desFilePath="c:\\note.txt";
//创建字符串,用于接收读取的字符
String len=null;
//创建BufferedReader和BufferedWriter
BufferedReader bufferedReader = new BufferedReader(new FileReader(srcFilePath));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(desFilePath));
//循环读取,每次读取一行
//readLine()每次读取一行的内容,但是没有换行符
while ((len= bufferedReader.readLine())!=null){
//每读取一行就写入,边读边写入
bufferedWriter.write(len);
//每读取一行就换行,不然会全部挤在一起
bufferedWriter.newLine();
}
bufferedReader.close();
bufferedWriter.close();
}
Buffered字节处理流
BufferedInputStream和BufferedOutputStream
案例:
完成图片/视频或者音乐的拷贝
public static void main(String[] args) {
//创建源文件路劲和目标文件路径
String scrFilePath = "d:\\风景.jpg";
String desFilePath = "c:\\风景.jpg";
//创建BufferedInputStream和BufferedOutputStream
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(scrFilePath));
bos = new BufferedOutputStream(new FileOutputStream(desFilePath));
//定义一个数组,提高读写效率
byte[]buff=new byte[1024];
int len = 0;
//循环读取文件并写入
while ((len = bis.read(buff)) != -1) {
bos.write(buff);
}
System.out.println("拷贝成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(bis!=null)
{
bis.close();
}
if(bos!=null){
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意:基本语法已经抛出异常使用IO流异常IOException e
对象流ObjectInputStream和ObjectOutputStream
-
在保存数据时,同时也保存它的数据类型,比如可以保持int 100,而不是保存"100",这样的话文件还可以恢复成int100.就是能够将 基本数据类型 或 对象 进行序列化和反序列化
-
序列化和反序列化
- 序列化就是在保存数据时,保存数据的值和数据类型
- 反序列化就是在恢复数据时,同时恢复它的值和数据类型
- 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现以下两个接口之一:
Serializable//这是一个标记接口,没有方法(常用)
Externalizable//该接口有两个方法需要实现,因此我们一般不使用
ObjectOutputStream实现了序列化功能
ObjectInputStream实现了反序列化功能
案例
使用ObjectOutputStream序列化基本数据类型和一个Dog对象(name,age),并保存到data.dat文件中
public static void main(String[] args) throws Exception {
//序列化后,保存的文件不是纯文本,而是按照它的格式来保存
String filePath = "d:\\date.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
//序列化数据到d:\date.dat
oos.write(100);//此处会自动装箱int==>Integer (Integer实现了Serializable接口)
oos.writeBoolean(true);//此处会自动装箱boolean==>Boolean (Boolean实现了Serializable接口)
oos.writeChar('a');//此处会自动装箱char==>Character (Character实现了Serializable接口)
oos.writeDouble(1.2);//此处会自动装箱double==>Double (Double实现了Serializable接口)
oos.writeUTF("龚嘉乐");//String实现了Serializable接口
oos.writeObject(new Dog("小黄",3));//保存对象
//关闭流
oos.close();
System.out.println("数据保存完毕(序列化)");
}
定义一个Dog类
/如果需要序列化某个类的对象,需要这个类实现Serializable接口
class Dog implements Serializable {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
写入后的一个结果会有乱码,因为不是txt文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?