[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)를 입력하시면 됩니다.

[Java] ByteBuffer로부터 unsigned int 읽기

자바는 그 창시자로부터 데이터 타입으로 unsigned가 의미가 없다는 판단에 의해 부호가 없는 정수형 데이터 타입을 지원하지 않는 우(?)를 범하였으니… 간혹 자바를 사용하는 개발자가 개고생인지라.. 개고생을 줄이고자 기록을 남깁니다.

long v = ((long)outBb.getInt() & 0xffffffffL);

이 얼마나 비효율의 극악을 달리는 코드인가? unsigned 값의 의도는 음수값을 가지지 않을 경우 적은 바이트수만을 활용하여 그 2배에 해당하는 양(+)의 범위 값을 가지도록 하고자 하는 선의인데, 4바이트의 unsigned int를 저장하기 위해 8바이트를 사용하고 있는 형국입니다.

자바 언어의 창시자인 제임스 고슬링님은 뭐하고 사시는지 살짝 궁금해지네요.. 소녀시대 팬이라는 소문도 있던데.. @_@