java解压中文的zip文件报错的解决方法

公司做一个项目需要到第三方的网站上去采集数据,而第三方网站提供了一个zip下载,于是自己就想写一个java一键下载(到内存)、(内存中)解压并解析的功能。理想是丰满的,现实也很美满,遇到一个小问题,轻松解决了。百毒上一番搜索后得出的结果都不满意,可能大家都用的更老版本的jdk的原因吧,自己一番尝试后发现jdk7以上已经可以完美解决解压中文zip(java.lang.IllegalArgumentException: MALFORMED)的问题了。

在网络请求中没啥大的问题,但是第三方采集下载下来的zip包种有中文字符,导致解压的时候报错,网上各种不靠谱,有的说要改源码咯,有的说要用apache的第三方包咯什么的。经过自己一番研究发现其实很简单。

try {
    CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
    URL url = new URL("http://xxxx.xxxx.xxx/xxx/xxx.zip");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setConnectTimeout(10000);
    conn.setRequestMethod("GET");
    conn.setUseCaches(false);
    if (conn.getResponseCode() == 200&&"multipart/x-zip".equals(conn.getContentType())) {//访问成功,并且确定是zip文件
        InputStream inStream = conn.getInputStream();
        ZipInputStream zis=new ZipInputStream(inStream,Charset.forName("GBK"));//设置GBK编码,解决中文乱码
        BufferedInputStream bis=new BufferedInputStream(zis);  
        BufferedReader br = new BufferedReader(new InputStreamReader(bis,"GBK"));//设置GBK编码,解决中文乱码
        ZipEntry entry;
        String line =null;
        //遍历zip内的文件
        while((entry = zis.getNextEntry())!=null && !entry.isDirectory()){
            while ((line = br.readLine()) != null){
                System.out.println(line);//读取压缩包里面的文件(因为我的是txt)
            }
            System.out.println(entry.getName()+"解压成功");
        } 
        zis.close();
        bis.close();
        br.close();
        inStream.close();
        conn.disconnect();
    }else{
        System.out.println("zip文件下载失败!");
    }
} catch (IOException e) {
    e.printStackTrace();
}

在jdk1.7之后java.util.zip.ZipInputStream.ZipInputStream(InputStream in, Charset charset),是可以直接设置编码的,而不是像网上其他人说的那样必须要修改jdk或者要使用第三方jar等。


本文地址:http://darren.ink/archives/46

相关文章:

标签: java, 原创

添加新评论