이안의 평일코딩

JAVA의 정석 31일차 - 입출력 I/O 본문

Back-end/Java

JAVA의 정석 31일차 - 입출력 I/O

이안92 2020. 7. 27. 10:53
반응형

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&regdate=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();
	}
}
반응형
Comments