해당 코드는 현재 수업을 받고 있는 동생의 코드를 변경한 것이다.
package Ex2;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Day18Quiz9 extends JFrame implements ActionListener{
JLabel name, age, pos, tel;
JTextField tfName, tfAge, tfPos,tfTel;
JButton save, exit;
Crew crew;
static ArrayList<Crew> list;
Day18Quiz9(){
setLayout(null);
name = new JLabel("이름", JLabel.CENTER);
age = new JLabel("나이", JLabel.CENTER);
pos = new JLabel("직급", JLabel.CENTER);
tel = new JLabel("전화번호", JLabel.CENTER);
tfName = new JTextField();
tfAge = new JTextField();
tfPos = new JTextField();
tfTel = new JTextField();
save = new JButton("저장");
exit = new JButton("종료");
add(name);
add(age);
add(pos);
add(tel);
add(tfName);
add(tfAge);
add(tfPos);
add(tfTel);
add(save);
add(exit);
save.addActionListener(this);
exit.addActionListener(this);
name.setBounds(160, 50, 100, 50);
age.setBounds(160, 150, 100, 50);
pos.setBounds(160, 250, 100, 50);
tel.setBounds(160, 350, 100, 50);
tfName.setBounds(400, 50, 250, 50);
tfAge.setBounds(400, 150, 250, 50);
tfPos.setBounds(400, 250, 250, 50);
tfTel.setBounds(400, 350, 250, 50);
save.setBounds(100, 450, 250, 60);
exit.setBounds(400, 450, 250, 60);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("사원 정보 입력");
setBounds(200,200,800,600);
setVisible(true);
}
public static void main(String[] args) {
list = new ArrayList<Crew>(); // 저장할때마다 새로운 list를 만들면 기존 정보가 날아가기에 고정값을 유지시키고자 코드.
new Day18Quiz9();
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj == save) {
try {
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream("c:\\memberInfo2.txt",false));
crew = new Crew(tfName.getText(),
Integer.parseInt(tfAge.getText()),tfPos.getText(),tfTel.getText());
list.add(crew);
oos.writeObject(list);
oos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else if (obj == exit) {
System.exit(0);
}
}
}
package Ex2;
import java.io.Serializable;
public class Crew implements Serializable {
String name;
int age; //나이 기밀사항. 11번 답) int 앞에 transient 기입
String pos;
String tel;
Crew() {}
public Crew(String name, int age, String pos, String tel) {
super();
this.name = name;
this.age = age;
this.pos = pos;
this.tel = tel;
}
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;
}
public String getPos() {
return pos;
}
public void setPos(String pos) {
this.pos = pos;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "Crew [name=" + name + ", age=" + age + ", pos=" + pos + ", tel=" + tel + "]";
}
}
package Ex2;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextArea;
public class Day18Quiz10 extends JFrame implements ActionListener {
JMenuBar bar;
JMenu menu;
JMenuItem open, exit;
JTextArea jta;
static ArrayList<Crew> cList;
Day18Quiz10() {
bar = new JMenuBar();
menu = new JMenu("FILE");
open = new JMenuItem("OPEN");
exit = new JMenuItem("EXIT");
jta = new JTextArea();
setJMenuBar(bar);
bar.add(menu);
menu.add(open);
menu.addSeparator();
menu.add(exit);
add(jta);
Font f = new Font("맑은 고딕", Font.BOLD, 20);
jta.setFont(f);
open.addActionListener(this);
exit.addActionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(200,200,800,600);
setTitle("사원정보 출력");
setVisible(true);
}
public static void main(String[] args) {
cList = new ArrayList<Crew>();
new Day18Quiz10();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == open) {
jta.setText(""); // 파일을 오픈할 떄마다. 기존에 기록한 정보를 청소.
JFileChooser jfc = new JFileChooser();
if(jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
try {
ObjectInputStream ois = new ObjectInputStream
(new FileInputStream(jfc.getSelectedFile()));
BufferedReader br = new BufferedReader
(new FileReader(jfc.getSelectedFile()));
String str = null;
ArrayList<Crew> cList = (ArrayList<Crew>) ois.readObject();
// 데이터를 내보낼때 ArrayList 형태로 내보냈음.
while((str = br.readLine()) != null) {
for(Crew c : cList) { //리스트 형식을 JTextArea에 기록.
jta.append(c.getName() + "\n");
jta.append(c.getAge() + "\n");
jta.append(c.getPos() + "\n");
jta.append(c.getTel() + "\n");
}
for(Crew c : cList) {
System.out.println(c.toString());
}
}
br.close(); // 스트림 종료.
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
} else if (e.getSource() == exit) {
System.exit(0);
}
}
}
읽어오는 메모장에 crew객체가 아무리많아도 내가 아는 방법으로는 아무리해도 맨 앞에 객체 한개로 읽어왔다.
그래서 crew객체를 읽을때마다 초기화 할 수 없는건가 싶었는데,
readObject()로 불러오고,
다음 readObject()는 String을 Crew로 변환할 수 없다고 오류가 나왔다.
Syetem.out.println()으로 확인시 개행으로 보여지고,
Crew객체를 변환하지않고 Syetem.out.println() 로 확인해보니 텍스트파일에 직렬화된채로 넘어왔다.
그래서 먼저
이를 readLine()과 섞어서 반복문에 넣어보니
jta.append(c.getName() + "\n");
jta.append(c.getAge() + "\n");
jta.append(c.getPos() + "\n");
jta.append(c.getTel() + "\n");
로 표현된 데이터는 역직렬화된 첫 crew의 데이터고,
저 내용이 반복되는건 다음 crew객체의 데이터로 초기화되지 않은것이 아니라,
readLine()에 의해 반복실행 되고 있을 뿐임을 확인할 수 있었다.
그래서 다음 텍스트라인을 crew객체로 인지할 수 있는 방법을 고민했으나,
애초에 개행 전에
Crew crew = (Crew)ois.readObject();
로 받아온 것을 어떻게 다음 줄이 영향이 있을까
그래서 따로 List 객체를 만들어서 거기에 넣고,
그 List객체를 텍스트파일에 저장한걸 가져오려고도 해봤으나
새로 데이터를 저장하면, 결국 다음 객체로 기입이 됐다.
어떤 방법을 써도 결국 문제는
텍스트파일에 2개 이상의 객체를 저장하고, 그걸 읽어내야 했다.
그러다 결국 시선을 바꿔
처음부터 왠지 거슬렸으나 손대지 않았던..
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream("c:\\memberInfo2.txt",true));
를
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream("c:\\memberInfo2.txt",false));
로 바꿨고
추가하는 데이터는 ArrayList에 저장해서, 데이터가 추가된 채로 ArrayList를 새로 텍스트파일에 매번 새로 작성하고,
그 텍스트파일을 불러오는 방식을 채택했다.
배열은 데이터가 추가되면, 기존의 텍스트파일에 직렬화한 정보는 지우고, 데이터가 추가된 버전으로
직렬화해 텍스트파일에 기록하니
결국 객체는 배열하나인 상태로
읽어오는 프로그램이 모든 정보를 소환할 수 있도록 코딩할 수 있었다.
DB를 활용하면 사실... 고민할 필요도 없는 내용이긴하지만
오랜만에 자바를 활용해 고민해보는 시간이 재밌었다.
'궁금해서 혹은 재밌어서 만들어보는 JAVA' 카테고리의 다른 글
Promise( AJAX, AXOIS ) 와 같은 비동기 연산 처리 ( 자바스크립트 ) (1) | 2023.11.29 |
---|---|
독학사 공부하다 만들어본 큐(Queue) (0) | 2021.04.16 |
독학사 교재 보다 만들어본 STACK (0) | 2021.04.16 |