Java Jar不能在Android上工作



我编写了一个小Java应用程序,并将其编译成一个可执行的jar文件。该程序使用在jar文件中编译的.txt文件。为了访问jar中的.txt文件,您需要使用classloader . getsystemresourcessteam (");

下面是jar文件中的方法:
 private ArrayList<String> loadChainRestaurantsList() throws IOException {
        ArrayList chains = new ArrayList();
        InputStream in = ClassLoader.getSystemResourceAsStream("chains.txt");
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String name;
        while((name = reader.readLine()) != null) {
            chains.add(name);
        }
        return chains;
    }

如果我从命令行将jar作为独立的Java程序运行,或者从Eclipse运行,则此代码可以工作。它甚至可以工作,如果我导出一个jar,然后把它扔到另一个Java程序中并使用它,它可以像预期的那样工作。问题是,当我将jar放入Android项目时。我得到这个错误:

FATAL EXCEPTION: AsyncTask #1
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime: Process: com.jasonjohn.unchainedandroid, PID: 8821
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at android.os.AsyncTask$3.done(AsyncTask.java)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:  Caused by: java.lang.NullPointerException: lock == null
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.io.Reader.<init>(Reader.java:64)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.io.InputStreamReader.<init>(InputStreamReader.java:120)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.io.InputStreamReader.<init>(InputStreamReader.java:57)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at com.jasonjohn.unchainedapi.UnchainedAPI.loadChainRestaurantsList(UnchainedAPI.java:123)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at com.jasonjohn.unchainedapi.UnchainedAPI.getUnchainedRestaurants(UnchainedAPI.java:71)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at com.jasonjohn.unchainedandroid.MainActivity$UnchainedAsync.doInBackground(MainActivity.java:69)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at com.jasonjohn.unchainedandroid.MainActivity$UnchainedAsync.doInBackground(MainActivity.java:62)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java) 
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
10-01 10:40:59.650 8821-8879/? E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 

我以前从未见过这个错误。有人能解释一下这是怎么回事吗?我假设InputStream/InputStreamReader是空的,但我不知道如何解决这个问题。

你应该使用

getResourceAsStream("/chains.txt")

而不是

getSystemResourceAsStream(...).

路径前面的/表示查看jar的根目录。否则,它将在与获得类加载器的类相同的包中查找chains.txt。如。

package com.potter.harry;
...
InputStream is = this.getClass().getResourceAsStream("chains.txt");

所引用的文件必须放在"/com/potter/harry/chains.txt"

最新更新