2015-10-01 2 views
0

Я написал небольшое приложение 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, но я не знаю, как бы исправить эту проблему.

+1

Что? Почему бы вам просто не взять этот текстовый файл из банки? Или вы и распакуйте банку и используйте текстовый файл, используя http://stackoverflow.com/questions/1529611/how-to-write-a-java-program-which-can-extract-a-jar-file-and- store-its-data-in-s –

+0

txt в банке является неотъемлемой частью банки. Если я выберу это, тогда я должен носить его везде, где я кладу банку. Я предпочел бы упаковать все в банку и только иметь дело с одним файлом. – jaytj95

+1

. Рассмотрите возможность переупаковки jar как файла aar, чтобы вы знали, где будет текстовый файл: http://stackoverflow.com/questions/24309950/create- aar-file-in-android-studio –

ответ

1

Вы, вероятно, следует использовать

getResourceAsStream("/chains.txt") 

вместо использования

getSystemResourceAsStream(...). 

/в передней части пути означает смотреть в корень банку. В противном случае он будет искать chain.txt в том же пакете, что и класс, из которого вы получили загрузчик классов. EG, если вы:.

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

указанный файл должен быть помещен в «/com/potter/harry/chains.txt» в файле почтового индекса.

+0

Отлично! Также +1 для объяснения! – jaytj95