java:按行读取服务器压缩文件内容

当前需求是从一台服务器上的一个目录读取所有压缩文件(文件名是未知的)的内容,从网上搜到的方法都不太完整,以下是本人总结的方法。此处传进来的路径只能是最终带文件名的路径,不能是目录。
由于压缩文件的名称都是未知的,只能通过遍历目录下所有文件名来读取文件内容,但是HttpURLConnection 连接无法遍历目录的文件名,所以在当前目录下加多一个txt文件用于保存当前目录下所有文件名称,每次先读取txt文件获取文件名拼接destUrl ,再调用以下的方法读取每个zip文件。

//destUrl 文件存放在服务器的路径 , 如http://192.168.XX.XX:8080/filename/xx.zip
//filter 获取包含该内容的行                             
//contentType 编码格式 , 如 utf-8/gbk等   
public static List getZipData(String destUrl, Object[] filter, String contentType) {
        if (T.isBlank(destUrl)) {
            return null;
        }
        List dataList = new ArrayList();
        int len = -1;
        byte[] b = new byte[10240]; // 准备一次读入10k
        try {
            SocketAddress address = new InetSocketAddress(Config.getProxyHost(),Config.getProxyPort());  
           // 获取代理服务器地址、端口
            Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
            URL url = new URL(destUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy); // 通过代理访问
            // 1 读取压缩文件流
            InputStream is = conn.getInputStream();
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            while ((len = is.read(b)) > -1) {// 每次读取长度并不总是10k
                os.write(b, 0, len);
            }
            // 2 解压,可以直接从URL连接的输入流解压
            ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(os.toByteArray()));
            while ((zis.getNextEntry()) != null) {
                ByteArrayOutputStream zos = new ByteArrayOutputStream();
                while ((len = zis.read(b)) > -1) {
                    zos.write(b, 0, len);
                }
                InputStream in = new ByteArrayInputStream(zos.toByteArray());
                BufferedReader buffer = new BufferedReader(new InputStreamReader(in, contentType));
                String line = null;
                while ((line = buffer.readLine()) != null) {
                    if (filter != null && filter.length > 0) {// 有过滤条件时返回满足条件的行
                        for (Object str : filter) {
                            if (line.contains(str.toString())) {
                                dataList.add(line.trim());
                                break;
                            }
                        }
                    }else{
                        dataList.add(line.trim());// 无过滤条件时返回所有行
                    }                    
                }
            }
            return dataList;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章