2016-04-09 3 views
-1

///////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////Не удается прочитать текстовый файл из активов (Android Studio, JAVA)

Итак, ответ - это то, что сказал Генри. Невозможно получить доступ к активам из класса, который не является активным. После передачи объекта AssetManager в качестве параметра из основного действия он работает, метод класса неактивности может считывать актив. В моем случае:

AssetManager am = getAssets(); 
tc.ReadFile2(am); 

////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////////

У меня проблема с чтением .txt из каталога ресурсов. Я попробовал почти все, но результат всегда один и тот же:

I/System.out: java.lang.NullPointerException 

Это, как выглядит дерево каталогов проекта: directory tree

Я также попытался перечислить активы, но результат такой же, как указано выше. Вот текущий код моего класса:

import java.io.*; 
import java.lang.*; 

import android.content.res.AssetManager; 
import android.support.v7.app.AppCompatActivity; 

public class TextChange extends AppCompatActivity { 
public TextChange(){} 

protected String ReadFile() throws IOException{ 
    BufferedReader reader = null; 
    reader = new BufferedReader(new InputStreamReader(context.getAssets().open("sampleText.txt"))); 
    String text = ""; 
    while (reader.readLine() != null){ 
     text = reader.readLine(); 
    } 
    System.out.println(text); 
    return text; 
} 

protected String ReadFile2() throws IOException{ 
    StringBuilder buf = new StringBuilder(); 
    InputStream input = getAssets().open("sampleText2.txt"); 
    BufferedReader in = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
    String str; 

    while ((str=in.readLine()) != null) { 
     buf.append(str); 
    } 

    in.close(); 

    return buf.toString(); 
} 

public String[] ListAssets() throws IOException{ 
    AssetManager am = getAssets(); 
    String[] files = am.list(""); 
    for (String s : files) { 
     System.out.println(s); 
    } 
    return files; 
} 
} 

Может кто-нибудь сказать мне, что это не так, и как решить эту проблему? Любая помощь приветствуется!

printStackTrace:

W/System.err: java.lang.NullPointerException 
W/System.err:  at android.content.ContextWrapper.getAssets(ContextWrapper.java:83) 
W/System.err:  at jb.jbench.TextChange.ReadFile2(TextChange.java:28) 
W/System.err:  at jb.jbench.MainActivity$3.onClick(MainActivity.java:43) 
W/System.err:  at android.view.View.performClick(View.java:4438) 
W/System.err:  at android.view.View$PerformClick.run(View.java:18422) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:733) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:136) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5001) 
W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
W/System.err:  at java.lang.reflect.Method.invoke(Method.java:515) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
W/System.err:  at dalvik.system.NativeStart.main(Native Method) 
+1

На какой строке есть NullPointerException? Можете ли вы разместить полный StackTrace? –

+0

Полное сообщение об исключении даст вам конкретный номер строки, который бросает исключение Null Pointer. Если вы сообщите нам, какая строка в вашем коде указывается этим сообщением об ошибке, мы, вероятно, сможем вам помочь. –

+2

Этот класс также является недопустимой реализацией действия, так как у вас нет метода 'onCreate()', у вас нет поля 'context', на которое ссылается источник, и т. Д. – CommonsWare

ответ

0

Вы не можете создать экземпляр Activity класс самостоятельно. Всегда позволяйте системе делать это. Действия можно запустить только с помощью Intent, иначе важные поля не будут правильно инициализированы.

Если вы хотите поместить функциональность в отдельный класс, не расширяйте Activity и передавайте в нужный контекст в качестве параметра.

+0

Однако я не начинаю никаких новых действий. Все, что я делаю в основной деятельности, это вызов метода для чтения активов. – definitelyNotLazy

+0

И этот метод вызывает 'getAssets', который не работает, потому что' Activity' не инициализируется. – Henry

+0

Итак, если класс не является активным, просто функциональный класс делает некоторую работу, он не может получить доступ к активам? – definitelyNotLazy