일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 오라클
- typescript
- Oracle
- 이안의평일코딩
- 자바의정석
- php
- 자바스크립트 코딩테스트
- javascript
- Java의정석
- 리액트네이티브
- 리액트
- 자바스크립트
- spring
- ReactNative
- 정보처리기사실기
- 정보처리기사요약
- 스프링
- 타입스크립트
- 자스코테
- 정보처리기사실기정리
- CSS
- 국비IT
- 정보처리기사
- react
- 평일코딩
- 국비코딩
- 정보처리기사실기요약
- VUE
- 정보처리기사정리
- 코딩테스트
- Today
- Total
이안의 평일코딩
JAVA의 정석 31일차 - 입출력 I/O 본문
2020.07.27(월)
라이브러리 => import
1. java.lang
1) Object : 최상위 클래스
(1) clone() : 복제
(2) finalize() : 소멸자
(3) toString() : 객체를 문자열로 변환
2) String (StringBuffer)
(1) substring() : 문자를 추출
(2) indexOf(), lastIndexOf() => 문자를 찾는 경우(MVC)
(3) trim() : 로그인 처리, 사용자 입력값
(4) equals() : 실제 저장된 문자열을 비교 => 로그인처리, 우편번호...
(5) length() : 문자 갯수
(6) valueOf() : 유일하게 => static => 모든 데이터형을 문자열로 변환
(7) join() : 변환
*** StringBuffer : append() : 문자열
3) Wrapper : 클래스 형변환, 문자열을 다른 데이터형으로 변경
(1) Integer : parseInt() : 정수형변환
(2) Double : parseDouble() : 실수형변환
(3) Boolean : parseBoolean() : "true" => true, "false" => false
4) Math
(1) random()
(2) ceil() : 올림 (총페이지)
5) System
(1) gc() : 메모리 회수, exit() : 프로그램 종료
(2) web => 자동 메모리회수 (톰캣)
2. java.util
1) StringTokenizer : 문자를 분행 => split() => 정규식
(1) nextToken() : 한개의 구분 문자를 자른다
(2) hasMoreTokens() : 자를 갯수만큼 루프
2) Date, Calendar
(1) Date : 시스템의 시간, 날짜 읽기
Date date = new Date() => date.toString()
(2) Calendar : 요일 구하기, 달의 마지막 날짜 읽기
날짜 등록 => 월 (1....) month-1
요일 => week-1
package com.sist.lib;
import java.util.*;
import java.text.*; // 변환 (시간, 날짜) => SimpleDateFormat()
// yyyy 년도 => yy, 월 => M(MM), 일 => dd(d), 시간(h)hh, 분(mm), 초(s)
// h(1~12), H(0~23)
public class MainClass {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.toString()); // 표준 시간을 읽어 온다
// 변환 => 544page
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(sdf.format(date));
// 자바 => 오라클 => java.util.Date
}
}
3) Collection
(1) ArrayList : 비동기화 => 데이터베이스
(2) Vector : 동기화 => 네트워크에서 사용자 관리 (네트워크)
(3) HashMap : 키, 값 ==> 키(일반문자열), 값(클래스 주소) ==> 클래스 관리
= MyBatis : Mapper (데이터베이스 연결)
= Spring : Web
(4) 장점 : 모든 클래스, 데이터를 한번에 저장 => Object => 형변환
배열(고정), 가변
(5) 단점을 변경 => 제네릭스 프로그램
<원하는 데이터형> : 데이터형의 통일
3. ArrayList, Vector, Map
package com.sist.lib;
import java.util.*;
public class MainClass2 {
public static void main(String[] args) {
/*
* List
* ====
* |
* ---------------------------------------------------
* ArrayList 찾기(값가져오기) / Vector / LinkedList 빠른속도제어
* ArrayList : 비동기화(동시에, 속도 더 빠르지만 안정성떨어짐) 데이터베이스
* Vector : 동기화(하나 데이터 저장후 들어감) 네트워크
* 접근성 => 데이터 찾아서 출력
*
*/
// 셋다 동일하다
//ArrayList<String> names = new ArrayList<String>();
//Vector<String> names = new Vector<String>();
LinkedList<String> names = new LinkedList<String>(); //속도 가장빠름(Array, Vector는 번호를 변경해줘야되서)
// => 메모리안에는 => 문자열만 저장
names.add("홍길동"); //0
names.add("심청이"); //1
names.add("이순신"); //2
names.add("강감찬"); //3
names.add("춘향이"); //4
System.out.println("저장된 갯수:"+names.size());
// 출력
for(int i=0; i<names.size(); i++) {
// 데이터를 받을 때
String name = names.get(i);
// 원하는 위치에 저장된 데이터 읽기
System.out.println(name+":"+i); //인덱스는 자동 생성 => 0번부터 시작
}
// 원하는 위치에 출력
// 추가 add(index, "값")
names.add(3, "을지문덕"); //강감찬4 춘향이5 자동으로 밀림
for(int i=0; i<names.size(); i++) {
String name = names.get(i);
System.out.println(name+":"+i);
}
// 삭제
names.remove(2); //을지문덕2 강감찬3 춘향이4 자동으로 당겨옴
for(int i=0; i<names.size(); i++) {
String name = names.get(i);
System.out.println(name+":"+i);
}
// 수정
names.set(2, "박문수"); //을지문덕2 -> 박문수2로 바뀜
for(int i=0; i<names.size(); i++) {
String name = names.get(i);
System.out.println(name+":"+i);
}
// 전체 삭제
names.clear();
System.out.println("저장된 갯수"+names.size());
}
}
4. IO => Input(저장) / Output(읽기)
*** 1. 메모리 입출력
2. 파일 입출력
3. 네트워크 입출력
스트림 이용 => 데이터 통로 (정확한 전송)
단방향 (입력, 출력 통로가 다르다)
= 1byte (일반 파일)
바이트 스트림
InputStream / OutputStream => 인터페이스 => read/write
=> 업로드 / 다운로드
= 2byte (문자) => 한글
문자 스트림
***Reader / Writer (O) => 인터페이스
= 객체 자체를 저장 : 직렬화
===========
= ObjectInputStream
= ObjectOutputStream
= 속도를 빠르게 => Buffer
***BufferedInputStream
***BufferedOutputStream
===> XML, JSON CSV(별도로 파싱하는 방법이 따로 있다) : Web(Spring)
*** 주의점
1. 반드시 import java.io.*
2. 반드시 예외처리 (CheckException)
1. 파일 읽기
= FileInputStream (1byte) => 한글이 있는 경우에는 한글이 깨짐
= FileReader (2byte)
==================
1) 파일을 읽기
FileInputStream fis = new FileInputStream("절대경로명");
c:\\javaDev\\a.txt
while(파일끝까지) ==> -1(EOF)
{
출력
}
============
fis.close()
============ finally => try/catch에 상관없이 수행
*** 데이터 읽기 방법
1) 한글자 읽기
int read() => 글자번호
A => 65 ==> (char)i
2) 여러개를 동시에 읽는 경우
int read() => 읽은 바이트 리턴
*** 데이터 쓰기 (저장)
FileOutputStream
===========
write() => 한글자씩 저장
IO
= FileInputStream, FileReader
= FileOutputStream, FileWriter
= BufferedReader, BufferedWriter
= ObjectInputStream/ObjectOutputStream
= BufferedInputStream,BufferedOutputStream
==============================
데이터
======
정형화된 데이터 : 오라클 (***)
반정형화 데이터 : 구분이 된다 => 필요없는 데이터도 존재
html, xml, json
비정형화 데이터 : 구분도 없고, 뉴스, 트위터 => 빅데이터 => 지능형웹
=> REGEX(패턴)
5. 읽기
package com.sist.io;
import java.io.*;
public class MainClass {
public static void main(String[] args) {
//FileInputStream fis = null; // 반드시 초기값을 부여 => png, jpg, zip... 읽을 때 InputStream 사용
FileReader fis = null; // 한글이 포함된 파일을 읽어 올때
// 자바에서 저장 => Ansi로 저장이 된다
// 모든 클래스의 초기값 ==> null
try { // 파일 읽기
//fis = new FileInputStream("c:\\javaDev\\news1.txt");
fis = new FileReader("c:\\javaDev\\news1.txt"); // UTF-8대신 ANSI로 저장되어야 한글안깨짐
// 파일을 읽어서 도스창에 출력
int i = 0; // InputStream 한글자씩 읽는다 => 한글자씩 가지고 온다, 문자번호
while((i=fis.read())!=-1) {//-1 파일의 끝(EOF) 문장이 끝나기 전까지
System.out.print((char)i);
}
}catch(Exception ex) { // 에러 처리
System.out.println(ex.getMessage());
}finally { // 파일 닫기
try{
fis.close();
}catch(Exception ex) {}
}
}
}
6. 쓰기
package com.sist.io;
import java.io.*;
// 파일에 쓰기 => 회원가입, 댓글, 게시판
/*
* 파일 => 저장 => ArrayList
* 데이터 => ArrayList에 모아서 => 저장
*/
public class MainClass2 {
public static void main(String[] args) {
/*
* 파일 입출력
* ======
* r => read
* w => write => create
* a => append
* FileOutputStream(1byte저장)
* 생성자
* new FileOutputStream("경로명")
* new FileOutputStream("경로명", true/false) => false는 기본 Default
* FileWriter(2byte저장)
*
*/
//FileOutputStream fos = null;
FileWriter fos = null;
try {
// 생성
//fos = new FileOutputStream("c:\\javaDev\\temp.txt",true); //실행하면 만들어짐
// 저장 ==== append
fos = new FileWriter("c:\\javaDev\\temp.txt",true);
String str = "ABCDEFGHIJJKSDFJKL";
//fos.write('L');
//fos.write('M');
//fos.write('N');
//fos.write(str.getBytes());
fos.write(str+"\r\n");
// getBytes() => 문자열을 바이트 배열로 변경할 때 사용
System.out.println("저장완료!!");
}catch(Exception ex) { // 에러 처리
System.out.println(ex.getMessage());
}finally { //파일 닫기
// finally => 파일 닫기, 서버 닫기, 오라클 연결 해제
try{
fos.close();
}catch(Exception ex) {}
}
}
}
package com.sist.io;
import java.io.*;
import java.util.*; //ArrayList는 util에 들어있음
class Movie implements Serializable{ //개체를 통쨰로 저장하려면 Serializable 필요
private int mno;
private String title;
private String actor;
public int getMno() {
return mno;
}
public void setMno(int mno) {
this.mno = mno;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
}
public class MainClass3 {
public static void main(String[] args) {
try {
ArrayList<Movie> list = new ArrayList<Movie>();
Movie m = new Movie();
System.out.println(m);
m.setMno(1);
m.setTitle("홍길동전");
m.setActor("홍길동");
list.add(m);
// index = 0
m = new Movie(); // new를 쓰지 않으면 공간이 같아짐
System.out.println(m);
m.setMno(2);
m.setTitle("심청전");
m.setActor("심청");
list.add(m);
// index = 1
m = new Movie(); // 갯수만큼 new써야함
System.out.println(m);
m.setMno(3);
m.setTitle("춘향전");
m.setActor("춘향");
list.add(m);
// index = 2
ObjectOutputStream oos =
new ObjectOutputStream(
new FileOutputStream("c:\\javaDev\\movie_test.txt"));
oos.writeObject(list);
System.out.println("저장완료");
// for(int i=0; i<list.size(); i++) {
// Movie mm = list.get(i);
// System.out.println(mm.getActor());
// }
}catch(Exception ex) {
System.out.println(ex.getMessage());
}finally {
}
}
}
package com.sist.io;
import java.io.*; //try~catch절 나와야함 예의처리!
import java.util.*;
public class MainClass4 {
/*
* FileInputStream, FileReader
* FileOutputStream, FileWriter
* BufferedReader, File
*
* 자바 프로그램
* 자바 WEB프로그램 (스프링)
* ================= 공통기반 (예외처리)
*/
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(
new FileInputStream("c:\\javaDev\\movie_test.txt"));
ArrayList<Movie> list = (ArrayList<Movie>)ois.readObject();
// ================= 형변환
// 출력
for(Movie m : list) {
System.out.println(m.getMno()+" "+m.getTitle()+" "+m.getActor());
}
}catch(Exception ex) { // 에러 처리
System.out.println(ex.getMessage());
}finally {
try {
ois.close();
}catch(Exception ex) {}
}
}
}
7. 파일 업로드
package com.sist.io;
import java.util.*;
import java.io.*;
// 파일 업로드 (파일 Copy)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MainClass5 extends JFrame implements ActionListener{ //버튼 클릭시 기능
JTextField tf = new JTextField(25); //입력창 늘리기. 25자 적을 수 있는 크기
JButton b = new JButton("파일선택");
public MainClass5() {
JPanel p = new JPanel();
p.add(tf);
p.add(b);
add("Center",p);
setSize(450, 250);
setVisible(true);
b.addActionListener(this);
}
public static void main(String[] args) {
new MainClass5();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==b) { //getSource 클릭
JFileChooser jc = new JFileChooser();
if(jc.showOpenDialog(this)==jc.APPROVE_OPTION) {
tf.setText(jc.getSelectedFile().getPath());
//파일 카피(업로드)
try {
FileInputStream fis = new FileInputStream(tf.getText());
FileOutputStream fos = new FileOutputStream("c:\\upload\\"+jc.getSelectedFile().getName());
int i = 0;
byte[] buffer = new byte[1024];
while((i=fis.read(buffer, 0, 1024))!=-1) { //시작, 끝
fos.write(buffer, 0, i);
// i=>읽은 바이트 수
}
fis.close();
fos.close();
JOptionPane.showMessageDialog(this, "파일 업로드 완료");
}catch(Exception ex) {}
}
}
}
}
8. 응용
MovieVO
package com.sist.project;
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 double score;
private int showUser;
private String story;
public int getMno() {
return mno;
}
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 double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
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.project;
import java.io.FileWriter;
import java.util.*; // ArrayList
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/*
* try{
* for(){
* try{
* }catch(Exception e){} 오류 ==> continue => 다시 for문으로 돌아감
* }catch(Exception e){}
*
* try{
* for(){
* } => break됨
* }catch(Exception e){}
*/
public class MovieManager {
public void movieAllData() {
try{
ArrayList<MovieVO> list = new ArrayList<MovieVO>();//갖고온 데이터 모아줌
String[] site = {
"https://movie.daum.net/premovie/released?reservationOnly=N&sort=reservation&page=",
"https://movie.daum.net/premovie/scheduled?reservationOnly=N&sort=reservation&page=",
"https://movie.daum.net/boxoffice/weekly",
"https://movie.daum.net/boxoffice/monthly",
"https://movie.daum.net/boxoffice/yearly"
};
// <a href="/moviedb/main?movieId=122091" class="name_movie"
// HTML (브라우저에서 실행되는 언어)
// 태그 <>, 속성
// 화면 UI => 구분 => id(중복이 없다), class(중복이 될 때)
int mno=103;
int cno=5;
//for(int i=1; i<=7; i++) {
// 사이트 연결해서 데이터를 한번에 읽기 => 메모리 저장 => Document (jsoup.nodes)
Document doc = Jsoup.connect("https://movie.daum.net/boxoffice/yearly").get();
Elements link = doc.select("a.name_movie"); // 여러개 읽으려면 Elements
for(int j=0; j<link.size(); j++) {
// class Elements extends ArrayList
// System.out.println(link.get(j).attr("href"));
// 상세보기
try {
String url ="https://movie.daum.net"+link.get(j).attr("href");
Document doc2 = Jsoup.connect(url).get();
Element poster = doc2.selectFirst("span.thumb_img img");
System.out.println("포스터:"+poster.attr("src"));
Element title = doc2.selectFirst("span.txt_name");
System.out.println("제목:"+title.text());
Element score = doc2.selectFirst("div.info_origin a");
System.out.println("등급:"+score.text());
Element director = doc2.select("dd.type_ellipsis a.link_person").get(0); //selectFirst가 0번째
System.out.println("감독:"+director.text());
Element actor = doc2.select("dd.type_ellipsis a.link_person").get(1);
System.out.println("출연:"+actor.text());
Element genre = doc2.select("dl.list_movie dd").get(0);
System.out.println("장르:"+genre.text());
Element regdate = doc2.select("dl.list_movie dd").get(2);
System.out.println("개봉일:"+regdate.text());
Element grade = doc2.select("dl.list_movie dd").get(3);
System.out.println("관람가:"+grade.text());
Element showUser = doc2.selectFirst("dd#totalAudience em.emph_g");
System.out.println("누적:"+showUser.text());
Element story = doc2.selectFirst("div.desc_movie p");
System.out.println("줄거리:"+story.text());
String msg = mno+"|"+cno+"|"+title.text()+"|"+
poster.attr("src")+"|"+score.text()+"|"+director.text()
+"|"+actor.text()+"|"+genre.text()+"|"+regdate.text()
+"|"+grade.text()+"|"+showUser.text()+"|"+story.text()+"\r\n";
// 파일에 저장
FileWriter fw = new FileWriter("c:\\javaDev\\daum_movie.txt",true); //append일때 true
fw.write(msg);
fw.close();
mno++;
}catch(Exception ex) {}
}
// }
}catch(Exception ex) {
System.out.println(ex.getMessage()); // 에러 메세지 출력
}
//finally => 파일 닫기, 오라클 서버 연결 해제, 네트워크 서버
}
public void daumNewsData() {
try {
for(int i=1; i<=11; i++) {
Document doc = Jsoup.connect("https://movie.daum.net/magazine/new?tab=nws®date=20200727&page="+i).get();
Elements title = doc.select("strong.tit_line a.link_txt");
Elements poster = doc.select("span.thumb_img");
Elements content = doc.select("a.desc_line");
Elements author = doc.select("span.state_line");
Elements link = doc.select("strong.tit_line a.link_txt");
for(int j=0; j<title.size(); j++) {
System.out.println(title.get(j).text());
System.out.println(poster.get(j).attr("style"));
System.out.println(content.get(j).text());
System.out.println(author.get(j).text());
System.out.println(link.get(j).attr("href"));
}
}
}catch(Exception ex) {System.out.println(ex.getMessage());}
}
public static void main(String[] args) {
//객체 생성
MovieManager m = new MovieManager();
//m.movieAllData();
m.daumNewsData();
}
}
'Back-end > Java' 카테고리의 다른 글
JAVA의 정석 33일차 - 영화 정보 프로그램(2) (0) | 2020.07.29 |
---|---|
JAVA의 정석 32일차 - 영화 정보 프로그램(1) (0) | 2020.07.28 |
JAVA의 정석 30일차 - java.util, calendar, collection (0) | 2020.07.24 |
JAVA의 정석 29일차 - String, StringBuffer, Math, Wrapper (0) | 2020.07.23 |
JAVA의 정석 28일차 - java.lang패키지 Object클래스 (0) | 2020.07.22 |