缓冲流和对象流

缓冲流实例:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;


//BufferedReader/BufferedWriter
public class Learn1 {
public static void main(String[] args) {
FileReader in = null;
BufferedReader bufferedReader = null;

FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;


//现在将读取的内容存到磁盘中没有的路径上
File file = new File("e:/j151");

File file2 = new File(file, "B.txt");

if(!file2.exists()) {
file.mkdirs();//创建目录--只创建目录,不应该包含文件
try {
file2.createNewFile();//创建文档
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

try {
in = new FileReader("E:/A.txt");
bufferedReader = new BufferedReader(in);

fileWriter = new FileWriter(file2);
bufferedWriter = new BufferedWriter(fileWriter);

String str = null;
while((str=bufferedReader.readLine())!=null) {
bufferedWriter.write(str);//输出一行
bufferedWriter.newLine();//新的一行
}
bufferedWriter.write("你结束了~");//可以自行书写

fileWriter.flush();
bufferedWriter.flush();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(in!=null) {
in.close();
}
if(bufferedReader!=null) {
bufferedReader.close();
}
if(fileWriter!=null) {
fileWriter.close();
}
if(bufferedWriter!=null) {
bufferedWriter.close();
}
} catch (Exception e2) {
System.out.println("错了");
}
}
}

}

————————————————————————————————

对象流实例:

import java.io.Serializable;


//Serializable接口没有需要实现的方法,其作为标记接口存在
//什么是标记接口?--具有特殊含义但不需要重写方法的接口
//实现了Serializable接口表示已经可以序列化
public class Student implements Serializable{
private String name;
private int age;

public Student() {
}


public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public int getAge() {
return age;
}


public void setAge(int age) {
this.age = age;
}


@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}



import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

//对象流
//对象流也有输入输出流--
public class Learn {
public static void main(String[] args) {
Student stu =  new Student("小强",18);
Student stu1 =  new Student("校花",17);

FileOutputStream out = null;
ObjectOutputStream objOut = null;

FileInputStream in = null;
ObjectInputStream objIn = null;
try {
in = new FileInputStream("use/user.txt");//当前工程中的存储路径
objIn = new ObjectInputStream(in);

out = new FileOutputStream("use/user.txt");//从源文件中读取
objOut = new ObjectOutputStream(out);
//如果要输出一个对象,则需要将其类进行序列化
//什么是序列化呢?--让类实现Serializable接口
//否则出现异常java.io.NotSerializableException
   //objOut.writeObject(stu);

//现在有个疑问,如何存多个对象?
List<Student> list =  new ArrayList<Student>();
list.add(stu);
list.add(stu1);
//如果是使用集合存入,则需要注意一点,里面的对象所对应的类都需要序列化
objOut.writeObject(list);//写入
//如何将存入的序列化的内容取出?--反序列化(创建对象的第二种方式)
List<Student> list1 = (List<Student>) objIn.readObject();
System.out.println(list1.get(0).getName());
out.flush();
objOut.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
try {
if(objOut!=null) {
objOut.close();
}
if(out!=null) {
out.close();
}
} catch (Exception e2) {
System.out.println("错了");
}
}
}
}

### Java 缓冲流的概念及使用 缓冲流通过引入额外的缓存机制来提高输入输出操作效率。当程序频繁访问磁盘或其他外部资源时,每次读写都会带来较大的开销。而缓冲流可以在内存中创建临时存储区,在适当的时候批量处理数据,从而减少实际I/O次数。 对于字符类型的缓冲流,`BufferedReader` `BufferedWriter` 是常用的两个类[^2]。下面是一个简单的例子展示如何利用这些类从文件中逐行读取文本: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BufferedReadExample { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader("fileExample/buffered_output.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } } ``` 这段代码展示了如何打开一个带有路径 `"fileExample/buffered_output.txt"` 的文件并将其内容按照行的形式打印到控制台。这里使用的 `try-with-resources` 结构确保了即使发生异常也能自动关闭资源。 ### 对象序列化的概念及其应用 对象序列化是指将对象的状态转换成字节流以便于在网络上传输或持久保存至本地的过程;相反地,反序列化则是指恢复这个过程——即把之前被序列化的对象重新构建出来。Java 提供了一系列工具使得这一流程变得简单易用,比如实现了 `Serializable` 接口的对象可以直接参与此过程[^3]。 要使某个自定义类能够支持序列化功能,则只需要让该类继承 `Serializable` 接口即可。值得注意的是,虽然这是一个标记型接口(不包含任何抽象方法),但它却赋予了目标类一种特殊的能力:允许其实例变成可传输的数据形式。 下面是有关对象序列化的一个具体案例说明: #### 序列化对象 假设有一个名为 `Person` 的实体类,它包含了姓名 (`name`) 及年龄 (`age`) 属性,并且已经实现了 `Serializable` 接口。那么可以通过如下方式完成对该类对象的序列化工作: ```java import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; // 定义了一个可以被序列化的 Person 类 class Person implements Serializable { private static final long serialVersionUID = 1L; // 版本号, 建议显式指定 private String name; private int age; // 构造函数、getter/setter 方法省略... } public class SerializeDemo { public static void main(String[] args) throws Exception { Person person = new Person("张三", 20); // 创建 ObjectOutputStream 实例用于写出对象 try (FileOutputStream fos = new FileOutputStream("person.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { // 将 person 对象序列化后写入文件 oos.writeObject(person); } System.out.println("对象已成功序列化!"); } } ``` 上述代码片段首先建立起了指向特定位置的目标文件输出流,接着借助 `ObjectOutputStream` 来执行真正的序列化动作。最后,整个过程中涉及的所有 I/O 资源都得到了妥善管理,保证不会因为意外情况而导致泄露等问题的发生。 #### 反序列化对象 同样地,如果想要获取先前已经被序列化的 `Person` 对象,只需按照下述方式进行相应的设置就可以轻松实现这一点: ```java import java.io.FileInputStream; import java.io.ObjectInputStream; public class DeserializeDemo { public static void main(String[] args) throws Exception { Person deserializedPerson; // 创建 ObjectInputStream 实例准备读取对象 try (FileInputStream fis = new FileInputStream("person.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { // 执行反序列化得到原始对象副本 deserializedPerson = (Person) ois.readObject(); } System.out.printf("反序列化后的对象信息:%s (%d岁)\n", deserializedPerson.getName(), deserializedPerson.getAge()); } } ``` 在这里,`ObjectInputStream` 发挥着至关重要的作用,因为它负责解析来自文件中的二进制表示并将之还原为原来的 Java 对象结构。需要注意的一点是,由于泛型擦除的原因,在调用 `readObject()` 返回的结果必须强制转型为目标类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值