public Model() { file = new File("points.txt"); points = new ArrayList<Point>(); if(file.exists()) { try { Scanner s = new Scanner(file); while(s.hasNext()) { points.add(new Point(s.nextInt(),s.nextInt())); } s.close(); }catch(FileNotFoundException ex) { System.err.println(ex.getMessage()); System.exit(1); } } listeners = new ArrayList<ModelListener>(); } public void savaData() { try { PrintWriter out = new PrintWriter(file); for(Point p:points) { out.println((int)p.getX()+" "+(int)p.getY()); } out.close(); }catch(FileNotFoundException e) { System.err.println(e.getMessage()); System.exit(1); } }
时间: 2023-08-02 12:08:12 浏览: 42
这段代码是一个Java程序的Model类的构造函数和savaData方法。在构造函数中,首先定义了一个文件对象和一个点集合对象,然后判断文件是否存在,如果存在就读取文件中的点数据,并将其添加到点集合中。接着定义了一个监听器集合对象。在savaData方法中,首先定义一个PrintWriter对象,然后遍历点集合,将每个点的坐标写入文件中,并关闭PrintWriter对象。如果写入过程中出现异常,将会输出异常信息并退出程序。这段代码的作用是读取和保存点数据。
相关问题
帮我根据以下要求:Add to the Model class a new method called savaData that saves into a text file called "points.txt" the integer coordinates x and y of each point in the arraylist of points. Also modify the constructor of the Model class to read the integer coordinates of all the points from the same text file, if it exists, and put them into the arraylist of points (if the file does not exist then the arraylist of points should remain empty).public class Model { private ArrayList<Point> points; private ArrayList<ModelListener> listeners; public Model() { points = new ArrayList<Point>(); listeners = new ArrayList<ModelListener>(); } public void addListener(ModelListener l) { listeners.add(l); } public ArrayList<Point> getPoints() { return points; } public void addPoint(Point p) { points.add(p); notifyListeners(); // points changed so notify the listeners. } public void clearAllPoints() { points.clear(); notifyListeners(); // points changed so notify the listeners. } public void deleteLastPoint() { if(points.size() > 0) { points.remove(points.size() - 1); notifyListeners(); // points changed so notify the listeners. } } private void notifyListeners() { for(ModelListener l: listeners) { l.update(); // Tell the listener that something changed. } } public int numberOfPoints() { return points.size(); } public static void testModel() { Model m = new Model(); m.addListener(new ModelListener() { @Override public void update() { System.out.println(true + " (listener)"); } }); System.out.println(m.getPoints() == m.points); Point p1 = new Point(1, 2); Point p2 = new Point(3, 4); m.addPoint(p1); // Listener called. m.addPoint(p2); // Listener called. System.out.println(m.numberOfPoints() == 2); System.out.println(m.points.get(0) == p1); System.out.println(m.points.get(1) == p2); m.deleteLastPoint(); // Listener called. System.out.println(m.numberOfPoints() == 1); System.out.println(m.points.get(0) == p1); m.clearAllPoints(); // Listener called. System.out.println(m.numberOfPoints() == 0); m.notifyListeners(); // Listener called. } }修改下述代码:
public class Model {
private ArrayList<Point> points;
private ArrayList<ModelListener> listeners;
public Model() {
points = new ArrayList<Point>();
listeners = new ArrayList<ModelListener>();
// Read points from file if it exists
File file = new File("points.txt");
if (file.exists()) {
try {
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String[] coordinates = scanner.nextLine().split(" ");
int x = Integer.parseInt(coordinates[0]);
int y = Integer.parseInt(coordinates[1]);
points.add(new Point(x, y));
}
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
public void addListener(ModelListener l) {
listeners.add(l);
}
public ArrayList<Point> getPoints() {
return points;
}
public void addPoint(Point p) {
points.add(p);
notifyListeners(); // points changed so notify the listeners.
saveData(); // save point to file
}
public void clearAllPoints() {
points.clear();
notifyListeners(); // points changed so notify the listeners.
saveData(); // save empty list to file
}
public void deleteLastPoint() {
if(points.size() > 0) {
points.remove(points.size() - 1);
notifyListeners(); // points changed so notify the listeners.
saveData(); // save updated list to file
}
}
private void notifyListeners() {
for(ModelListener l: listeners) {
l.update(); // Tell the listener that something changed.
}
}
public int numberOfPoints() {
return points.size();
}
public void saveData() {
try {
FileWriter writer = new FileWriter("points.txt");
for (Point p : points) {
writer.write(p.x + " " + p.y + "\n");
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void testModel() {
Model m = new Model();
m.addListener(new ModelListener() {
@Override
public void update() {
System.out.println(true + " (listener)");
}
});
System.out.println(m.getPoints() == m.points);
Point p1 = new Point(1, 2);
Point p2 = new Point(3, 4);
m.addPoint(p1); // Listener called.
m.addPoint(p2); // Listener called.
System.out.println(m.numberOfPoints() == 2);
System.out.println(m.points.get(0) == p1);
System.out.println(m.points.get(1) == p2);
m.deleteLastPoint(); // Listener called.
System.out.println(m.numberOfPoints() == 1);
System.out.println(m.points.get(0) == p1);
m.clearAllPoints(); // Listener called.
System.out.println(m.numberOfPoints() == 0);
m.notifyListeners(); // Listener called.
}
}
根据以下要求:Instead of using a text file to save all the point coordinates one by one, change the savaData method and the constructor of the Model class to use object serialization and a binary file called "points.bin" to write / read the whole arraylist of points to / from the file in one operation.修改下述代码:import java.awt.Point; 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; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Scanner; public class Model { private ArrayList<Point> points; private ArrayList<ModelListener> listeners; public Model() { points = new ArrayList<Point>(); listeners = new ArrayList<ModelListener>(); // Read points from file if it exists File file = new File("points.txt"); if (file.exists()) { try { Scanner scanner = new Scanner(file); while (scanner.hasNextLine()) { String[] coordinates = scanner.nextLine().split(" "); int x = (int) Double.parseDouble(coordinates[0]); int y = (int) Double.parseDouble(coordinates[1]); points.add(new Point(x, y)); } scanner.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } } public void addListener(ModelListener l) { listeners.add(l); } public ArrayList<Point> getPoints() { return points; } public void addPoint(Point p) { points.add(p); notifyListeners(); // points changed so notify the listeners. saveData(); // save point to file } public void clearAllPoints() { points.clear(); notifyListeners(); // points changed so notify the listeners. saveData(); // save empty list to file } public void deleteLastPoint() { if (points.size() > 0) { points.remove(points.size() - 1); notifyListeners(); // points changed so notify the listeners. saveData(); // save updated list to file } } private void notifyListeners() { for (ModelListener l : listeners) { l.update(); // Tell the listener that something changed. } } public int numberOfPoints() { return points.size(); } public void saveData() { try { FileWriter writer = new FileWriter("points.txt"); for (Point p : points) { writer.write(p.x + " " + p.y + "\n"); } writer.close(); } catch (IOException e) { e.printStackTrace(); } }
以下是修改后的代码:
import java.awt.Point;
import java.io.*;
public class Model implements Serializable {
private ArrayList<Point> points;
private ArrayList<ModelListener> listeners;
private static final String FILE_NAME = "points.bin";
public Model() {
points = new ArrayList<Point>();
listeners = new ArrayList<ModelListener>();
// Read points from file if it exists
File file = new File(FILE_NAME);
if (file.exists()) {
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
points = (ArrayList<Point>) in.readObject();
in.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public void addListener(ModelListener l) {
listeners.add(l);
}
public ArrayList<Point> getPoints() {
return points;
}
public void addPoint(Point p) {
points.add(p);
notifyListeners(); // points changed so notify the listeners.
saveData(); // save point to file
}
public void clearAllPoints() {
points.clear();
notifyListeners(); // points changed so notify the listeners.
saveData(); // save empty list to file
}
public void deleteLastPoint() {
if (points.size() > 0) {
points.remove(points.size() - 1);
notifyListeners(); // points changed so notify the listeners.
saveData(); // save updated list to file
}
}
private void notifyListeners() {
for (ModelListener l : listeners) {
l.update(); // Tell the listener that something changed.
}
}
public int numberOfPoints() {
return points.size();
}
public void saveData() {
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(FILE_NAME));
out.writeObject(points);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里我们使用了Java的序列化机制来保存整个ArrayList对象,同时将数据保存到了一个二进制文件中(名为"points.bin")。在构造函数中,我们首先检查是否存在该文件,如果存在,则通过ObjectInputStream读取该文件并将ArrayList对象恢复到程序中。在saveData()方法中,我们使用ObjectOutputStream将整个ArrayList对象写入文件。注意:我们还必须将Model类实现Serializable接口来支持序列化。