2014-03-01 73 views
3

我試圖從互聯網下載.torrent文件。一些在線文件是壓縮(gzipped)格式。我知道我可以解壓縮用下面的代碼文件:不是GZIP格式Java

try (InputStream is = new GZIPInputStream(website.openStream())) { 
     Files.copy(is, Paths.get(path)); 
     is.close(); 
    } 

但一些的.torrent文件都不會被壓縮,因此我得到的錯誤信息:

java.util.zip.ZipException: Not in GZIP format 

我處理一個.torrent文件的大型數據庫,所以如果它被壓縮,我不能一一解壓。如何知道.torrent文件是否被壓縮,並且只有在壓縮文件時才解壓縮文件?

僞代碼:

if(file is compressed){ 
unzip 
download 
}else{ 
download 

SOLUTION:

try (InputStream is = new GZIPInputStream(website.openStream())) { 
     Files.copy(is, Paths.get(path + "GZIP.torrent")); 
     is.close(); 
    } catch (ZipException z) { 
     File f = new File(path + ".torrent"); 
     FileOutputStream fos = new FileOutputStream(f); 
     ReadableByteChannel rbc = Channels.newChannel(website.openStream()); 
     fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
     fos.close(); 
    } 
+1

內容類型報頭可以揭示該文件是否被壓縮或不啓動;你可以通過打開你的URL connection = website.openConnection(),然後打印connection.getContentType()來調試內容類型。 – Vulcan

+0

請不要編輯問題以顯示解決方案,但也可以將其添加爲答案 – Mark

+0

另外,依靠拋出異常來執行代碼中的某些操作通常不是很好的做法......如果您可以檢測它是否是在引發異常之前的gzip文件,它會好得多。在我看來,你可以用一個簡單的'if(Paths.get(path).contains(「GZIP」)){/ *處理gzip代碼/ *} else {/ *處理非gzip代碼* /} – SnakeDoc

回答

2

可以使用的BufferedInputStream。無論如何,這可能是一個好主意。這將允許您標記()開始並嘗試解壓縮數據,如果失敗,請重置()流並正常讀取它。 (更有效地,所有GZIP文件開始用相同的兩個字節);)

所有GZIP流與字節1F 8B http://en.wikipedia.org/wiki/Gzip

+0

我能夠抓住一個ZipException而不是創建一個BufferedInputStream。無論如何感謝您的幫助。我已經更新了上面的代碼來幫助其他人解決同樣的問題。 – Joe

+0

@ user3243085這不會給你回讀它讀取的字節並且兩次讀取流是浪費。 –

+0

嗯,我只有15歲,並不認爲我可以學習足夠多的BufferedInputStreams和字節爲了完成這個程序,我正在做。我很感激幫助,我相信你的方式更有效率。 – Joe