Java 无法获取jar文件的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

我在这里尝试获取InputStream句柄时不断抛出异常。我在代码中是否做错了什么

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)