content: package net.csdn.common.scan.component;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.util.jar.JarEntry;
  import java.util.jar.JarInputStream;
  
  
  public class JarIterator implements StreamIterator {
      JarInputStream jar;
      JarEntry next;
      Filter filter;
      boolean initial = true;
      boolean closed = false;
  
      public JarIterator(File file, Filter filter) throws IOException {
          this(new FileInputStream(file), filter);
      }
  
  
      public JarIterator(InputStream is, Filter filter) throws IOException {
          this.filter = filter;
          jar = new JarInputStream(is);
      }
  
      private void setNext() {
          initial = true;
          try {
              if (next != null) jar.closeEntry();
              next = null;
              do {
                  next = jar.getNextJarEntry();
              } while (next != null && (next.isDirectory() || (filter == null || !filter.accepts(next.getName()))));
              if (next == null) {
                  close();
              }
          } catch (IOException e) {
              throw new RuntimeException("failed to browse jar", e);
          }
      }
  
      public InputStream next() {
          if (closed || (next == null && !initial)) return null;
          setNext();
          if (next == null) return null;
          return new InputStreamWrapper(jar);
      }
  
      public void close() {
          try {
              closed = true;
              jar.close();
          } catch (IOException ignored) {
  
          }
  
      }
  }
  