2014-03-01 41 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