Commit 2b1f815c authored by Skylot's avatar Skylot

core: refactor streams closing

parent 0fff1a67
......@@ -22,11 +22,14 @@ import java.util.zip.ZipFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static jadx.core.utils.files.FileUtils.READ_BUFFER_SIZE;
import static jadx.core.utils.files.FileUtils.close;
import static jadx.core.utils.files.FileUtils.copyStream;
// TODO: move to core package
public final class ResourcesLoader {
private static final Logger LOG = LoggerFactory.getLogger(ResourcesLoader.class);
private static final int READ_BUFFER_SIZE = 8 * 1024;
private static final int LOAD_SIZE_LIMIT = 10 * 1024 * 1024;
private final JadxDecompiler jadxRef;
......@@ -70,12 +73,10 @@ public final class ResourcesLoader {
if (zipFile != null) {
zipFile.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (Exception e) {
LOG.debug("Error close zip file: {}", zipRef, e);
LOG.error("Error close zip file: {}", zipRef, e);
}
close(inputStream);
}
return result;
}
......@@ -149,24 +150,12 @@ public final class ResourcesLoader {
ResourceFile rf = new ResourceFile(jadxRef, name, type);
rf.setZipRef(new ZipRef(zipFile, name));
list.add(rf);
// LOG.debug("Add resource entry: {}, size: {}", name, entry.getSize());
}
public static CodeWriter loadToCodeWriter(InputStream is) throws IOException {
CodeWriter cw = new CodeWriter();
ByteArrayOutputStream baos = new ByteArrayOutputStream(READ_BUFFER_SIZE);
byte[] buffer = new byte[READ_BUFFER_SIZE];
int count;
try {
while ((count = is.read(buffer)) != -1) {
baos.write(buffer, 0, count);
}
} finally {
try {
is.close();
} catch (Exception ignore) {
}
}
copyStream(is, baos);
cw.add(baos.toString("UTF-8"));
return cw;
}
......
......@@ -27,6 +27,8 @@ import java.util.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static jadx.core.utils.files.FileUtils.close;
/**
* Classes list for import into classpath graph
*/
......@@ -115,13 +117,13 @@ public class ClsSet {
out.putNextEntry(new ZipEntry(CLST_PKG_PATH + "/" + CLST_FILENAME));
save(out);
} finally {
out.close();
close(out);
}
} else {
throw new JadxRuntimeException("Unknown file format: " + outputName);
}
} finally {
outputStream.close();
close(outputStream);
}
}
......@@ -144,7 +146,7 @@ public class ClsSet {
}
}
} finally {
out.close();
close(out);
}
}
......@@ -156,7 +158,7 @@ public class ClsSet {
try {
load(input);
} finally {
input.close();
close(input);
}
}
......@@ -177,13 +179,13 @@ public class ClsSet {
entry = in.getNextEntry();
}
} finally {
in.close();
close(in);
}
} else {
throw new JadxRuntimeException("Unknown file format: " + name);
}
} finally {
inputStream.close();
close(inputStream);
}
}
......@@ -213,7 +215,7 @@ public class ClsSet {
classes[i].setParents(parents);
}
} finally {
in.close();
close(in);
}
}
......
......@@ -16,6 +16,8 @@ import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static jadx.core.utils.files.FileUtils.close;
public class CodeWriter {
private static final Logger LOG = LoggerFactory.getLogger(CodeWriter.class);
private static final int MAX_FILENAME_LENGTH = 128;
......@@ -304,9 +306,7 @@ public class CodeWriter {
} catch (Exception e) {
LOG.error("Save file error", e);
} finally {
if (out != null) {
out.close();
}
close(out);
}
}
}
......@@ -6,6 +6,8 @@ import java.io.IOException;
import org.objectweb.asm.ClassReader;
import static jadx.core.utils.files.FileUtils.close;
public class AsmUtils {
private AsmUtils() {
......@@ -19,9 +21,7 @@ public class AsmUtils {
ClassReader classReader = new ClassReader(in);
className = classReader.getClassName();
} finally {
if (in != null) {
in.close();
}
close(in);
}
return className;
}
......
......@@ -3,13 +3,22 @@ package jadx.core.utils.files;
import jadx.core.utils.exceptions.JadxRuntimeException;
import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FileUtils {
private static final Logger LOG = LoggerFactory.getLogger(FileUtils.class);
public static final int READ_BUFFER_SIZE = 8 * 1024;
private FileUtils() {
}
......@@ -20,21 +29,12 @@ public class FileUtils {
JarEntry entry = new JarEntry(entryName);
entry.setTime(source.lastModified());
jar.putNextEntry(entry);
in = new BufferedInputStream(new FileInputStream(source));
byte[] buffer = new byte[8192];
while (true) {
int count = in.read(buffer);
if (count == -1) {
break;
}
jar.write(buffer, 0, count);
}
in = new BufferedInputStream(new FileInputStream(source));
copyStream(in, jar);
jar.closeEntry();
} finally {
if (in != null) {
in.close();
}
close(in);
}
}
......@@ -59,4 +59,26 @@ public class FileUtils {
}
return temp;
}
public static void copyStream(InputStream input, OutputStream output) throws IOException {
byte[] buffer = new byte[READ_BUFFER_SIZE];
while (true) {
int count = input.read(buffer);
if (count == -1) {
break;
}
output.write(buffer, 0, count);
}
}
public static void close(Closeable c) {
if (c == null) {
return;
}
try {
c.close();
} catch (IOException e) {
LOG.error("Close exception for {}", c, e);
}
}
}
......@@ -21,6 +21,8 @@ import org.slf4j.LoggerFactory;
import com.android.dex.Dex;
import static jadx.core.utils.files.FileUtils.close;
public class InputFile {
private static final Logger LOG = LoggerFactory.getLogger(InputFile.class);
......@@ -96,14 +98,14 @@ public class InputFile {
try {
IOUtils.copy(inputStream, fos);
} finally {
fos.close();
close(fos);
}
addDexFile(entryName, loadFromJar(jarFile));
} else {
throw new JadxRuntimeException("Unexpected extension in zip: " + ext);
}
} finally {
inputStream.close();
close(inputStream);
}
index++;
if (index == 1) {
......@@ -144,12 +146,8 @@ public class InputFile {
}
FileUtils.addFileToJar(jo, file, clsName + ".class");
} finally {
if (jo != null) {
jo.close();
}
if (out != null) {
out.close();
}
close(jo);
close(out);
}
return loadFromJar(outFile);
}
......
......@@ -11,6 +11,10 @@ import com.android.dx.command.DxConsole;
import com.android.dx.command.dexer.Main;
import com.android.dx.command.dexer.Main.Arguments;
import static com.android.dx.command.dexer.Main.run;
import static jadx.core.utils.files.FileUtils.close;
import static java.lang.System.setOut;
public class JavaToDex {
private static final String CHARSET_NAME = "UTF-8";
......@@ -41,14 +45,14 @@ public class JavaToDex {
PrintStream oldOut = System.out;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
System.setOut(new PrintStream(baos, true, CHARSET_NAME));
setOut(new PrintStream(baos, true, CHARSET_NAME));
DxArgs args = new DxArgs("-", new String[]{javaFile});
resetOutDexVar();
Main.run(args);
baos.close();
run(args);
} catch (Throwable e) {
throw new JadxException("dx exception: " + e.getMessage(), e);
} finally {
close(baos);
System.setOut(oldOut);
}
try {
......
......@@ -19,6 +19,8 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import static jadx.core.utils.files.FileUtils.close;
public class ManifestAttributes {
private static final Logger LOG = LoggerFactory.getLogger(ManifestAttributes.class);
......@@ -63,7 +65,8 @@ public class ManifestAttributes {
}
private Document loadXML(String xml) throws JadxException, ParserConfigurationException, SAXException, IOException {
Document doc;InputStream xmlStream = null;
Document doc;
InputStream xmlStream = null;
try {
xmlStream = ManifestAttributes.class.getResourceAsStream(xml);
if (xmlStream == null) {
......@@ -72,9 +75,7 @@ public class ManifestAttributes {
DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = dBuilder.parse(xmlStream);
} finally {
if (xmlStream != null) {
xmlStream.close();
}
close(xmlStream);
}
return doc;
}
......
......@@ -15,7 +15,6 @@ import jadx.core.dex.visitors.DepthTraversal;
import jadx.core.dex.visitors.IDexTreeVisitor;
import jadx.core.utils.exceptions.CodegenException;
import jadx.core.utils.exceptions.JadxException;
import jadx.core.utils.files.FileUtils;
import jadx.tests.api.compiler.DynamicCompiler;
import jadx.tests.api.compiler.StaticCompiler;
import jadx.tests.api.utils.TestUtils;
......@@ -35,6 +34,8 @@ import java.util.List;
import java.util.Map;
import java.util.jar.JarOutputStream;
import static jadx.core.utils.files.FileUtils.addFileToJar;
import static jadx.core.utils.files.FileUtils.close;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.is;
......@@ -261,9 +262,9 @@ public abstract class IntegrationTest extends TestUtils {
File temp = createTempFile(".jar");
JarOutputStream jo = new JarOutputStream(new FileOutputStream(temp));
for (File file : list) {
FileUtils.addFileToJar(jo, file, path + "/" + file.getName());
addFileToJar(jo, file, path + "/" + file.getName());
}
jo.close();
close(jo);
return temp;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment