Java中使用InputStream读入Jar/zip内容

简介: Java中使用InputStream读入Jar/zip内容

因为项目需要,要把一个zip/jar文件读入到后台服务器上,前台用户选择好zip/jar文件


以后,upload文件之后,从JarFile对象中循环读取JarEntry对象,然后根据JarFile的


API使用jarFile.getInputStream(JarEntry jarEntry)来读取每个JarEntry的内容。


可是最近他们想把文件读入变成基于inputstream的直接读取,从http请求中获取


inputstream之后可以直接读入。这样问题就来,怎么从流中知道每个JarEntry对象


一番研究之后,有了下面的代码:

package com.gloomyfish.image.study;
 
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
 
public class JarFileReader {
  private JarInputStream jarInput;
  private HashMap<String, ByteArrayOutputStream> entriesStreamMap;
  public JarFileReader(InputStream in) throws IOException {
    jarInput = new JarInputStream(in);
    entriesStreamMap = new HashMap<String, ByteArrayOutputStream>();
  }
  
  public void readEntries() throws IOException {
    JarEntry entry = jarInput.getNextJarEntry();
    String manifestEntry = null;
    while(entry != null) {
      System.out.println("Entry Name = " + entry.getName());
      if("jp/co/sony/csl/nielsen/phoenix/objectremoval/Mark.class".equals(entry.getName())) {
        manifestEntry = entry.getName();
        copyInputStream(jarInput, entry.getName());   
      }
      entry = jarInput.getNextJarEntry();
    }
    System.out.println("Now!! + get jar entry inputstream again...");
    InputStream inputStream = getCopy(manifestEntry);
    System.out.println(inputStream.read());
  }
  
  public void copyInputStream(InputStream in, String entryName) throws IOException {
    if(!entriesStreamMap.containsKey(entryName)) {
      ByteArrayOutputStream _copy = new ByteArrayOutputStream();
      int read = 0;
      int chunk = 0;
      byte[] data = new byte[256];
      while(-1 != (chunk = in.read(data)))
      {
        read += data.length;
        _copy.write(data, 0, chunk);
      }
      entriesStreamMap.put(entryName, _copy);
    }
  }
  
  public InputStream getCopy(String entryName) {
    ByteArrayOutputStream _copy = entriesStreamMap.get(entryName);
    return (InputStream)new ByteArrayInputStream(_copy.toByteArray());
  }
  
  public static void main(String[] args) {
    File jarFile = new File("D:\\agriculture\\clickremoval.jar");
    try {
      InputStream in = new BufferedInputStream(new FileInputStream(jarFile));
      JarFileReader reader = new JarFileReader(in);
      reader.readEntries();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  
}
相关文章
|
15天前
|
Java jenkins 持续交付
Java项目jar包启动脚本,适用jenkins或定时任务或手动执行
Java项目jar包启动脚本,适用jenkins或定时任务或手动执行
|
8天前
|
IDE 数据可视化 Java
Java基础6-Java文件和Java包结构和常用的jar包(二)
Java基础6-Java文件和Java包结构和常用的jar包(二)
13 0
|
8天前
|
Java Unix 编译器
Java基础6-Java文件和Java包结构和常用的jar包(一)
Java基础6-Java文件和Java包结构和常用的jar包(一)
17 0
|
16天前
|
Java
电脑玩诺基亚手机jar游戏java-涂鸦地带举例
电脑玩诺基亚手机jar游戏java-涂鸦地带举例
|
1月前
|
JavaScript 前端开发 Java
java项目的打包将vue放到.jar里面部署
java项目的打包将vue放到.jar里面部署
|
1月前
|
Java
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
129 0
|
1月前
|
Java Maven
【亮剑】Java项目开发中常遇到Jar 包依赖冲突问题,主要由不同版本库、循环依赖、传递依赖和依赖范围不当引起
【4月更文挑战第30天】Java项目开发中常遇到依赖冲突问题,主要由不同版本库、循环依赖、传递依赖和依赖范围不当引起。解决冲突需分析依赖树、定位冲突源、调整类加载顺序等。方法包括排除冲突依赖、统一管理版本、限定依赖范围、合并冲突类、升级降级库版本及拆分模块。关注依赖关系,及时解决冲突,保障项目稳定运行。
|
1天前
|
Java 开发者
线程的诞生之路:Java多线程创建方法的抉择与智慧
【6月更文挑战第19天】Java多线程编程中,开发者可选择继承Thread类或实现Runnable接口。继承Thread直接但受限于单继承,适合简单场景;实现Runnable更灵活,支持代码复用,适用于如银行转账这类需多线程处理的复杂任务。在资源管理和任务执行控制上,Runnable接口通常更优。
|
1天前
|
Java
Java 多线程新手必读:线程的创建技巧与陷阱
【6月更文挑战第19天】Java多线程初学者须知:创建线程可通过继承`Thread`或实现`Runnable`接口。继承`Thread`限制单继承,实现`Runnable`更灵活。记得调用`start()`而非`run()`启动线程,避免并发问题时需正确同步共享资源。示例代码展示两种创建方式及未同步导致的问题。
|
1天前
|
Java
揭秘!为何Java多线程中,继承Thread不如实现Runnable?
【6月更文挑战第19天】在Java多线程中,实现`Runnable`比继承`Thread`更佳,因Java单继承限制,`Runnable`可实现接口复用,便于线程池管理,并分离任务与线程,提高灵活性。当需要创建线程或考虑代码复用时,实现`Runnable`是更好的选择。

热门文章

最新文章