/**
   * Closes the current tar entry
   *
   * @throws IOException
   */
  protected void closeCurrentEntry() throws IOException {
    if (currentEntry != null) {
      if (currentEntry.getSize() > currentFileSize) {
        throw new IOException(
            "The current entry["
                + currentEntry.getName()
                + "] of size["
                + currentEntry.getSize()
                + "] has not been fully written.");
      }

      currentEntry = null;
      currentFileSize = 0;

      pad();
    }
  }
  /**
   * Checks if the bytes being written exceed the current entry size.
   *
   * @see java.io.FilterOutputStream#write(byte[], int, int)
   */
  @Override
  public void write(byte[] b, int off, int len) throws IOException {
    if (currentEntry != null && !currentEntry.isDirectory()) {
      if (currentEntry.getSize() < currentFileSize + len) {
        throw new IOException(
            "The current entry["
                + currentEntry.getName()
                + "] size["
                + currentEntry.getSize()
                + "] is smaller than the bytes["
                + (currentFileSize + len)
                + "] being written.");
      }
    }

    out.write(b, off, len);

    bytesWritten += len;

    if (currentEntry != null) {
      currentFileSize += len;
    }
  }
  public boolean extractTar(String asset, String target) {

    byte buf[] = new byte[1024 * 1024];

    InputStream assetStream = null;
    TarInputStream tis = null;

    try {
      assetStream = mAssetManager.open(asset, AssetManager.ACCESS_STREAMING);
      tis =
          new TarInputStream(
              new BufferedInputStream(
                  new GZIPInputStream(new BufferedInputStream(assetStream, 8192)), 8192));
    } catch (IOException e) {
      Log.e("python", "opening up extract tar", e);
      return false;
    }

    while (true) {
      TarEntry entry = null;

      try {
        entry = tis.getNextEntry();
      } catch (java.io.IOException e) {
        Log.e("python", "extracting tar", e);
        return false;
      }

      if (entry == null) {
        break;
      }

      Log.i("python", "extracting " + entry.getName());

      if (entry.isDirectory()) {

        try {
          new File(target + "/" + entry.getName()).mkdirs();
        } catch (SecurityException e) {
        }
        ;

        continue;
      }

      OutputStream out = null;
      String path = target + "/" + entry.getName();

      try {
        out = new BufferedOutputStream(new FileOutputStream(path), 8192);
      } catch (FileNotFoundException e) {
      } catch (SecurityException e) {
      }
      ;

      if (out == null) {
        Log.e("python", "could not open " + path);
        return false;
      }

      try {
        while (true) {
          int len = tis.read(buf);

          if (len == -1) {
            break;
          }

          out.write(buf, 0, len);
        }

        out.flush();
        out.close();
      } catch (java.io.IOException e) {
        Log.e("python", "extracting zip", e);
        return false;
      }
    }

    try {
      tis.close();
      assetStream.close();
    } catch (IOException e) {
      // pass
    }

    return true;
  }