Я написал небольшое приложение Java, которое я скомпилировал в исполняемый файл jar. Программа использует файл .txt, который скомпилирован в файле jar. Чтобы получить доступ к файлу .txt в банке, вам необходимо использовать ClassLoader.getSystemResourceAsSteam ("");Java Jar не работает в Android
Вот метод в файле фляги:
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;
}
Этот код работает, если я бегу баночку из CMD-линии в качестве отдельной программы Java, или из Eclipse. Он даже работает, если я экспортирую как банку, а затем выкидываю ее в другую программу Java и использую ее, она работает так, как ожидалось. Проблема в том, что я бросаю банку в проект 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 имеет значение null, но я не знаю, как бы исправить эту проблему.
Что? Почему бы вам просто не взять этот текстовый файл из банки? Или вы и распакуйте банку и используйте текстовый файл, используя http://stackoverflow.com/questions/1529611/how-to-write-a-java-program-which-can-extract-a-jar-file-and- store-its-data-in-s –
txt в банке является неотъемлемой частью банки. Если я выберу это, тогда я должен носить его везде, где я кладу банку. Я предпочел бы упаковать все в банку и только иметь дело с одним файлом. – jaytj95
. Рассмотрите возможность переупаковки jar как файла aar, чтобы вы знали, где будет текстовый файл: http://stackoverflow.com/questions/24309950/create- aar-file-in-android-studio –