반응형

ConnectThread.java


package UrlTextDownload;

import java.io.*;
import java.net.*;


// 웹에서 문서를 다운로드 받는 Thread Class
public class ConnectThread extends Thread {
	
	// 다운로드 받는 주소 변수
	String urlStr;
	
	// 다운로드 받을 주소를 넘겨받아서 멤버 편수에 저장하는 생성자
	public ConnectThread(String urlStr){
		this.urlStr = urlStr;
		
	}
	
	// Thread로 동작할 메소드 - 제정의
	public void run(){
		
		final String output = request(urlStr);
		System.out.println("가져온 내용 : " + output);			
	}
	
	// 실제 다운로드를 수행해서 문자열을 리턴할 메소드
	private String request(String urlStr){
		// 다운로드 받은  문자열을 저장할 변수
		StringBuilder html = new StringBuilder();
		
		try{
			// 다운로드 받을 URL객체 생성
			URL url = new URL(urlStr);
			// URL에 연결할수 있는 객체 생성
			HttpURLConnection conn = 
					(HttpURLConnection)url.openConnection();
			// 객체 생성에 성공하면
			if( conn == null){
				
				// 연결설정
				// 연결 시도시간 설정
				conn.setConnectTimeout(5000);
				// 캐시사용 여 부
				conn.setUseCaches(false);
				
				// 정상적인 연결이 이루어지려면
				if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
					// 문자열을 읽어올 Reader 생성
					BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
					
					while(true){
						String line = in.readLine();
						if(line == null)
								break;
							html.append(line + "\n");			
					}//while
					in.close();
				}//if
				conn.disconnect();
			}//if
			
		}catch(Exception e){
			System.out.println(e.getMessage());
			
		}// Try & catch
		
		return html.toString();
	}
	

}



DownloadFile.java



package UrlTextDownload;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.*;
import java.util.*;

public class DownloadFile implements Runnable {

	// 다운로드 받을 주소와 저장할 파일명을 위한 변ㅅ
	String mAddr;
	String mFile;
	
	//생성자
	public DownloadFile(String mAddr, String mFile) {
		this.mAddr = mAddr;
		this.mFile = mFile;
	
	}

	public void run() {
		// 다운로드 받을 주소를 만들기 위한 변수
		URL imageUrl;
		// 데이터를 바이트다윈로 읽을 때 읽을 위치를 저장할 변수
		int read;
		try{
			// 다운로드 받을 URL 생성
			imageUrl = new URL(mAddr);
			// 연결 객체 생성
			HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
			
			// 연결된 파일의 크기 가져오기
			int len = conn.getContentLength();
			// 데이터를 저장할 배열생성
			byte raster [] = new byte [len];
			// 웹에서  읽어올 스트림 생성  - 일반 파일을 읽는 경우
			InputStream is = conn.getInputStream();
			// 파일에 기록할 스트림 생성
			FileOutputStream fos = new FileOutputStream(mFile);
		
			while(true){
				// is 에서  읽어서 raster에 젖ㅇ하고 읽은 마지막위치를 read에 ㅈ장
				read = is.read(raster);
				
				// 읽은데이터가 없다면
				if(read <= 0){
					break;
				}
				// raster 배열에서 0부턴 read 만큼 읽어서 fos에 기록
				fos.write(raster,0,read);
			}
			is.close();fos.close();conn.disconnect();
			
			
		}catch(Exception e){System.out.println(e.getMessage());}
		
		
	}

	
}



Main.java


package UrlTextDownload;

import java.io.File;

public class Main {

	public static void main(String[] args) {

//		ConnectThread th = new ConnectThread("www.naver.com");
//		th.start();
		
		// 다운로드 받을 파일의 주소를 생성
		String imageUrl = 
				"";
				//"http://sangjinhan.files.wordpress.com/2014/06/056_ebb095ebb3b4ec9881.jpg";
				//"http://sangjinhan.files.wordpress.com/2014/06/056_ebb095ebb3b4ec9881.jpg;
		// 파일명을 만들기 우해서 마지막 /의 윛를 찾아오기
		int idx = imageUrl.lastIndexOf("/");
		// 마지막 /뒤에 문자열 가져오기
		String localimage =
				imageUrl.substring(idx+1);
		// 파일 경로 생성
		String path = "c://download//" + localimage;
		// 파일이 있으면 그냥 넘어가고 없으면 다운로드
		if(new File(path).exists()){
			System.out.println("파일이  이미 존재합니다");
		}else{
			System.out.println("Download");
			//Runnable을  implements한 경우에는 스레드위 생성과 시작
			DownloadFile down = new DownloadFile(imageUrl,path);
			Thread th = new Thread(down);
			th.start();
		}
		
	}

}


+ Recent posts