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();
    }
  }
  
}
相关文章
|
1月前
|
druid Java Maven
杨校老师课堂之java_关于如何下载jar包的教程
杨校老师课堂之java_关于如何下载jar包的教程
59 0
|
1月前
|
Java 数据库 数据安全/隐私保护
Java操作Excel文件导入导出【内含有 jxl.jar 】
Java操作Excel文件导入导出【内含有 jxl.jar 】
36 0
|
29天前
|
Java 数据处理 开发者
Java IO流专家级教程:深入理解InputStream/OutputStream和Reader/Writer的内部机制
【6月更文挑战第26天】Java IO流涉及字节流(InputStream/OutputStream)和字符流(Reader/Writer),用于高效处理数据输入输出。InputStream/OutputStream处理二进制数据,常使用缓冲提升性能;Reader/Writer处理文本,关注字符编码转换。两者都有阻塞IO操作,但Java NIO支持非阻塞。示例代码展示了如何使用FileInputStream/FileOutputStream和FileReader/FileWriter读写文件。理解这些流的内部机制有助于优化代码性能。
|
29天前
|
Java 开发者
Java IO流实战技巧:如何优化InputStream/OutputStream和Reader/Writer的使用?
【6月更文挑战第26天】Java IO流优化涉及缓冲、资源管理、字符编码和流式处理。使用Buffered流提高读写效率,如`BufferedInputStream`和`BufferedReader`。确保资源关闭使用try-with-resources,如`try (InputStream is = ...) {...}`。处理文本时指定编码,如`InputStreamReader(is, StandardCharsets.UTF_8)`防止乱码。流式处理大文件,分块读写避免内存溢出,以减少内存占用。这些技巧能提升程序性能和健壮性。
|
29天前
|
Java
Java IO流终极指南:从InputStream/OutputStream到Reader/Writer的全面解读
【6月更文挑战第26天】Java IO流涵盖字节流(InputStream/OutputStream)和字符流(Reader/Writer),前者处理二进制数据,后者专司文本。例如,FileInputStream/FileOutputStream用于文件的字节级读写,而FileReader/FileWriter处理字符级文本。Buffered流提供缓冲功能,提升效率。选择合适的流类取决于数据类型和性能需求。
|
29天前
|
存储 设计模式 Java
Java IO流大揭秘:如何高效使用InputStream/OutputStream和Reader/Writer?
【6月更文挑战第26天】Java IO流核心基础,涉及InputStream/OutputStream(字节流)和Reader/Writer(字符流)。高效使用的关键包括:使用Buffered流提升性能,如BufferedInputStream和BufferedOutputStream;处理编码,通过InputStreamReader和OutputStreamWriter指定如UTF-8编码;应用装饰器模式,如DataOutputStream增强功能。理解并巧妙运用这些技巧能优化数据读写操作。
|
29天前
|
Java
深入探索Java IO流:InputStream/OutputStream与Reader/Writer的奥秘!
【6月更文挑战第26天】Java IO流用于输入输出操作,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)。InputStream和OutputStream处理字节数据,是所有字节流的基类,可被继承以自定义读写行为。
|
29天前
|
Java Maven
java运行jar包提示 “XXX中没有主清单属性”,配置maven插件
java运行jar包提示 “XXX中没有主清单属性”,配置maven插件
22 0
|
1月前
|
Java
Java将指定文件/文件夹压缩成zip、rar压缩文件--解決中文乱码
Java将指定文件/文件夹压缩成zip、rar压缩文件--解決中文乱码
20 0
|
1月前
|
Java 数据库连接 Spring
杨校老师课堂之Java EE框架SSM所需jar包下载
杨校老师课堂之Java EE框架SSM所需jar包下载
29 0

热门文章

最新文章