通过getAssets丢失文件

时间:2014-10-09 13:33:05

标签: java android

我在Java Application中读取文件时遇到了问题。请帮助我,因为我尝试了四天,而我的CS老师没有进入Android应用程序。此外,任何阅读的教程都没有帮助我。

我有以下应用:

        package com.bachosz.billionaires;

import android.support.v7.app.ActionBarActivity;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.StringTokenizer;
import android.content.ContextWrapper;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


    public class MainActivityBillionaires extends ActionBarActivity {

        private int currentQuestion;
        private String [] answers;
        private Button answerButton;
        private Button questionButton;
        private TextView questionView;
        private TextView answerView;
        private EditText answerText; 
        private Question [] questions;
        private Button buttonA;
        private Button buttonB;
        private Button buttonC;
        private Button buttonD;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity_billionaires);

        try {
            init();
        } catch (IOException e) {

            e.printStackTrace();
        }
        }

        public void init() throws IOException
        {
            questions = new Question[2];
            currentQuestion = 0;
            InputStream inputStream = getResources().openRawResource(R.raw.questionstable);
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line = null;
              String content,a,b,c,d,correct;
                int id, x = 0;
                StringTokenizer st = null;
            while ((line=reader.readLine()) != null)
            {
                 st= new StringTokenizer(line, ",");
                    id = Integer.parseInt(st.nextToken());
                    content = st.nextToken();
                    a = st.nextToken();
                    b = st.nextToken();
                    c = st.nextToken();
                    d = st.nextToken();
                    correct = st.nextToken();

                    questions[x] = new Question(id, content, a, b, c, d, correct);
                    x++;
            }
            reader.close();


        answerButton = (Button)findViewById(R.id.AnswerButton);
        questionButton = (Button)findViewById(R.id.QuestionButton);
        questionView = (TextView)findViewById(R.id.QuestionTextView);
        answerView = (TextView) findViewById(R.id.AnswerTextView);
        answerText = (EditText) findViewById(R.id.AnswerText);
        buttonA = (Button)findViewById(R.id.buttonA);
        buttonB = (Button)findViewById(R.id.buttonB);
        buttonC = (Button)findViewById(R.id.buttonC);
        buttonD = (Button)findViewById(R.id.buttonD);



        answerButton.setOnClickListener(new OnClickListener()
        {
       public void onClick(View v) {
       checkAnswer();
       }});



        questionButton.setOnClickListener(new OnClickListener(){
       @Override
       public void onClick(View v) {
       showQuestion();
       }});
        }

        public void showQuestion()
        {

      // if(currentQuestion == questions.length)
       // currentQuestion =0;       

        questionView.setText(questions[0].toString());
        answerView.setText("");
        answerText.setText("");
        currentQuestion++;

        }

        public boolean isCorrect(String answer)
        {
        return (answer.equalsIgnoreCase(questions[currentQuestion].getCorrect()));
        }

        public void checkRight()
        {
        //  String right
        }
        public void checkAnswer()
        {
        String answer = questions[currentQuestion].getCorrect();
        if(isCorrect(answer))
        answerView.setText("You're right!");
        else
        answerView.setText("Sorry, the correct answer is "+answers[currentQuestion]);

        }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_activity_billionaires, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

它取自我之前编写的Java应用程序(这就是为什么这么多评论)。我如何在Android App中访问fileName?我正在尝试InputStream,获取资产等,但它不起作用或我做得不正确。目前它正在抛出NullPointerException。

LOG CAT:

10-09 13:38:37.663: E/Trace(921): error opening trace file: No such file or directory (2)
10-09 13:38:39.354: D/AndroidRuntime(921): Shutting down VM
10-09 13:38:39.354: W/dalvikvm(921): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
10-09 13:38:39.384: E/AndroidRuntime(921): FATAL EXCEPTION: main
10-09 13:38:39.384: E/AndroidRuntime(921): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bachosz.billionaires/com.bachosz.billionaires.MainActivityBillionaires}: java.lang.NullPointerException
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.os.Looper.loop(Looper.java:137)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.app.ActivityThread.main(ActivityThread.java:4745)
10-09 13:38:39.384: E/AndroidRuntime(921):  at java.lang.reflect.Method.invokeNative(Native Method)
10-09 13:38:39.384: E/AndroidRuntime(921):  at java.lang.reflect.Method.invoke(Method.java:511)
10-09 13:38:39.384: E/AndroidRuntime(921):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-09 13:38:39.384: E/AndroidRuntime(921):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-09 13:38:39.384: E/AndroidRuntime(921):  at dalvik.system.NativeStart.main(Native Method)
10-09 13:38:39.384: E/AndroidRuntime(921): Caused by: java.lang.NullPointerException
10-09 13:38:39.384: E/AndroidRuntime(921):  at com.bachosz.billionaires.MainActivityBillionaires.readFile(MainActivityBillionaires.java:111)
10-09 13:38:39.384: E/AndroidRuntime(921):  at com.bachosz.billionaires.MainActivityBillionaires.init(MainActivityBillionaires.java:140)
10-09 13:38:39.384: E/AndroidRuntime(921):  at com.bachosz.billionaires.MainActivityBillionaires.onCreate(MainActivityBillionaires.java:70)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.app.Activity.performCreate(Activity.java:5008)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
10-09 13:38:39.384: E/AndroidRuntime(921):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
10-09 13:38:39.384: E/AndroidRuntime(921):  ... 11 more

2 个答案:

答案 0 :(得分:0)

错误表示您在com.bachosz.billionaires.MainActivityBillionaires获得了NPE(空指针异常)。您需要查看用于调用该活动的代码部分。 (它不在上面的代码中 - 否则我们不知道哪条线与给定的信息一起)

您必须确保的另一件事是您拥有适当的背景。

AssetManager assetManage = appContext.getAssets();
String[] filelist = assetManage.list("");

答案 1 :(得分:0)

首先你应该清理你的代码,至少在这里显示我们不知道你在做什么。
它更容易理解。

你为什么要使用资产?在Android中,访问资源的最常用方法是... / res / raw文件夹 它在自动生成的R.class中引用该文件,因此您可以在任何地方访问它 确保您的文件名是小写的,没有空格。如果您没有res下的原始文件夹,请手动创建。

试试这个:

InputStream inputStream = getResources().openRawResource(R.raw.YOURFILE);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = reader.readLine();
while (line != null)
{
    // Read file.
}