실습(총정리)
- boxOffice
1. DBConnecter.java(package dao)
- 변수 선언
private final static String PATH = "boxOffice.txt";
- getter 생성
public static String getPath() {
return PATH;
}
- 내용 덮어쓰기
public static BufferedWriter getWriter() throws IOException {
return new BufferedWriter(new FileWriter(PATH));
}
- 내용 추가하기
public static BufferedWriter getAppend() throws IOException {
return new BufferedWriter(new FileWriter(PATH, true));
}
- 내용 가져오기
public static BufferedReader getReader() throws IOException {
return new BufferedReader(new FileReader(PATH));
}
2. FilmVO.java(package vo)
- 필요한 변수 생성
private int ranking; // 순위
private String name; // 제목
private String releaseDate; // 개봉일
private long income; // 매출액
private int audience; // 관객수
private int screenCount; // 스크린수
- 생성자
public FilmVO() {;}
- getter, setter
public int getRanking() {
return ranking;
}
public void setRanking(int ranking) {
this.ranking = ranking;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getReleaseDate() {
return releaseDate;
}
public void setReleaseDate(String releaseDate) {
this.releaseDate = releaseDate;
}
public long getIncome() {
return income;
}
public void setIncome(long income) {
this.income = income;
}
public int getAudience() {
return audience;
}
public void setAudience(int audience) {
this.audience = audience;
}
public int getScreenCount() {
return screenCount;
}
public void setScreenCount(int screenCount) {
this.screenCount = screenCount;
}
- toString() 재정의
@Override
public String toString() {
String str = ranking + "\t" + name + "\t" + releaseDate + "\t";
str += income + "\t" + audience + "\t" + screenCount;
return str;
}
3. FilmDAO.java(package dao)
- 마지막 순위
public int getLastRanking() throws IOException{
BufferedReader br = DBConnecter.getReader();
int lastRanking = 0;
while(br.readLine() != null) {
lastRanking ++;
}
return lastRanking;
}
- 추가와 삽입
public void appendAndInsert(FilmVO film) throws IOException{
if(film.getRanking() != 0) { // 전달받은 film이 0이 아니면(순위를 전달하면)
insert(film); // 삽입
return; // 삽입을 했다면 추가할 필요가 없기 때문에 return으로 막아준다.
}
// 전달받은 film이 0이라면 추가(순위를 전달하지 않으면)
append(film);
}
- 추가
// 마지막 순위 다음에 영화를 추가하기 때문에 영화 순위는 전달받지 않는다.
private void append(FilmVO film) throws IOException{ // FilmVO film : 새로운 정보
BufferedReader br = DBConnecter.getReader();
int lastRanking = 0; // 순위
String data = null; // 추가할 영화 정보
String content = null; // 전체 내용
while(br.readLine() != null) {
lastRanking ++;
}
br.close();
// 전체 내용을 문자열로 가져온다.
// String() 생성자에 byte를 넣어주면 문자열로 바꿔준다.
content = new String(Files.readAllBytes(Paths.get(DBConnecter.getPath())));
// 전체 내용 중 가장 마지막 문자가 \n인지 검사한다.
// 새로 추가되는 영화를 줄바꿈하여 추가하기 위해 검사가 필요하다.
// 만약 마지막에 \n이 없다면 data에 \n부터 추가해준다.
data = content.charAt(content.length() - 1) == '\n' ? "" : "\n";
// substring() : 문자열을 자를 때 사용하는 메소드
// indexOf("\t") : 중복값이 있을 경우 제일 처음 발견되는 값이 잘라진다.(순위가 제외된다.)
// lastRanking + 1 : 순위를 제외한 나머지 정보 앞에 계산한 마지막 순위를 연결해준다.
data += lastRanking + 1 + film.toString().substring(film.toString().indexOf("\t"));
BufferedWriter bw = DBConnecter.getAppend();
bw.write(data);
bw.close();
}
- 삽입
private void insert(FilmVO film) throws IOException{
BufferedReader br = DBConnecter.getReader();
String line = null;
String temp = "";
int newRanking = film.getRanking();
boolean check = false;
while((line = br.readLine()) != null) {
// 삽입할 순위 검색
if(Integer.parseInt(line.split("\t")[0]) == film.getRanking()) {
// 삽입
temp += film.toString() + "\n";
check = true;
}
// 삽입되었다면 순위 변경
// - 기존 랭킹을 전위형으로 1씩 증가시키기 때문에 기존순위 + 1로 변경된다.
// line.substring(line.indexOf("\t")) : 순위를 제외한 영화 정보
// 삽입이 안되었다면 순위 유지
temp += check ? ++newRanking + line.substring(line.indexOf("\t")): line;
temp += "\n";
}
br.close();
// 덮어쓰기
BufferedWriter bw = DBConnecter.getWriter();
bw.write(temp);
bw.close();
}
- 수정
// 영화 제목만 수정이 가능하다고 가정한다.
// 영화 제목에 중복이 있을 수 있기 때문에, 영화 순위끼리 비교하여 정확한 수정을 유도한다.
// 외부에서 수정한 영화의 전체 정보를 받는다.
public void update(FilmVO film) throws IOException {
BufferedReader br = DBConnecter.getReader();
String line = null;
String temp = "";
while((line = br.readLine()) != null) {
if(Integer.parseInt(line.split("\t")[0]) == film.getRanking()) {
temp += film.toString() + "\n";
continue;
}
temp += line + "\n";
}
br.close();
BufferedWriter bw = DBConnecter.getWriter();
bw.write(temp);
bw.close();
}
- 삭제
// 외부에서 삭제할 영화의 순위를 전달받는다.
// 영화가 삭제되면 아래의 영화 순위들이 위로 하나씩 올라와야 한다.
public void delete(int ranking) throws IOException {
BufferedReader br = DBConnecter.getReader();
String line = null;
String temp = "";
boolean check = false;
int deletedRanking = ranking;
while((line = br.readLine()) != null) {
if(Integer.parseInt(line.split("\t")[0]) == ranking) {
check = true;
continue;
}
// line.substring(line.indexOf("\t"))
// 첫 번째 "\t"의 다음부터 마지막까지를 의미한다.
temp += check ? deletedRanking++ + line.substring(line.indexOf("\t")) : line;
temp += "\n";
}
br.close();
BufferedWriter bw = DBConnecter.getWriter();
bw.write(temp);
bw.close();
}
- 콤마 지우기
public String removeComma(String data) {
return data.replaceAll(",", "");
}
- S 지우기
public String removeS(String data) {
return data.replaceAll("S", "");
}
- 검색
// 영화 제목으로 조회
// 사용자가 입력한 키워드가 제목에 포함되어 있으면 결과에 담아준다.
// 예) "아" 검색 시 "아바타"도 검색 결과에 포함
// 외부에서 사용자가 검색하고자 하는 키워드를 전달받는다.
// 검색 결과는 한 개가 아니라 여러 개이므로 ArrayList에 담아서 리턴한다.
public ArrayList<FilmVO> selectFilm(String keyword) throws IOException{
BufferedReader br = DBConnecter.getReader();
ArrayList<FilmVO> films = new ArrayList<>();
String line = null;
FilmVO film = new FilmVO();
while((line = br.readLine()) != null) {
String[] filmDatas = line.split("\t");
if(filmDatas[1].contains(keyword)) {
film = new FilmVO();
film.setRanking(Integer.parseInt(filmDatas[0]));
film.setName(filmDatas[1]);
film.setReleaseDate(filmDatas[2]);
film.setIncome(Long.parseLong(removeComma(filmDatas[3].equals("") ? "0" : filmDatas[3]))); // 콤마
film.setAudience(Integer.parseInt(removeS(removeComma(filmDatas[4])))); // S, 콤마
film.setScreenCount(Integer.parseInt(removeS(removeComma(filmDatas[5])))); // S, 콤마
films.add(film);
}
}
br.close();
return films;
}
- 목록
// 전체 정보 리턴
public ArrayList<FilmVO> selectAll() throws IOException{
BufferedReader br = DBConnecter.getReader();
ArrayList<FilmVO> films = new ArrayList<>();
String line = null;
FilmVO film = null;
while((line = br.readLine()) != null) {
String[] filmDatas = line.split("\t");
film = new FilmVO();
film.setRanking(Integer.parseInt(filmDatas[0]));
film.setName(filmDatas[1]);
film.setReleaseDate(filmDatas[2]);
film.setIncome(Long.parseLong(removeComma(filmDatas[3].equals("") ? "0" : filmDatas[3]))); // 콤마
film.setAudience(Integer.parseInt(removeS(removeComma(filmDatas[4])))); // S, 콤마
film.setScreenCount(Integer.parseInt(removeS(removeComma(filmDatas[5])))); // S, 콤마
films.add(film);
}
br.close();
return films;
}
'웹 개발 > Java' 카테고리의 다른 글
[Web_JAVA] 43 (0) | 2022.03.29 |
---|---|
[Web_JAVA] 41 (0) | 2022.03.27 |
[Web_JAVA] 40 (0) | 2022.03.26 |
[Web_JAVA] 39 (0) | 2022.03.25 |
[Web_JAVA] 38 (0) | 2022.03.24 |