这段代码会导致F:\detailsZIP\cccccnew.zip: 另一个程序正在使用此文件,进程无法访问。这个问题吗; List<UnzipFileVo> vos = new ArrayList<>(); ZipFile zip = null; InputStream in = null; try { if (Objects.isNull(file)) { // if (Objects.isNull(file) || !file.exists()) { return Collections.emptyList(); } //ZipFile zip = new ZipFile(file); //F:\detailsZIP\有文本.zip zip = new ZipFile(file, Charset.forName("GBK"));//解决中文乱码 if (Objects.isNull(zip)) { return Collections.emptyList(); } ZipFile zf = new ZipFile(file); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); ZipInputStream zis = new ZipInputStream(bis); ZipEntry ze; while((ze=zis.getNextEntry()) != null){ if(ze.isDirectory()){ System.out.println("这是目录"); }else{ UnzipFileVo vo = new UnzipFileVo(); if(ze.getName().endsWith(".png")){ vo = parseName(ze.getName(), ze, vo); }else if(ze.getName().endsWith(".jpg")){ vo = parseName(ze.getName(), ze, vo); } in = zip.getInputStream(ze); MultipartFile multipartFile = getMultipartFile(in, System.currentTimeMillis() + ".png"); vo.setMultipartFile(multipartFile); vos.add(vo); } } } catch (Exception e) { e.printStackTrace(); if (Objects.nonNull(e)) { throw new ServiceException("文件有误,请重新上传!"); } else { Integer code = ((CheckedException) e).getCode(); if (Objects.equals(code, 201)) { throw new CheckedException(e.getMessage()); } } } finally { if (Objects.nonNull(zip)) { try { zip.close(); } catch (IOException e) { e.printStackTrace(); } } if (Objects.nonNull(in)) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } //强制清空原来的文件 FileUtil.clean(zipPath); } return vos;
时间: 2023-08-02 08:07:16 浏览: 204
tomcat启动报错:java.util.zip.ZipException的解决方法
5星 · 资源好评率100%
这段代码中使用了ZipFile和InputStream来读取压缩文件的内容,但是在finally块中并没有关闭这些资源。如果在读取文件过程中出现异常,这些资源将不会被关闭,可能会导致文件被占用,造成后续的操作失败。
另外,代码中使用了两次ZipFile来打开同一个压缩文件,这是不必要的。
建议对代码进行如下修改:
```java
List<UnzipFileVo> vos = new ArrayList<>();
ZipFile zip = null;
try {
if (Objects.isNull(file) || !file.exists()) {
return Collections.emptyList();
}
zip = new ZipFile(file, Charset.forName("GBK"));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ZipInputStream zis = new ZipInputStream(bis);
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
if (ze.isDirectory()) {
System.out.println("这是目录");
} else {
UnzipFileVo vo = new UnzipFileVo();
if (ze.getName().endsWith(".png") || ze.getName().endsWith(".jpg")) {
vo = parseName(ze.getName(), ze, vo);
InputStream in = zip.getInputStream(ze);
MultipartFile multipartFile = getMultipartFile(in, System.currentTimeMillis() + ".png");
vo.setMultipartFile(multipartFile);
vos.add(vo);
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException("文件有误,请重新上传!");
} finally {
if (Objects.nonNull(zip)) {
try {
zip.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//强制清空原来的文件
FileUtil.clean(zipPath);
}
return vos;
```
在修改后的代码中,只使用了一次ZipFile来打开压缩文件,并且在finally块中关闭了ZipFile和InputStream。同时,只有当文件名以".png"或".jpg"结尾时,才会读取该文件的内容并将其转换成MultipartFile对象。
阅读全文