Esempio n. 1
0
  public List<File> unpack(File archiveFile, File targetDir) throws ArchiveException {
    // 首先判断下对应的目标文件是否存在,如存在则执行删除
    if (false == archiveFile.exists()) {
      throw new ArchiveException(String.format("[%s] not exist", archiveFile.getAbsolutePath()));
    }
    if (false == targetDir.exists() && false == NioUtils.create(targetDir, false, 3)) {
      throw new ArchiveException(
          String.format("[%s] not exist and create failed", targetDir.getAbsolutePath()));
    }

    List<File> result = new ArrayList<File>();
    ZipFile zipFile = null;
    try {
      zipFile = new ZipFile(archiveFile);
      Enumeration entries = zipFile.entries();

      while (entries.hasMoreElements()) {
        // entry
        ZipEntry entry = (ZipEntry) entries.nextElement();
        String entryName = entry.getName();
        // target
        File targetFile = new File(targetDir, entryName);
        NioUtils.create(targetFile.getParentFile(), false, 3); // 尝试创建父路径
        InputStream input = null;
        OutputStream output = null;
        try {
          output = new FileOutputStream(targetFile);
          input = zipFile.getInputStream(entry);
          NioUtils.copy(input, output);
        } finally {
          IOUtils.closeQuietly(input);
          IOUtils.closeQuietly(output);
        }
        result.add(targetFile);
      }

    } catch (Exception e) {
      throw new ArchiveException(e);
    } finally {
      if (zipFile != null) {
        try {
          zipFile.close();
        } catch (IOException ex) {
        }
      }
    }

    return result;
  }
Esempio n. 2
0
 public byte[] getDataAsByteArray() {
   try {
     return NioUtils.read(mFile);
   } catch (IOException e) {
     throw new DataRetrieveException(e);
   }
 }
Esempio n. 3
0
  /** 执行压缩 */
  private boolean doPack(
      final File targetArchiveFile,
      List<FileData> fileDatas,
      final ArchiveRetriverCallback<FileData> callback) {
    // 首先判断下对应的目标文件是否存在,如存在则执行删除
    if (true == targetArchiveFile.exists() && false == NioUtils.delete(targetArchiveFile, 3)) {
      throw new ArchiveException(
          String.format("[%s] exist and delete failed", targetArchiveFile.getAbsolutePath()));
    }

    boolean exist = false;
    ZipOutputStream zipOut = null;
    Set<String> entryNames = new HashSet<String>();
    BlockingQueue<Future<ArchiveEntry>> queue =
        new LinkedBlockingQueue<Future<ArchiveEntry>>(); // 下载成功的任务列表
    ExecutorCompletionService completionService = new ExecutorCompletionService(executor, queue);

    final File targetDir =
        new File(
            targetArchiveFile.getParentFile(),
            FilenameUtils.getBaseName(targetArchiveFile.getPath()));
    try {
      // 创建一个临时目录
      FileUtils.forceMkdir(targetDir);

      zipOut =
          new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(targetArchiveFile)));
      zipOut.setLevel(Deflater.BEST_SPEED);
      // 进行并发压缩处理
      for (final FileData fileData : fileDatas) {
        if (fileData.getEventType().isDelete()) {
          continue; // 忽略delete类型的数据打包,因为只需直接在目标进行删除
        }

        String namespace = fileData.getNameSpace();
        String path = fileData.getPath();
        boolean isLocal = StringUtils.isBlank(namespace);
        String entryName = null;
        if (true == isLocal) {
          entryName = FilenameUtils.getPath(path) + FilenameUtils.getName(path);
        } else {
          entryName = namespace + File.separator + path;
        }

        // 过滤一些重复的文件数据同步
        if (entryNames.contains(entryName) == false) {
          entryNames.add(entryName);
        } else {
          continue;
        }

        final String name = entryName;
        if (true == isLocal && !useLocalFileMutliThread) {
          // 采用串行处理,不走临时文件
          queue.add(new DummyFuture(new ArchiveEntry(name, callback.retrive(fileData))));
        } else {
          completionService.submit(
              new Callable<ArchiveEntry>() {

                public ArchiveEntry call() throws Exception {
                  // 处理下异常,可能失败
                  InputStream input = null;
                  OutputStream output = null;
                  try {
                    input = callback.retrive(fileData);

                    if (input instanceof LazyFileInputStream) {
                      input = ((LazyFileInputStream) input).getInputSteam(); // 获取原始的stream
                    }

                    if (input != null) {
                      File tmp = new File(targetDir, name);
                      NioUtils.create(tmp.getParentFile(), false, 3); // 尝试创建父路径
                      output = new FileOutputStream(tmp);
                      NioUtils.copy(input, output); // 拷贝到文件
                      return new ArchiveEntry(name, new File(targetDir, name));
                    } else {
                      return new ArchiveEntry(name);
                    }
                  } finally {
                    IOUtils.closeQuietly(input);
                    IOUtils.closeQuietly(output);
                  }
                }
              });
        }
      }

      for (int i = 0; i < entryNames.size(); i++) {
        // 读入流
        ArchiveEntry input = null;
        InputStream stream = null;
        try {
          input = queue.take().get();
          if (input == null) {
            continue;
          }

          stream = input.getStream();
          if (stream == null) {
            continue;
          }

          if (stream instanceof LazyFileInputStream) {
            stream = ((LazyFileInputStream) stream).getInputSteam(); // 获取原始的stream
          }

          exist = true;
          zipOut.putNextEntry(new ZipEntry(input.getName()));
          NioUtils.copy(stream, zipOut); // 输出到压缩流中
          zipOut.closeEntry();
        } finally {
          IOUtils.closeQuietly(stream);
        }
      }

      if (exist) {
        zipOut.finish();
      }
    } catch (Exception e) {
      throw new ArchiveException(e);
    } finally {
      IOUtils.closeQuietly(zipOut);
      try {
        FileUtils.deleteDirectory(targetDir); // 删除临时目录
      } catch (IOException e) {
        // ignore
      }
    }

    return exist;
  }