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