이안의 평일코딩

JAVA의 정석 32일차 - 영화 정보 프로그램(1) 본문

Back-end/Java

JAVA의 정석 32일차 - 영화 정보 프로그램(1)

이안92 2020. 7. 28. 12:16
반응형

2020.07.28(화)

 

1. 입출력 I/O

(1) FileReader, FileWriter, FileInputStream, FileOutputStream

package com.sist.temp;
import java.io.*;
import java.util.*; // split, StringTokenizer

public class MainClass {
	public static void main(String[] args) {
		// 파일 읽기 => 예외처리
		FileReader fr = null; // 파일 읽기
		// 파일에 저장 : FileWriter ==> 문자 스트림 (한글 포함) => 2byte
		/*
		 * 	FileInputStream
		 * 	FileOutputStream
		 * 	================== 1byte (png, jpg... zip)
		 */
		try {
			// 파일 읽기
			fr = new FileReader("c:\\javaDev\\daum_movie.txt");
			StringBuffer sb = new StringBuffer();
			int i = 0; // 한글자 읽기 => 문자의 번호
			while((i=fr.read())!=-1) {
				//System.out.print((char)i);
				sb.append(String.valueOf((char)i));
			}
			System.out.println(sb.toString());
		}catch(Exception ex) {
			/* 에러 처리 => 디버깅
			 * 
			 * 에러 메세지 확인 getMessage()
			 * Trace => 실행과정 => 해당위치 찾기 printStackTrace()
			 */
			ex.printStackTrace();
		}finally {// 파일 닫기, 쓰레드 종료, 네트워크 서버 종료, 오라클 연결 해제
			try{
				fr.close();
			}catch(Exception ex) {}
		}
	}
}

 

2) BufferedReader

package com.sist.temp;
import java.io.*;
public class MainClass3 {
	public static void main(String[] args) {
		try {
			FileInputStream fis = new FileInputStream("c:\\javaDev\\daum_movie.txt");
			//BufferedReader 한줄씩 불러옴
			BufferedReader br = new BufferedReader(new InputStreamReader(fis));
			// InputStreamReader => 1byte => 2byte로 변환 (한글 안깨짐)
			// 네트워크, 메모리, 파일
			while(true) {
				String data = br.readLine();
				if(data==null) break;
				System.out.println(data);
			}
			fis.close();
		}catch(Exception ex) {
			System.out.println(ex.getMessage());
		}
	}
}

 

3) StringTokenizer

package com.sist.temp;

import java.io.*;
import java.util.StringTokenizer;

import com.sun.org.apache.xml.internal.utils.StringToIntTable;

public class MainClass4 {

	public static void main(String[] args) {
		try {
			// 파일 읽기
			FileReader fr = new FileReader("c:\\javaDev\\daum_movie.txt");
			int i = 0;
			// 데이터를 저장할 문자열
			String data="";
			while((i=fr.read())!=-1) { // -1 EOF
				data+=String.valueOf((char)i);
			}
			fr.close(); // 파일 닫기
			System.out.println(data);
			// 분해
			// 1. 한줄씩
			/*String[] movies = data.split("\n");
			for(String s : movies) {
				System.out.println(s);
				System.out.println("===========================");
			}*/
			StringTokenizer st = new StringTokenizer(data,"\n");
			while(st.hasMoreTokens()) {
				System.out.println(st.nextToken());
				System.out.println("============================");
			}
			
		}catch(Exception ex) {
			System.out.println(ex.getMessage());
		}
	}
}

 

2. 영화 예매 & 추천 프로그램

 

MovieVO

package com.sist.data;

public class MovieVO {
	private int mno; //영화번호
	private int cno; //Category
	private String title;
	private String poster;
	private String director;
	private String actor;
	private String genre;
	private String grade;
	private String regdate;
	private String score;
	private int showUser;
	private String story;
	public int getMno() {
		return mno;
	}
	public String getScore() {
		return score;
	}
	public void setScore(String score) {
		this.score = score;
	}
	public void setMno(int mno) {
		this.mno = mno;
	}
	public int getCno() {
		return cno;
	}
	public void setCno(int cno) {
		this.cno = cno;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getPoster() {
		return poster;
	}
	public void setPoster(String poster) {
		this.poster = poster;
	}
	public String getDirector() {
		return director;
	}
	public void setDirector(String director) {
		this.director = director;
	}
	public String getActor() {
		return actor;
	}
	public void setActor(String actor) {
		this.actor = actor;
	}
	public String getGenre() {
		return genre;
	}
	public void setGenre(String genre) {
		this.genre = genre;
	}
	public String getGrade() {
		return grade;
	}
	public void setGrade(String grade) {
		this.grade = grade;
	}
	public String getRegdate() {
		return regdate;
	}
	public void setRegdate(String regdate) {
		this.regdate = regdate;
	}
	
	public int getShowUser() {
		return showUser;
	}
	public void setShowUser(int showUser) {
		this.showUser = showUser;
	}
	public String getStory() {
		return story;
	}
	public void setStory(String story) {
		this.story = story;
	}
	
}

 

MovieManager

package com.sist.data;
// 데이터 관리 
import java.util.*;
import java.io.*;
/*
 *    프로그램 작성 
 *    = 파일 : 분리할 수 없다 => 전체를 통으로 저장  ======> AI
 *      = 1. 전체 파일을 읽어서 분리 => 메모리에 저장 
 *                                ===== ArrayList
 *           FileReader
 *           StringTokenizer,split 
 *      = 2. 메모리에서 제어 
 *    = 오라클 : 분리가 되어 있는 상태 
 *      = 필여시마다 오라클에 연결 => 메소드안에서 처리 
 */
public class MovieManager {
    // 데이터 저장 
	private static ArrayList<MovieVO> list=
			 new ArrayList<MovieVO>();
	// 모든 자바파일에서 공통으로 사용 => 반드시 static
	// 프로그램 시작 => 데이터 수집 => ArrayList에 저장후 시작 
	static
	{
		try
		{
			/*
			 *   파일 읽기 => 
			 *   1.한글자씩 읽는 방법 => read()
			 *     FileInputStream
			 *     FileReader
			 *   2.한줄씩 읽는 방법  => readLine()
			 *     전체 데이터를 임시저장공간에 저장후 사용 
			 *     BufferedReader 
			 */
			// 저장된 파일 읽기 
			FileInputStream fr=new FileInputStream("c:\\javaDev\\daum_movie.txt");
			// 메모리에 전체데이터를 모아서 관리 
			BufferedReader in=new BufferedReader(new InputStreamReader(fr));
			while(true)
			{
				String movie=in.readLine(); // readLine() => \n
				if(movie==null) break; // 종료 => 파일을 다 읽은 경우 
				/*
				 *   154|5|젠틀맨(2020)|
				 *   https://img1.daumcdn.net/thumb/C155x225/?
				 *   fname=https%3A%2F%2Ft1.daumcdn.net%2Fmovie%
				 *   2Fmovie-private%2F24957778d17a376a087
				 *   65a121450bb5d9f53a496|평점 07 . 7|가이 리치|매튜 맥커너히|
				 *   범죄/액션|
				 *   2020.02.26 개봉|
				 *   113분, 청소년관람불가|
				 *   81482|정글에는 법칙이 있고, 범죄에도 품격이 있다! 유럽을 장악한 업계의 절대강자 '믹키 피어슨'(매튜 맥커너히)은 자신이 세운 마리화나 제국을 걸고 돈이라면 무엇이든 벌이는 미국의 억만장자와의 빅딜을 시작한다. 소문을 듣고 찾아온 무법자 '드라이 아이'(헨리 골딩)와 돈 냄새를 맡은 사립탐정 '플레처'(휴 그랜트)까지 게임에 끼어들게 되면서 오랫동안 지켜온 정글의 질서는 점점 무너지기 시작하는데… 2월 26일, 고품격 범죄 오락의 신세계가 펼쳐진다!
				 */
				StringTokenizer st=new StringTokenizer(movie,"|");
				while(st.hasMoreTokens())
				{
					MovieVO vo=new MovieVO();
					vo.setMno(Integer.parseInt(st.nextToken()));
					vo.setCno(Integer.parseInt(st.nextToken()));
					vo.setTitle(st.nextToken());
					vo.setPoster("https:"+st.nextToken());
					String score=st.nextToken();
					score=score.substring(score.indexOf("점")+1);
					vo.setScore(score.trim());
					vo.setDirector(st.nextToken());
					vo.setActor(st.nextToken());
					vo.setGenre(st.nextToken());
					String regdate=st.nextToken();
					regdate=regdate.substring(0,regdate.lastIndexOf("개"));
					vo.setRegdate(regdate);
					String grade=st.nextToken();
					grade=grade.substring(grade.indexOf(",")+1);
					vo.setGrade(grade.trim());
					// 90,000 ==> 90000
					vo.setShowUser(Integer.parseInt(st.nextToken().replace(",", "")));
					vo.setStory(st.nextToken());
					list.add(vo);
				}
			}
			
		}catch(Exception ex) 
		{
			System.out.println(ex.getMessage());
		}
	}
	
	public ArrayList<MovieVO> movieListData(int page)
	{
		ArrayList<MovieVO> movies=new ArrayList<MovieVO>();
		int i=0;
		int j=0;
		int pagecnt=(page*10)-10;
		/*
		 *    1page  => 0~9
		 *    2page  => 10~19
		 *    3page  => 20~29
		 */
		for(MovieVO vo:list)
		{
			// pagecnt => 저장 위치 
			if(i<10 && j>=pagecnt)
			{
				movies.add(vo);
				i++;// 10개씩 나눠주는 변수 
			}
			j++;// for돌아가는 횟수
		}
		return movies;
	}
	public int movieTotalPage()
	{
		return (int)(Math.ceil(list.size()/10.0));
		// ceil는 올림 메소드 
	}
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		System.out.print("페이지:");
		int page=scan.nextInt();
		
		MovieManager m=new MovieManager();
		System.out.println(page+" page / "+m.movieTotalPage()+" pages");
		
		// 데이터 읽기 
		ArrayList<MovieVO> list=m.movieListData(page);
		
		for(MovieVO vo:list)
		{
			System.out.println(vo.getTitle());
		}
		/*
		 * for(MovieVO vo:list) { if(vo.getTitle().contains(ss)) {
		 * System.out.println(vo.getTitle()); } }
		 */
	}
}

 

 

반응형
Comments