赞
踩
maven依赖:
<!-- https://mvnrepository.com/artifact/com.github.junrar/junrar -->
<dependency>
<groupId>com.github.junrar</groupId>
<artifactId>junrar</artifactId>
<version>2.0.0</version>
</dependency>
在使用该jar包进行解析时候引发的内存爆满机器卡死,如图:
看源码发现每一次解压都new了一个线程,但是却没有对线程进行管理,改造如下:
代码示例:
- private void extractRarFile(InputStream inputStream) {
- UnRarUtils archive = null;
- InputStream is = null;
- try {
- // 解析文件
- archive = new UnRarUtils(inputStream);
- if (archive == null) {
- throw new FileNotFoundException(" not found!");
- }
- if (archive.isEncrypted()) {
- throw new Exception(" is encrypted!");
- }
- List<FileHeader> files = archive.getFileHeaders();
- if (files.size() == 0) {
- return ;
- }
-
- for (FileHeader fh : files) {
- try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\子文件")))){
- // 判断子文件是否加密
- if (fh.isEncrypted()) {
- continue;
- }
-
- // 获取文件名
- String fileName;
- if (StringUtils.isNotBlank(fh.getFileNameW())) {
- fileName = fh.getFileNameW();
- } else if (StringUtils.isNotBlank(fh.getFileNameString())) {
- fileName = fh.getFileNameString();
- } else {
- continue;
- }
-
- // 获取子文件字节流
- is = archive.getInputStream(fh);
- byte[] bytes = IOUtils.toByteArray(is);
- if (bytes.length <= 0) {
- continue;
- }
- is.close();
-
- // 输出子文件
- writer.write(new String(bytes));
- return;
- } catch (Exception e) {
- throw new RuntimeException("exception");
- } finally {
- try {
- if (is != null) {
- is.close();
- }
- } catch (Exception e) {
-
- }
- }
- }
- archive.close();
- inputStream.close();
- } catch (Exception e) {
-
- } finally {
- try {
- if (archive != null) {
- archive.close();
- }
- if (inputStream != null) {
- inputStream.close();
- }
- } catch (IOException e) {
-
- }
- }
- return;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。