2013-09-25 2 views
0

Java의 gzip 파일에서 추출한 파일의 타임 스탬프를 보존하고 싶습니다. GZIPInputStream 클래스는 당신에게 타임 스탬프를 제공 할 수 없기 때문에 이것은 해키 솔루션입니다Java에서 gzip 내의 파일에 타임 스탬프를 얻는 방법

public void gunzipFile(String zipFile, String newFile) { 
    System.out.println("zipFile: " + zipFile); 
    final int bufferSize = 1024; 
    try { 
     FileInputStream fis = new FileInputStream(zipFile); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     GZIPInputStream gis = new GZIPInputStream(bis); 
     FileOutputStream fos = new FileOutputStream(newFile); 
     final byte[] buffer = new byte[bufferSize]; 
     int len = 0; 
     while ((len = gis.read(buffer)) != -1) { 
      fos.write(buffer, 0, len); 
     } 
     //close resources 
     fos.close(); 
     gis.close(); 
    } catch (IOException e) { 
     System.out.println("exception caught"); 
    } 
} 

답변

2

:

여기에 코드입니다.

FileInputStream fis = new FileInputStream(zipFile); 
byte[] header = new byte[10]; 
fis.read(header); 

int timestamp = header[4] & 0xFF | 
      (header[5] & 0xFF) << 8 | 
      (header[6] & 0xFF) << 16 | 
      (header[7] & 0xFF) << 24; 

// or more simply, use 
// int timestamp = ByteBuffer.wrap(header, 4, 4).order(ByteOrder.LITTLE_ENDIAN).getInt(); 

System.out.println(new Date((long) timestamp * 1000)); // this will give you the date 

GZIP format 일부 메타 데이터는 10 바이트의 헤더를 사용한다. 바이트 5 (오프셋 4) - 8은 유닉스 타임 스탬프를 나타냅니다. 이들을 int으로 변환하고 1000을 곱하여 밀리 초를 얻으면 파일의 날짜를 가져올 수 있습니다 (원래 있었던 경우).

형식 말하면

0  1 
+--------+--------+ 
|00001000|00000010| 
+--------+--------+ 
^  ^
|  | 
|  + more significant byte = 2 x 256 
+ less significant byte = 8 

가 선두 바이트가 int의 마지막 8 비트이다. LITTLE_ENDIAN이 들어오는 곳이다.

나는 여기에 InputStream를 사용하여 당신이 조심 추천 할 것입니다. 가능하면 BufferedInputStreamreset()을 사용하여 0을 배치하거나 다른 InputStream을 열면됩니다. 하나를 사용하여 타임 스탬프를 얻고 다른 하나를 사용하여 gzip 콘텐츠를 부 풀립니다.

+0

위대한 답변! 그게 저에게 일할 수있는 기회를줍니다. 감사합니다 – Marvado

+0

@Marvado 당신은 오신 것을 환영합니다. 모든 사항을 다룰 수 있다면 대답을 수락하십시오. –

관련 문제