/** * 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; }