题目:
设计一个汽车类,把汽车对象存储进文件。能从文件中查找某个汽车对象并打印输出。
要求:
使用对象流进行操作。
思路分析:
首先定义了一个汽车类Car
,包含了汽车的厂商、型号和年份等属性,并实现了序列化接口Serializable
。
接着定义了一个CarManager
类,其中包含了两个静态方法:saveCar
和findCar
。
saveCar
方法用于将汽车对象保存到文件中。它通过创建ObjectOutputStream
对象,并传入一个FileOutputStream
对象和一个BufferedOutputStream
对象来构建对象输出流。然后使用writeObject
方法将汽车对象写入文件。最后,通过关闭流来释放资源。
findCar
方法用于从文件中查找某个汽车对象。它通过创建ObjectInputStream
对象,并传入一个FileInputStream
对象和一个BufferedInputStream
对象来构建对象输入流。然后使用readObject
方法读取文件中的汽车对象,进行属性比较,如果找到匹配的汽车对象,则返回该对象。当文件读取到末尾(EOFException
)时表示未找到匹配的汽车对象,返回null
。如果在读取文件或反序列化过程中出现异常,则打印错误信息并返回null
。
最后,在Main
类的main
方法中,创建了两个示例汽车对象并调用CarManager
的saveCar
方法将其保存到文件中。然后调用CarManager
的findCar
方法查找并输出其中一个汽车对象。
运行结果:
假设程序运行后成功保存了两个汽车对象,并且要查找的汽车对象存在,那么输出结果可能如下:
2020 Toyota Camry
如果要查找的汽车对象不存在,那么输出结果可能如下:
Car not found.
代码:
import java.io.*;
class Car implements Serializable {
private static final long serialVersionUID = 1L;
private String make;
private String model;
private int year;
public Car(String make, String model, int year) {
this.make = make;
this.model = model;
this.year = year;
}
public String getMake() {
return make;
}
public String getModel() {
return model;
}
public int getYear() {
return year;
}
public String toString() {
return year + " " + make + " " + model;
}
}
class CarManager {
private static final String DATA_FILE = "cars.dat";
public static void saveCar(Car car) {
try (ObjectOutputStream out = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream(DATA_FILE)))) {
out.writeObject(car);
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}
}
public static Car findCar(String make, String model, int year) {
try (ObjectInputStream in = new ObjectInputStream(
new BufferedInputStream(new FileInputStream(DATA_FILE)))) {
while (true) {
Car car = (Car) in.readObject();
if (car.getMake().equalsIgnoreCase(make) &&
car.getModel().equalsIgnoreCase(model) &&
car.getYear() == year) {
return car;
}
}
} catch (EOFException e) {
return null;
} catch (IOException | ClassNotFoundException e) {
System.err.println("Error: " + e.getMessage());
return null;
}
}
}
public class Main {
public static void main(String[] args) {
Car car1 = new Car("Toyota", "Camry", 2020);
CarManager.saveCar(car1);
Car car2 = new Car("Honda", "Civic", 2019);
CarManager.saveCar(car2);
Car foundCar = CarManager.findCar("Toyota", "Camry", 2020);
if (foundCar != null) {
System.out.println(foundCar);
} else {
System.out.println("Car not found.");
}
}
}
总结:
这个程序利用了Java的对象流机制来实现汽车对象的存储和查找。通过序列化和反序列化,可以将汽车对象转换为字节流并保存到文件,或者从文件中读取字节流并转换为汽车对象。