java 网络url获取zip文件解压为txt文件并将数据保存进数据库
有个需求,从s3上拿到zip压缩文件再在代码里进行解压,拿到里面的txt文件,并解析txt文件内容,再保存进数据库
个人习惯直接上代码
@Slf4j
@Service
public class BizCheckQuartz {
/**
* 对账文件表
*/
@Autowired
ICieoDivisionAttachApi iCieoDivisionAttachApi;
@Autowired
S3Config s3Config;
public Result<String> setFile() {
Result<String> result=new Result<>();
List<CieoDivisionAttachDto> cieoDivisionAttachDtos = iCieoDivisionAttachApi.queryAllCieoDivisionAttachEntity();
for (CieoDivisionAttachDto cieoDivisionAttachDto : cieoDivisionAttachDtos) {
if(!StringUtils.isEmpty(cieoDivisionAttachDto.getKeyurl())){
MultipartFile fileItem =null;
try {
fileItem = this.createFileItem(s3Config.getStaticDomain() + cieoDivisionAttachDto.getKeyurl(), cieoDivisionAttachDto.getFilename());
} catch (Exception e) {
e.printStackTrace();
}
//文件不等于空
if(!fileItem.isEmpty()){
//转成zip文件
Map<String,String> stringInputStreamMap = this.checkZip(fileItem);
for(String key:stringInputStreamMap.keySet()){
//按照行来分隔
String[] split = stringInputStreamMap.get(key).split("\\r?\\n");
}
}
}
}
//s3Config.getStaticDomain()
return result.success("查询成功");
}
/**
* url转变为 MultipartFile对象
* @param url
* @param fileName
* @return
* @throws Exception
*/
private static MultipartFile createFileItem(String url, String fileName) throws Exception{
FileItem item = null;
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setReadTimeout(30000);
conn.setConnectTimeout(30000);
//设置应用程序要从网络连接读取数据
conn.setDoInput(true);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream is = conn.getInputStream();
FileItemFactory factory = new DiskFileItemFactory(16, null);
String textFieldName = "uploadfile";
item = factory.createItem(textFieldName, ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName);
OutputStream os = item.getOutputStream();
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
is.close();
}
} catch (IOException e) {
throw new RuntimeException("文件下载失败", e);
}
return new CommonsMultipartFile(item);
}
/**
* 将MultipartFile转换为zipFile,用断言过滤
* @param inFile
*/
public Map<String,String> checkZip(MultipartFile inFile) {
InputStream fileStream = null;
InputStream inputStream =null;
File file = null;
Stream<? extends ZipEntry> signStream = null;
Stream<? extends ZipEntry> zipStream = null;
ZipFile zipFile = null;
//临时文件
Path path = Paths.get(System.getProperty("java.io.tmpdir"), inFile.getName() + UUID.randomUUID() + "zip");
file = path.toFile();
Map<String,String> map=new HashMap<>();
try {
fileStream = inFile.getInputStream();
org.apache.commons.io.FileUtils.copyInputStreamToFile(fileStream, file);
zipFile = new ZipFile(file, Charset.defaultCharset());
signStream = zipFile.stream();
zipStream = zipFile.stream();
try {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
if(zipEntry.isDirectory()){
//为空的文件夹什么都不做
}else {
String name = zipEntry.getName();
//根据文件拿到文件内容
inputStream = zipFile.getInputStream(zipFile.getEntry(name));
String s = this.readStream(inputStream);
map.put(name, s);
System.out.println("-------------------------------" + name);
}
}
zipFile.close();
}catch (Exception e){
log.error("失败!",e);
}
return map;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭流
inputStream.close();
fileStream.close();
signStream.close();
zipStream.close();
zipFile.close();
//删除临时文件
FileUtils.deleteQuietly(file);
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* InputStream转为String
* @param is
* @return
*/
public static String readStream(InputStream is) {
try {
ByteArrayOutputStream boa=new ByteArrayOutputStream();
int len=0;
byte[] buffer=new byte[1024];
while((len=is.read(buffer))!=-1){
boa.write(buffer,0,len);
}
is.close();
boa.close();
byte[] result=boa.toByteArray();
String temp=new String(result);
//识别编码
if(temp.contains("UTF-8")){
return new String(result,"UTF-8");
}else if(temp.contains("GBK")){
return new String(result,"GBK");
}else{
return new String(result,"UTF-8");
}
} catch (Exception e) {
log.error("InputStream转为String失败!",e);
e.printStackTrace();
return null;
}
}
}