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

来源:互联网 发布:长庚医院网络挂号查询 编辑:程序博客网 时间:2024/06/06 12:47

当前需求是从一台服务器上的一个目录读取所有压缩文件(文件名是未知的)的内容,从网上搜到的方法都不太完整,以下是本人总结的方法。此处传进来的路径只能是最终带文件名的路径,不能是目录。
由于压缩文件的名称都是未知的,只能通过遍历目录下所有文件名来读取文件内容,但是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;        }    }
1 0
原创粉丝点击