package com.heepie.memo.file;
import java.io.*;
import java.util.ArrayList;
class Model {
private final String DB_DIR = "/Users/Heepie/eclipse-workspace/java";
private final String DB_FILE = "memo.txt";
private File database = null;
ArrayList<Memo> list = new ArrayList<>();
// 마지막 글번호를 저장하는 변수
int lastIndex = 1;
public Model() {
File dir = new File(DB_DIR);
// 디렉토리 존재 확인
if (!dir.exists()) {
dir.mkdirs();
}
// window = \
// linux 계열 = /
// 파일 path 설정
File file = new File (DB_DIR + File.separator + DB_FILE);
// 파일 존재유무
if (!file.exists()) {
try {
file.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
}
database = file;
}
private final String COLUMN_SEP = "::";
// 생성
public void create(Memo item) {
item.no = lastIndex++;
FileOutputStream fos = null;
try {
// 1. 스트림을 연다
fos = new FileOutputStream(database, true);
// 2. 스트림을 중간처리 (텍스트의 인코딩 변경)
OutputStreamWriter osw = new OutputStreamWriter(fos);
// 3. 버퍼로 확장
BufferedWriter bw = new BufferedWriter(osw);
// 저장할 내용을 구분자로 분리하여 한줄의 문자열로 변경 Stream에 저장하기 위해서
String row = item.no + COLUMN_SEP + item.name + COLUMN_SEP + item.content + COLUMN_SEP + item.datetime + "\n";
bw.append(row);
bw.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 읽기
public Memo read(int no) {
for (Memo item : list) {
if (item.no == no) {
return item;
}
}
return null;
}
public boolean update(Memo newItem) {
boolean isExit = delete(newItem.no);
if (isExit) {
list.add(newItem);
return isExit;
}
return false;
}
public boolean delete(int no) {
for (Memo item : list) {
if (item.no == no) {
list.remove(item);
return true;
}
}
return false;
}
public ArrayList<Memo> showAllData() {
// ArrayList 저장소 내역 출력
return getList();
}
// 모든 목록을 가져와 ArrayList<Memo>에 입력하기 위한 메소드
public ArrayList<Memo> getList() {
// list가 전역으로 선언되어 있어 읽기가 2번 생성되면 똑같은 2개, 3번이면 3개의 데이터가 계속 중복으로 생성된다.
// 그래서 클리어를 선언해주어야 한다.
list.clear();
// 1. 읽는 스트림 생성
try (FileInputStream fis = new FileInputStream(database)) {
// 2. 실제 파일 엔코딩을 바꿔주는 래퍼 클래스
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
// 3. 버퍼처리
BufferedReader br = new BufferedReader(isr);
String row;
// 새로운 줄을 한줄씩 읽어 row 저장
// 더 이상 읽을 데이터가 없으면 null 리턴
while((row = br.readLine()) != null) {
String tmpRow[] = row.split(COLUMN_SEP);
Memo item = new Memo();
item.no = Integer.parseInt(tmpRow[0]);
item.name = tmpRow[1];
item.content = tmpRow[2];
item.datetime = Long.parseLong(tmpRow[3]);
list.add(item);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
댓글