[Java] File에 대한 Zip 압축

여러개의 파일들을 하나의 Zip 파일로 압축하는 자바 코드입니다.

String zipFileName = "c:/file.zip";

String[] files = new String[3];

files[0] = "c:/a.so";
files[1] = "c:/b.dat";
files[2] = "c:/c.cfg";
		
byte[] buf = new byte[4096];

try {
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));

    for (int i=0; i<files.length; i++) {
        FileInputStream in = new FileInputStream(files[i]);
        Path p = Paths.get(files[i]);
        String fileName = p.getFileName().toString();
	        	
        ZipEntry ze = new ZipEntry(fileName);
        out.putNextEntry(ze);
	      
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
	      
        out.closeEntry();
        in.close();

    }
	      
    out.close();
} catch (IOException e) {
    e.printStackTrace();
}

a.so, a.dat, c.cfg 파일 세개를 file.zip으로 압축합니다. 특히, 19번 코드의 ZipEntry의 생성자의 인자에 경로가 들어갈 경우 압축 파일 내부에도 동일한 경로가 형성됩니다. 코드 최저화는 각자의 몫으로 남겨 둡니다.

참고로 위의 클래스들을 위해 필요한 import 문의 삽입을 위해 이클립스에서는 ^~O (Ctrl+Shift+O)를 입력하시면 됩니다.

건축물 용도별 전국 건물 SHP 파일 다운로드

대한민국, 전국의 약 천만개 이상 건물축에 대해서 용도별로 분류된 SHP 파일입니다. 용도별 270 종류 이상이며, 데이터 용량은 비압축시 약 4GB 이상입니다.

용도별 종류에 대한 구체적인 내용은 SHP 파일의 이름으로 명시하였으므로 다운로드 받아 살펴 보시기 바랍니다. 아울러 건축물에 대한 속성 정보는 아래와 같습니다.

좌표계는 UTM-K GRS80 타원체이며 .prj 파일은 다음과 같습니다.

PROJCS["PCS_ITRF2000_TM",GEOGCS["GCS_ITRF_2000",DATUM["D_ITRF_2000",
SPHEROID["GRS_1980",6378137.0,298.257222101]], PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],
PARAMETER["False_Easting",1000000.0],PARAMETER["False_Northing",2000000.0],
PARAMETER["Central_Meridian",127.5],PARAMETER["Scale_Factor",0.9996],
PARAMETER["Latitude_Of_Origin",38.0],UNIT["Meter",1.0]]

자료의 출처는 안전행정부의 공개DB인 도로명주소 DB(2015년 6월자)입니다. 다운로드 URL은 아래와 같습니다.



도로명주소 GeoCoder-Xr를 이용한 아파트 동단위 위치까지 찾기

도로명주소에 대한 지오코딩 툴인 GeoCoder-Xr은 아파트 ‘동’단위까지 위치를 찾을 수 있습니다. 아래의 화면처럼 ‘서울특별시 서초구 서초동 반포대로 58 103동’과 같이 입력하면 주소로 입력된 103동의 위치까지 지오코딩된 것을 볼 수 있습니다.

도로명주소에 대한 지오코딩 툴은 안전행정부에서 제공하는 공개DB를 활용하였으며, 정확도는 이 DB에 기반하고 있습니다. 프로그램에 대한 보다 자세한 설명 및 다운로드는 아래의 URL을 통해 살펴보시기 바랍니다.

도로명주소 지오코딩 툴 소개 및 다운로드

jQuery UI를 이용한 대화상자(Dialog) 표시하기

jQuery 라이브러리를 이용한 UI, 즉 jQuery UI에는 기본적인 Button에서부터 Accordion까지 다양한 UI를 제공합니다. 그 중 대화상자(Dialog)에 대해 살펴 보도록 하겠습니다.

흐름은 3가지입니다. 첫째는 Dialog의 기능을 담을 DIV를 선언하고, 두번째는 jQuery와 jQuery UI에 대한 자바스크립트 라이브러리를 추가하고, 세번째는 앞서 선언한 DIV에 대해 dialog() 함수를 호출해 주는 것이 기본적인 내용의 전부입니다.

아래는 jQuery UI를 이용한 다이얼로그에 대한 화면입니다.

위의 화면을 구성하기 위한 전체 코드는 아래와 같습니다.




    
    jQuery UI - DialogBox

    
    
    
    

    


    

Message

앞서 언급한 세가지 흐름에 해당하는 코드는, 첫째인 Dialog의 기능을 담을 DIV를 선언은 20번, 두번째로 jQuery와 jQuery UI에 대한 자바스크립트 라이브러리를 추가는 10번과 11번, 세번째인 앞서 선언한 DIV에 대해 dialog() 함수를 호출해 주는 것은 15번입니다.

jQuery UI는 자바스크립트와 HTML 테그를 이용하여 매우 직관적이고 간단하게 원하는 UI로써의 기능(생명력)을 불어 넣을 수 있는 좋은 라이브러리라고 생각됩니다.

[Android] Spinner 또는 ListView에 Adapter 지정 후 바로 setSelection 호출 제대로 하기

제목도 참 길어 거시기 합니다. 안드로이드에서 Spinner나 ListView에 항목에 대한 목록을 지정하기 위해서는 Adapter 객체를 생성 및 구성해서 setAdapter 함수를 호출하여 지정합니다. 이렇게 지정하고 난 뒤에 바로 n번째 항목을 선택하도록 setSelection(n-1)과 같은 함수를 호출하게 됩니다. 예를 들어 아래와 같은 코드처럼 말입니다.

Spinner spRi = (Spinner)findViewById(R.id.spRi);
ArrayAdapter adp = new ArrayAdapter( ... );

...

spRi.setAdapter(adpr);

int n = ...;

...

spRi.setSelection(n-1);

그러나 이렇게 하면 n번째 항목은 선택되지 않고 항상 첫번째 항목이 선택되어 있습니다. 사용자 인터페이스(UI)에 대한 표현은 다른 연산보다 가장 나중에 처리되는 OS 정책 때문인데요. 이럴때는 아래와 같은 코드로 대신해야 합니다.

Spinner spRi = (Spinner)findViewById(R.id.spRi);
ArrayAdapter adp = new ArrayAdapter( ... );

...

spRi.setAdapter(adpr);

new Handler().postDelayed(new Runnable() {        
    public void run() {
        int n = ...;

        ...

        spRi.setSelection(n-1);
    }
}, 100);

즉, UI의 표현이 될때까지 기다렸다가 n-1 번째 항목을 선택하라는 것인데요.. 기다린다는 것이 100ms라는 애매한 시간으로 지정했다는 것이 걸리지만 잘 작동합니다. 않되면 이 애매한 시간을 더 늘려주세요. 개인적으로 Delay나 Sleep와 같은 기능을 하는 함수 호출을 싫어하지만… 근데 어디선가 지금 바로 UI를 업데이트 하라는 함수를 본 것 같은데 기억이 않난단 말입니다. 메모를 해 뒀어야 했는데 말입니다.