Java 无法获取jar文件的InputStream句柄
我在这里尝试获取InputStream句柄时不断抛出异常。我在代码中是否做错了什么Java 无法获取jar文件的InputStream句柄,java,jar,ioexception,Java,Jar,Ioexception,我在这里尝试获取InputStream句柄时不断抛出异常。我在代码中是否做错了什么 public class JarClass { public static void main(String[] args) throws Exception { String jarFile = args[0]; ArrayList<String> classes = getClassesFromJARFile(jarFile); I
public class JarClass
{
public static void main(String[] args) throws Exception
{
String jarFile = args[0];
ArrayList<String> classes = getClassesFromJARFile(jarFile);
InputStream is = null;
OutputStream os = null;
File f = new File("/");
for(String cls : classes)
{
is = getFileFromJARFile(jarFile, cls);
os = (OutputStream) new FileOutputStream((new StringBuffer(f.getAbsolutePath()).append(cls.replace("/", File.separator))).toString());
while(is.available() > 0) {
os.write(is.read());
}
}
is.close();
os.close();
}
public static InputStream getFileFromJARFile(String jar, String fileName)
throws Exception
{
JarInputStream jis = null;
java.util.jar.JarFile jarFile = new java.util.jar.JarFile(jar);
try
{
jis = new JarInputStream(new FileInputStream(jar));
JarEntry jarEntry;
do
{
try
{
jarEntry = jis.getNextJarEntry();
}
catch (Exception ioe)
{
throw new Exception("Unable to get next jar entry from jar file '" + jar + "'");
}
if (jarEntry.getName().equals(fileName))
{
System.out.println(jarEntry.getName() + " found");
return jarFile.getInputStream(jarEntry); //<- I believe this is causing the ERROR
}
}
while (jarEntry != null);
closeJarFile(jis);
}
catch (Exception ioe)
{
throw new Exception("Unable to get Jar input stream from '" + jar + "'");
}
finally
{
closeJarFile(jis);
}
return null;
}
public static ArrayList<String> getClassesFromJARFile(String jar/*, String packageName*/) throws Exception
{
final ArrayList<String> classes = new ArrayList<String>();
JarInputStream jarFile = null;
try
{
jarFile = new JarInputStream(new FileInputStream(jar));
JarEntry jarEntry;
do
{
try
{
jarEntry = jarFile.getNextJarEntry();
}
catch (Exception ioe)
{
throw new Exception("Unable to get next jar entry from jar file '" + jar + "'");
}
if (jarEntry != null)
{
extractClassFromJar(jar, /*packageName,*/ classes, jarEntry);
}
}
while (jarEntry != null);
closeJarFile(jarFile);
}
catch (Exception ioe)
{
throw new Exception("Unable to get Jar input stream from '" + jar + "'");
}
finally
{
closeJarFile(jarFile);
}
return classes;
}
private static void extractClassFromJar(final String jar, /*final String packageName,*/ final ArrayList<String> classes, JarEntry jarEntry) throws Exception
{
String className = jarEntry.getName();
if (className.endsWith(".class"))
{
className = className.substring(0, className.length() - ".class".length());
//if (className.startsWith(packageName))
//{
try
{
classes.add(Class.forName(className.replace('/', '.')).toString());
}
catch (Exception cnfe)
{
throw new Exception("unable to find class named " + className.replace('/', '.') + "' within jar '" + jar + "'");
}
//}
}
}
private static void closeJarFile(final JarInputStream jarFile)
{
if (jarFile != null)
{
try
{
jarFile.close();
}
catch (IOException ioe)
{
}
}
}
}
我在这里使用的是molgenis项目样本的修改版本
在关闭流时不要介意异常处理,稍后我将添加finally
堆栈跟踪-
java.lang.Exception: unable to find class named com.android.vending.billing.IMarketBillingService' within jar 'G:\MyApp_dex2jar.jar'
at JarClass.extractClassFromJar(JarClass.java:144)
at JarClass.getClassesFromJARFile(JarClass.java:105)
at JarClass.main(JarClass.java:16)
at __SHELL26.run(__SHELL26.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at bluej.runtime.ExecServer$3.run(ExecServer.java:774)
java.lang.NullPointerException
at JarClass.getFileFromJARFile(JarClass.java:60)
at JarClass.main(JarClass.java:25)
at __SHELL26.run(__SHELL26.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at bluej.runtime.ExecServer$3.run(ExecServer.java:774)
java.io.FileNotFoundException: G:\com\android\vending\billing\IMarketBillingService (The system cannot find the path specified)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
at java.io.FileOutputStream.<init>(FileOutputStream.java:84)
at JarClass.main(JarClass.java:27)
java.lang.Exception:在jar'G:\MyApp\u dex2jar.jar'中找不到名为com.android.vending.billing.IMarketBillingService'的类
位于JarClass.extractClassFromJar(JarClass.java:144)
位于JarClass.getClassesFromJARFile(JarClass.java:105)
位于JarClass.main(JarClass.java:16)
运行(uuShell26.java:6)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
在bluej.runtime.ExecServer$3.run(ExecServer.java:774)
java.lang.NullPointerException
位于JarClass.getFileFromJARFile(JarClass.java:60)
位于JarClass.main(JarClass.java:25)
运行(uuShell26.java:6)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
在bluej.runtime.ExecServer$3.run(ExecServer.java:774)
java.io.FileNotFoundException:G:\com\android\vending\billing\IMarketBillingService(系统找不到指定的路径)
在java.io.FileOutputStream.open(本机方法)
位于java.io.FileOutputStream。(FileOutputStream.java:194)
位于java.io.FileOutputStream。(FileOutputStream.java:84)
位于JarClass.main(JarClass.java:27)
传递原始异常总是很有用的:抛出新异常(“无法从jar文件“+jar+””,ioe中获取下一个jar条目)代码>。然后给我们堆栈跟踪。使用stacktrace编辑。我们需要原始异常的stacktrace。添加ioe.printStackTrace()
。好,添加成功。
java.lang.Exception: unable to find class named com.android.vending.billing.IMarketBillingService' within jar 'G:\MyApp_dex2jar.jar'
at JarClass.extractClassFromJar(JarClass.java:144)
at JarClass.getClassesFromJARFile(JarClass.java:105)
at JarClass.main(JarClass.java:16)
at __SHELL26.run(__SHELL26.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at bluej.runtime.ExecServer$3.run(ExecServer.java:774)
java.lang.NullPointerException
at JarClass.getFileFromJARFile(JarClass.java:60)
at JarClass.main(JarClass.java:25)
at __SHELL26.run(__SHELL26.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at bluej.runtime.ExecServer$3.run(ExecServer.java:774)
java.io.FileNotFoundException: G:\com\android\vending\billing\IMarketBillingService (The system cannot find the path specified)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
at java.io.FileOutputStream.<init>(FileOutputStream.java:84)
at JarClass.main(JarClass.java:27)