这是书中的一道练习题。题目是设计一个简单的员工信息系统,可以输入数据并显示输入的数据。 此练习的扩展要求我设计一个保存选项,将数组中的对象输出到 tmp 文件中。
我现在已经成功创建了保存的选项。 但我觉得目前的方法有点繁琐,需要多次调用类中的方法。
但是我不能将ObjectOutputStream直接放在类中,会出现IOException。 另外,下一个问题要求我创建一个读取文件的选项。 我不知道如何将数据读取后直接导入到数组中。
package myJava.exercise.ch12;
import java.io.BufferedReader;
import java.lang.*;
import java.util.Scanner;
import java.io.*;
public class ex12_06
{
public static void main(String args[])throws IOException
{
CPersonAccount obj = new CPersonAccount();
char runFunc='d';
Scanner keyboardInput = new Scanner(System.in);
while(runFunc!='q')
{
System.out.print("請選擇作業");
System.out.print("(i=輸入資料 s=依月薪資排序 d=顯示資料 q=離開 S=存檔):");
runFunc = keyboardInput.nextLine().charAt(0);
switch (runFunc)
{
case 'i':
obj.inputData();
break;
case 's':
obj.sortBySalary();
break;
case 'd':
obj.displayData();
break;
case 'S':
FileOutputStream fo = new FileOutputStream("C:\\myJava\\exercise\\ch12\\file\\ex6.tmp");
ObjectOutputStream os = new ObjectOutputStream(fo);
for(int i=0;i<obj.dataNum();i++){
os.writeObject(obj.saveName(i));
os.writeObject(obj.saveDegree(i));
os.writeObject(obj.saveId(i));
os.writeObject(obj.saveSalary(i));
}
os.close();
fo.close();
default:
break;
}
}
}
}
`your text`
class CPersonData{
public String name;
public String degree;
private String p_id;
private int salary;
public CPersonData(){
name = "~~~~~~~~";
degree = "~~~~~~~~";
salary = 0;
}
public CPersonData(String a,String b,String c,int d){
name = a;
degree = b;
p_id = c;
salary = d;
}
public int getSalary(){
return salary;
}
public String getId(){
return p_id;
}
public void show(){
System.out.print(name+"\t");
System.out.print(degree+"\t");
System.out.println(salary);
}
}
class CPersonAccount{
CPersonData personArr[] = new CPersonData[1];
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
String a,b,c;
int d;
public CPersonAccount(){}
public void inputData(){
for(int i=0;i<personArr.length;i++){
while (true) {
try{
System.out.println("請輸入員工姓名");
a = buf.readLine();
break;
}
catch(Exception e){
System.out.println("錯誤,請重新輸入");
}
}
while (true) {
try{
System.out.println("請輸入員工職別");
b = buf.readLine();
break;
}
catch(Exception e){
System.out.println("錯誤,請重新輸入");
}
}
while (true) {
try{
System.out.println("請輸入員工ID");
c = buf.readLine();
break;
}
catch(Exception e){
System.out.println("錯誤,請重新輸入");
}
}
while (true) {
try{
System.out.println("請輸入員工薪資");
d = Integer.parseInt(buf.readLine());
break;
}
catch(Exception e){
System.out.println("錯誤,請重新輸入");
}
}
personArr[i] = new CPersonData(a,b,c,d);
}
}
public void displayData(){
CPersonData tit = new CPersonData();
tit.show();
for(int i=0;i<personArr.length;i++){
System.out.print(personArr[i].name+"\t");
System.out.print(personArr[i].degree+"\t");
System.out.println(personArr[i].getSalary());
}
}
public void sortBySalary(){
}
public String saveName(int x){
return personArr[x].name;
}
public String saveDegree(int x){
return personArr[x].degree;
}
public String saveId(int x){
return personArr[x].getId();
}
public int saveSalary(int x){
return personArr[x].getSalary();
}
public int dataNum(){
return personArr.length;
}
}
如前所述,我尝试将 saveData 放入 CPersonAccount 类中,但会显示 IOException。 原来的练习材料是五笔。为了测试,我把数据改成了一笔。
我现在想问一下是否还有其他方法可以调整我导出档案的方式。 那我应该如何设计读取存档的功能呢
我根据评论做了一些更正。
case 'S':
FileOutputStream fo = new
FileOutputStream("C:\\myJava\\exercise\\ch12\\file\\ex6.tmp");
ObjectOutputStream os = new ObjectOutputStream(fo);
for(int i=0;i<obj.dataNum();i++){
String a = obj.saveName(i);
String b = obj.saveDegree(i);
String c = obj.saveId(i);
int d = obj.saveSalary(i);
os.writeObject(new CPersonAccount(a,b,c,d));
}
class CPersonAccount implements Serializable{
CPersonData personArr[] = new CPersonData[1];
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
String a,b,c;
int d;
public CPersonAccount(){}
public CPersonAccount(String st1,String st2,String st3,int in4){
a = st1;
b = st2;
c = st3;
d = in4;
for(int i=0;i<personArr.length;i++){
personArr[i]= new CPersonData(a,b,c,d);
}
}
import java.io.*;
import java.util.Scanner;
class CPersonData implements Serializable {
public String name;
public String degree;
private String p_id;
private int salary;
public CPersonData() {
name = "~~~~~~~~";
degree = "~~~~~~~~";
salary = 0;
}
public CPersonData(String a, String b, String c, int d) {
name = a;
degree = b;
p_id = c;
salary = d;
}
public int getSalary() {
return salary;
}
public String getId() {
return p_id;
}
public void show() {
System.out.print(name + "\t");
System.out.print(degree + "\t");
System.out.println(salary);
}
}
class CPersonAccount implements Serializable {
CPersonData personArr[] = new CPersonData[1];
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
String a, b, c;
int d;
public CPersonAccount() {
}
public void inputData() throws IOException {
for (int i = 0; i < personArr.length; i++) {
while (true) {
try {
System.out.println("請輸入員工姓名");
a = buf.readLine();
break;
} catch (Exception e) {
System.out.println("錯誤,請重新輸入");
}
}
while (true) {
try {
System.out.println("請輸入員工職別");
b = buf.readLine();
break;
} catch (Exception e) {
System.out.println("錯誤,請重新輸入");
}
}
while (true) {
try {
System.out.println("請輸入員工ID");
c = buf.readLine();
break;
} catch (Exception e) {
System.out.println("錯誤,請重新輸入");
}
}
while (true) {
try {
System.out.println("請輸入員工薪資");
d = Integer.parseInt(buf.readLine());
break;
} catch (Exception e) {
System.out.println("錯誤,請重新輸入");
}
}
personArr[i] = new CPersonData(a, b, c, d);
}
}
public void displayData() {
CPersonData tit = new CPersonData();
tit.show();
for (int i = 0; i < personArr.length; i++) {
System.out.print(personArr[i].name + "\t");
System.out.print(personArr[i].degree + "\t");
System.out.println(personArr[i].getSalary());
}
}
public void saveData(String filePath) throws IOException {
FileOutputStream fo = new FileOutputStream(filePath);
ObjectOutputStream os = new ObjectOutputStream(fo);
os.writeObject(this); // Write the entire object to the file
os.close();
fo.close();
}
public static CPersonAccount loadData(String filePath) throws IOException, ClassNotFoundException {
FileInputStream fi = new FileInputStream(filePath);
ObjectInputStream oi = new ObjectInputStream(fi);
CPersonAccount obj = (CPersonAccount) oi.readObject(); // Read the object from the file
oi.close();
fi.close();
return obj;
}
public int dataNum() {
return personArr.length;
}
}
public class ex12_06 {
public static void main(String args[]) throws IOException {
CPersonAccount obj = new CPersonAccount();
char runFunc = 'd';
Scanner keyboardInput = new Scanner(System.in);
while (runFunc != 'q') {
System.out.print("請選擇作業");
System.out.print("(i=輸入資料 s=依月薪資排序 d=顯示資料 q=離開 S=存檔 L=讀檔):");
runFunc = keyboardInput.nextLine().charAt(0);
switch (runFunc) {
case 'i':
obj.inputData();
break;
case 's':
obj.sortBySalary();
break;
case 'd':
obj.displayData();
break;
case 'S':
obj.saveData("C:\\myJava\\exercise\\ch12\\file\\ex6.tmp");
break;
case 'L':
obj = CPersonAccount.loadData("C:\\myJava\\exercise\\ch12\\file\\ex6.tmp");
break;
default:
break;
}
}
}
}
在这里你可以看到代码说明
1- CPersonData 和 CPersonAccount 类现在实现 Serialized 接口以支持序列化。 2- CPersonAccount 中的 saveData() 方法现在将整个对象而不是单个字段保存到文件中。 3-在 CPersonAccount 中添加了 loadData() 方法以从文件加载对象。 4-修改了 main 方法以包含从文件加载数据的选项(L 选项)。 5- 为反序列化期间的 IO 操作和类转换添加了异常处理。