當前需求是從一臺服務器上的一個目錄讀取所有壓縮文件(文件名是未知的)的內容,從網上搜到的方法都不太完整,以下是本人總結的方法。此處傳進來的路徑只能是最終帶文件名的路徑,不能是目錄。
由於壓縮文件的名稱都是未知的,只能通過遍歷目錄下所有文件名來讀取文件內容,但是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;
}
}