열면 꼭 닫아줘야 한다. 연결이 되어 있는 상태에서는 다른 파일이나 접근하고자 하는 대상이 접근할수가 없기 때문에 수많은 문제가 생길 수 있다. 열었던 순서의 역순으로 닫아줘야 오류가 나는걸 막을 수 있다는 점도 잊지 말자.
Scanner를 사용하는 반복문을 써야 한다면, catch문에서 Scanner를 초기화해줘야 한다. 그렇지 않으면 System.in 클래스에서 더이상 값을 받을 수 없는 상태가 되어 무한루프에 빠지게 된다.
int age = 0;
while(true) {
try {
System.out.println("4. 나이를 입력하세요");
age = s.nextInt();
break;
} catch(InputMismatchException e) {
s = new Scanner(System.in);
System.out.println("정상적인 나이를 입력하세요");
}
}
멤버 리스트를 쉽게 저장할 수 있도록 ArrayList를 활용했고, 각 데이터의 분류가 쉽도록 list를 출력해야 할 때 .csv파일로 저장하도록 했다.
//멤버 Value Object
package study0311.crudfile;
import java.io.Serializable;
public class MemberVO implements Serializable{
/**
*
*/
private static final long serialVersionUID = 8703985010418615479L;
private String id;
private String pw;
private String name;
private int age;
public MemberVO() {}
public MemberVO(String id, String pw, String name, int age) {
this.id = id;
this.pw = pw;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
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 id + "," + pw + "," + name + "," + age;
}
}
//액션 인터페이스
package study0311.crudfile;
import java.util.Scanner;
public interface Action {
void excute(Scanner s);
}
//서비스 클래스
package study0311.crudfile;
import java.util.Scanner;
public class MemberService {
void process(Action a, Scanner s) {
a.excute(s);
}
}
//메인클래스
package study0311.crudfile;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class MemberMain {
static List<MemberVO> mbv = new ArrayList<MemberVO>();
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
MemberService ms = new MemberService();
ms.process(new ActionSave(), s);
ms.process(new ActionRead(), s);
while(true) {
System.out.printf("\n\n\n\n\n\n\n\n\n\n");
System.out.println("CRUD Project(ArrayList-File)");
System.out.println("");
System.out.println("1. Create");
System.out.println("2. user lists");
System.out.println("3. Update user info");
System.out.println("4. Delete user");
System.out.println("5. Make user file(.CSV)");
System.out.println("6. Quit");
String command = s.next();
switch(command) {
case "1" :
ms.process(new ActionCreate() , s);
break;
case "2" :
ms.process(new Actionlist(), s);
break;
case "3" :
ms.process(new ActionUpdate(), s);
break;
case "4" :
ms.process(new ActionDelete(), s);
break;
case "5" :
ms.process(new ActionCSV(), s);
break;
case "6" :
ms.process(new ActionSave(), s);
System.out.println("프로그램을 종료합니다.");
s.close();
return;
default :
break;
}
}
}
}
//계정 생성 (Create)
package study0311.crudfile;
import java.util.InputMismatchException;
import java.util.Scanner;
public class ActionCreate implements Action{
@Override
public void excute(Scanner s) {
System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
System.out.println("[ 계정 생성 ]");
String id = null;
boolean idCheck = true;
while(idCheck) {
System.out.println("1. 아이디를 입력하세요");
id = s.next();
idCheck = false;
for(MemberVO mv : MemberMain.mbv) {
if(id.equals(mv.getId())) {
System.out.println("중복되는 ID입니다.");
idCheck = true;
break;
}
}
}
System.out.println("2. 비밀번호를 입력하세요");
String pw = s.next();
System.out.println("3. 이름을 입력하세요");
String name = s.next();
int age = 0;
while(true) {
try {
System.out.println("4. 나이를 입력하세요");
age = s.nextInt();
break;
} catch(InputMismatchException e) {
s = new Scanner(System.in);
System.out.println("정상적인 나이를 입력하세요");
}
}
MemberVO m = new MemberVO(id, pw, name, age);
MemberMain.mbv.add(m);
}
}
//멤버 목록 (Read)
package study0311.crudfile;
import java.util.List;
import java.util.Scanner;
public class Actionlist implements Action{
@Override
public void excute(Scanner s) {
List<MemberVO> m = MemberMain.mbv;
System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
System.out.println("[ 회원 목록 ]");
System.out.println("총 회원수 : " + m.size());
for(MemberVO mv : m) {
System.out.printf("[ ID : %s ] PW : '%s', Name : '%s', Age : '%s'\n",mv.getId(),mv.getPw(),mv.getName(),mv.getAge());
}
System.out.println("메인으로 이동하시려면 아무 키나 입력하세요");
s.next();
}
}
//계정 수정 (Update)
package study0311.crudfile;
import java.util.List;
import java.util.Scanner;
public class ActionUpdate implements Action{
@Override
public void excute(Scanner s) {
List<MemberVO> m = MemberMain.mbv;
while(true) {
System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
System.out.println("3. Update user info");
System.out.println("수정할 계정의 ID를 입력하세요");
String id = s.next();
System.out.println("수정할 계정의 PW를 입력하세요");
String pw = s.next();
for(MemberVO mv : m) {
if(id.equals(mv.getId()) && pw.equals(mv.getPw())) {
while(true) {
System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
System.out.println("[ 수정할 정보를 선택하세요 ]");
System.out.println("1. 비밀번호");
System.out.println("2. 이름");
System.out.println("3. 나이");
System.out.println("4. 나가기");
String pick = s.next();
switch(pick) {
case "1":
System.out.println("새로운 비밀번호를 입력하세요");
String cPw = s.next();
mv.setPw(cPw);
break;
case "2":
System.out.println("새로운 이름을 입력하세요");
String cName = s.next();
mv.setName(cName);
break;
case "3":
System.out.println("새로운 나이를 입력하세요");
int cAge = s.nextInt();
mv.setAge(cAge);
break;
default :
return;
}
}
}
}
System.out.println("존재하지 않는 계정입니다. 메인으로 가려면 아무 키나 누르세요");
s.next();
return;
}
}
}
//계정 삭제 (Delete)
package study0311.crudfile;
import java.util.List;
import java.util.Scanner;
public class ActionDelete implements Action{
@Override
public void excute(Scanner s) {
while(true) {
List<MemberVO> m = MemberMain.mbv;
System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
System.out.println("4. Delete user");
System.out.println("삭제할 계정의 ID를 입력하세요");
String id = s.next();
System.out.println("삭제할 계정의 PW를 입력하세요");
String pw = s.next();
int checkNum = 0;
for(MemberVO mv : m) {
if(id.equals(mv.getId()) && pw.equals(mv.getPw())) {
m.remove(checkNum);
System.out.printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
System.out.printf("ID : %s 가 삭제되었습니다.\n",mv.getId());
System.out.println("1. 추가로 삭제");
System.out.println("2. 메인으로 가기");
String pick = s.next();
switch(pick) {
case "1":
checkNum = 0;
break;
default :
return;
}
break;
} else {
checkNum++;
}
}
if(checkNum == m.size() && checkNum != 0) {
System.out.println("존재하지 않는 계정입니다. 메인으로 가려면 아무 키나 누르세요");
s.next();
return;
} else if(checkNum == m.size() && checkNum == 0) {
System.out.println("계정이 하나도 없습니다. 메인으로 가려면 아무 키나 누르세요");
s.next();
return;
}
}
}
}
//프로그램 시작,종료시에 .info파일로 멤버 리스트 저장
package study0311.crudfile;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;
import java.util.Scanner;
public class ActionSave implements Action{
@Override
public void excute(Scanner s) {
List<MemberVO> m = MemberMain.mbv;
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream("userInfo.info");
oos = new ObjectOutputStream(fos);
oos.writeObject(m);
} catch (IOException e) {
System.out.println(e.toString());
} finally {
try {
oos.close();
fos.close();
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
}
//멤버 리스트 .csv파일화
package study0311.crudfile;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class ActionCSV implements Action{
@Override
public void excute(Scanner s) {
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter("users.csv");
bw = new BufferedWriter(fw);
fw.write("[ID],[PW],[NAME],[AGE]\n");
for(MemberVO mv : MemberMain.mbv) {
bw.write(mv.toString());
bw.flush();
bw.newLine();
}
} catch (IOException e) {
System.out.println(e.toString());
} finally {
try {
bw.close();
fw.close();
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
}