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;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章