본문 바로가기

programming/Gukbi

국비 교육 28일차 - 라이브러리활용(Input/OutputStream)

728x90
반응형

아침에 와서 열심히 썼건만 다 날라갔다.

 

그냥 다시 쓰는 수밖에...

 

package com.sist.io;
/*
 *    IO => 입출력 (메모리 , 파일 , 네트워크)
 *    ===         System.in,System.out
 *      File 관련 : 업로드,다운로드 => 추천 프로그램 , AI
 *      1) File 
 *      2) byte 단위로 읽기 , 쓰기 => ~InputStream , ~OutputStream => 1바이트씩 
 *      3) char 단위로 읽기 , 쓰기 => ~Reader , ~Writer => 2바이트씩 (한글)
 *      4) 객체 단위로 읽기 , 쓰기 => ObjectInputStream,ObjectOutputStream
 *   ** 자바에서 입출력은 스트림 => 데이터를 이동하는 통로 (단방향) => 양방향(프로그램을 두개를 동시에 처리)
 *                                                         ===================== 쓰레드(메소드 여러개 동시에 수행)
 *      모든 메소드는 동기화 
 *      class A
 *      {
 *          public void aaa(){}
 *          public void bbb(){}
 *      } 
 *      
 *      A a=new A();
 *      a.aaa(); ==> return 
 *      a.bbb(); ==> return       aaa() bbb() aaa() bbb() => 쓰레드 
 *      ====================================================================
 *         = 바이트 스트림 (1byte) : 이미지파일, Zip... (업로드,다운로드)
 *           InputStream        OutputStream   ==> interface
 *              |                    |
 *            read                 write   => 파일을 처리한후에는 반드시 닫기 (close())
 *                                            =================================== finally
 *           ***** IO은 CheckException : 반드시 예외처리한다 => finally
 *           = 구현된 클래스 
 *             FileInputStream        FileOutputStream
 *             BufferedInputStream    BufferdOutputStream
 *             ObjectInputStream      ObjectOutputStream
 *         
 *         = 문자 스트림 (한글이 있는 경우) => 2byte
 *           Reader            Writer ===> interface
 *           = 구현된 클래스 
 *           FileReader        FileWriter
 *           BufferedReader    BufferedWriter
 *           
 *         = File (클래스명)
 *           = file ========> 파일명까지
 *             File file=new File("c:\\javaDev\\daum_movie.txt")
 *           = directory ===> 폴더명까지 
 *             File dir=new File("c:\\javaDev")
 *           = 라이브러리 
 *             directory 관련
 *               = listFiles() : 폴더안에 있는 파일과 폴더..
 *               = delete() : 폴더 삭제 
 *               = mkdir() : 폴더를 만들때 
 *             file 관련 
 *               = 수정일 => lastModified (long) => 날짜형으로 변경 
 *                                                 ====    ===
 *                                                 Date    SimpleDateFormat
 *               = 파일명 읽기 => getName(),getPath(),getParent()
 *                          getName(): 파일명만 가지고 온다 
 *                          getPath(): 경로명부터 파일명까지 읽기 
 *                          getParent() : 경로명만 읽을 경우 
 *               = 숨김파일여부 : isHidden()
 *                 읽기쓰기여부 : canRead() ,canWrite()
 *             
 */
import java.io.*;//파일 포함 => 입출력과 관련된 모든 클래스의 집합 (메모리입출력,파일입출력,네트워크입출력)
// URL => IO를 이용해서 입출력 => 전체 파일의 내용을 모아서 처리(Buffered~~)
// File 
/*
 *   1. File 객체 생성 
 *      File file=new File("c:\\폴더명\\파일명");(********선호)
 *      
 *      File dir=new File("c:\\폴더명");
 *      File file=new File(dir,"파일명")
 */
public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        // 폴더(directory) 읽기
		// 1. 폴더 만들기 
		File dir=new File("c:\\download");
		if(!dir.exists())// 폴더가 있는지 여부확인
		{
			// 존재하지 않는 경우에 폴더를 만든다 
			dir.mkdir();
		}
		
		// 폴더안에 들어가 있는 파일의 종류
		File[] files=dir.listFiles(); // 탐색기를 만드는 경우 
		for(File f:files)
		{
			if(f.isFile()) // 파일일 경우
			{
				System.out.println(f.getName());
			}
			if(f.isDirectory()) // 폴더일 경우
			{
				System.out.println(f.getName()+" DIR");
			}
		}
		
		// 폴더 삭제 
		//dir.delete(); // 폴더안에 파일이나 폴더가 있는 경우에는 삭제 할 수 없다
		for(File f:files)
		{
			if(f.isFile())
			{
				f.delete();
			}
			if(f.isDirectory())
			{
				File dir2=new File("c:\\download\\"+f.getName());
				File[] files2=dir2.listFiles();
				for(File ff:files2)
				{
					ff.delete();
				}
				dir2.delete();
			}
		}
		dir.delete();
		
	}

}

 

아래는 실제 웹에서 다운로드 할 경우 사용하는 코드와 동일하다

 

package com.sist.io;
/*
 * 	BufferedInputStream, BufferedOutputStream
 * 	ObjectInputStream, ObjectOuptStream
 * 	=======================================
 * 	BufferedReader, BufferedWriter
 
 */
import java.io.*;
public class MainClass8 {

	public static void main(String[] args) {
		
		try 
		{
		File file=new File("c:\\javaDev\\player.zip");
		
		FileInputStream fis = new FileInputStream(file);
		BufferedInputStream bis = new BufferedInputStream(fis);
		
		// 한번에 저장하지 못해서 buffer 이용하는 것-> 임시로 저장-> 임시로 저장하는 공간을 buffer라고 함
		// 보조 스트림 => 임시 저장공간(메모리)에 저장한 후 사용 
		FileOutputStream fos = new FileOutputStream("c:\\download\\player.zip");
		BufferedOutputStream bos =new BufferedOutputStream(fos);
		
		byte[] buffer = new byte[1024];
		int i=0; // 읽은 바이트 갯수
		
		while((i=bis.read(buffer, 0, 1024))!=-1)
		{
			bos.write(buffer, 0, i);
		}
		bis.close();
		bos.close();
		// 실제 웹에서 다운로드할 경우레 처리 내용과 동일 
		System.out.println("파일 다운로드 완료!");
		}catch(Exception ex) {}
	}

}

이 코드를 통해서 javaDev에 있던 zip파일을 download로 옮겨 저장할 수 있었다. 

 

package com.sist.io;
// BufferedReader : 네트워크 => 보조 스트림
/*
 * 	FileInputStream, FileOutputStream
 * 	BufferedInputStream, BufferedOutputStream
 * 
 * 	FileReader / FileWriter
 * 	BufferedReader
 * 	
 * 	=========================================
 * 
 * 
 */
import java.io.*;

import javax.annotation.processing.Filer;

public class MainClass9 {

	public static void main(String[] args) {
		
		try
		{
			// 파일 읽기 => daum_movie.txt
			//3092 - String +로 문자열 결합했을때
			// 69 - sb 써줬을때 < 훨씬 빠름
			// 35 - 파일 전체를 메모리에 가져다 두고 한 줄씩 읽어올때 
			/*File file = new File("c:\\javaDev\\daum_movie.txt");
			// fr은 한글자씩 읽어옴
			FileReader fr=new FileReader(file);
			
			int i=0;
			// 임시공간에 저장해 주는 것 
			StringBuffer sb=new StringBuffer(); // 읽은 데이터 저장 공간
			long start=System.currentTimeMillis();
			//String data="";
			while((i=fr.read())!=-1)
			{
				sb.append(String.valueOf((char)i)); ==> \n
			}
			System.out.println(sb.toString());
			long end=System.currentTimeMillis();
			System.out.println("걸린 시간:"+(end-start));*/
			File file = new File("c:\\javaDev\\daum_movie.txt");
			FileInputStream fis=new FileInputStream(file);
			BufferedReader br = new BufferedReader(new InputStreamReader(fis));
														//InputStream => Reader로 변환해 주는 것 
														// (1byte=>2byte)
			long start=System.currentTimeMillis();
			// 데이터 => 인코딩 ==> 실행 ==> 디코딩
			while(true)
			{
				String str=br.readLine(); // 한줄씩 읽는다, 시작하자마자 \n으로 잘라서 가져옴
				// 한글자씩 읽을때보다 한줄씩 읽을때 더 빨리 읽어옴
				if(str==null) break; // 종료=> 데이터를 다 읽은 경우
				System.out.println(str);
			}
			br.close();
			long end=System.currentTimeMillis();
			System.out.println("걸린 시간:"+(end-start));
		}catch(Exception ex) {}
	}

}

1. 문자열 결합을 통해 읽어오는 것,

버퍼를 통해

2. 한글자씩 읽어오는것

3. 한 줄씩 읽어오는것

 

세 개의 방법중 마지막 방법이 가장 처리시간이 적게 걸린다. 

웹사이트에서 내용 복사를 할때 한글자씩 읽는 것 vs 한줄씩 긁어오는 것 어떤게 더 빠른지 생각해보면 답이 금방 나온다. 

 

 

package com.sist.io;
/*
 * 	1|1|소울(2020)|8.6|애니메이션/판타지|2021.01.20 |107분|전체관람가|피트 닥터|켐프 파워스|//img1.daumcdn.net/thumb/C155x225/?fname=https%3A%2F%2Ft1.daumcdn.net%2Fmovie%2F71454256ae63506a7fee5e03cf929b9b65a4f433|1|나는 어떻게 ‘나’로 태어나게 되었을까? 지구에 오기 전 영혼들이 머무는 ‘태어나기 전 세상’이 있다면? 뉴욕에서 음악 선생님으로 일하던 ‘조’는 꿈에 그리던 최고의 밴드와 재즈 클럽에서 연주하게 된 그 날, 예기치 못한 사고로 영혼이 되어 ‘태어나기 전 세상’에 떨어진다. 탄생 전 영혼들이 멘토와 함께 자신의 관심사를 발견하면 지구 통행증을 발급하는 ‘태어나기 전 세상’ ‘조’는 그 곳에서 유일하게 지구에 가고 싶어하지 않는 시니컬한 영혼 ‘22’의 멘토가 된다. 링컨, 간디, 테레사 수녀도 멘토되길 포기한 영혼 ‘22’ 꿈의 무대에 서려면 ‘22’의 지구 통행증이 필요한 ‘조’ 그는 다시 지구로 돌아가 꿈의 무대에 설 수 있을까?
 * 
 */
import java.io.*;
import java.util.*;
// 직렬화 => ObjectOutputStream
// 역직렬화 => ObjectInputStream
class Sawon implements Serializable // <- 꼭 써줘야 직렬화가 가능해진다
{
	private int sabun;
	private String name;
	private String dept;
	private String loc;
	// 저장을 하되 제외를 해서 저장하라는 의미 
	transient private int pay; 
	
	public int getSabun() {
		return sabun;
	}
	public void setSabun(int sabun) {
		this.sabun = sabun;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	public int getPay() {
		return pay;
	}
	public void setPay(int pay) {
		this.pay = pay;
	}
	
	
	public Sawon(int sabun, String name, String dept, String loc, int pay) {
		this.sabun = sabun;
		this.name = name;
		this.dept = dept;
		this.loc = loc;
		this.pay = pay;
	}
	
}
public class MainClass10 {

	public static void main(String[] args) {
		
		try {
			ArrayList<Sawon> list = new ArrayList<Sawon>();
			list.add(new Sawon(1, "이제노", "드림", "서울", 4000));
			list.add(new Sawon(2, "이마크", "드림", "서울", 4000));
			list.add(new Sawon(3, "박지성", "드림", "서울", 4000));
			list.add(new Sawon(4, "이해찬", "드림", "서울", 4000));
			list.add(new Sawon(5, "횡런쥔", "드림", "서울", 4000));
			
			// 출력
			for(Sawon s: list)
			{
				System.out.println("이름:"+s.getName());
				System.out.println("부서:"+s.getDept());
				System.out.println("근무지:"+s.getLoc());
				System.out.println("연봉:"+s.getPay());
				System.out.println("=========================");
			}
			
			File file=new File("c:\\download\\sawon.txt");
			FileOutputStream fos=new FileOutputStream(file);
			
			// 객체 단위로 파일에 저장
			ObjectOutputStream oos=new ObjectOutputStream(fos);
			oos.writeObject(list);
			oos.close();
			System.out.println("저장 완료!!");
			// 글자가 깨져보이지만 저장완료 된거 맞음
			
		}
		catch(Exception ex) {}

	}

}

그래서 최종적으로 정리를 해보자면

File file = new File("경로+파일명");

을 통해 File 객체를 먼저 생성해주어야 하고, 

 

파일을 읽어오는 거면 FileInputStream | FileReader를 써준다. 

FileInputStream fis=new FileInputStream(file);

 

읽어올때 버퍼를 사용해서 빨리 읽어오고 싶다면

BufferedInputStream | BufferedReader 을 사용해서 읽어오면 된다.

BufferedInputStream bis= new BufferedInputStream(fis);

 

 

다음은 파일 내용을 처리하는 메소드를 사용해주고,

 

 

다시 파일을 내보낼때는 

FileOutputStream fos=new FileOutputStrema("경로명+파일명");

BufferedOutputStream bos=new BufferedOutputStream(fos);

 

를 해주면된다.

 

경우에 따라서 아예 Object의 형태로 값을 읽어오고 내보낼 경우에는

ObjectInputStream | ObjectOutputStream 을 써주면된다...

 

 

 

 

728x90
반응형