2014-10-09 118 views
0

我在Java应用程序中读取文件时遇到问题。请帮助我,因为我试图做四天,而我的CS老师不在Android应用中。另外任何教程阅读不帮助我。通过getAssets缺少文件

我有以下应用:

 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应用程序中访问文件名?我正在尝试InputStream,获取Assets等,但它不起作用或者我做的不正确。目前它抛出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 
+0

你可以请你从logcat发布你的完整例外。 – Subbu 2014-10-09 13:36:36

+0

完成:)希望它有帮助。 – user3795517 2014-10-09 13:39:31

+0

线111是什么? – ToYonos 2014-10-09 13:50:22

回答

0

错误说你在com.bachosz.billionaires.MainActivityBillionaires得到一个NPE(空指针异常)。您需要查看用于调用该活动的代码部分。 (它不在上面的代码中 - 否则我们不知道给出的信息是哪一行)

另一件事你必须确定是你有适当的上下文。

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

感谢您的回复。但是,我不调用MainActivity,它只是启动应用程序。我更新了代码,向您展示完整的MainActivity。即使在添加appContext之后,我仍然遇到错误。 – user3795517 2014-10-13 09:41:26

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. 
} 
+0

感谢您的回答。我已经使用它,但是当访问数据时仍然为空。我更新了代码。如果你查阅它,我会很感激。 – user3795517 2014-10-13 10:46:31

+0

可能原因是我从pendrive运行它? – user3795517 2014-10-13 10:54:14

+0

不客气。什么是**确切的**声明,你得到NullPointerException?你是什​​么意思,你从pendrive跑??? :) – Alberto 2014-10-13 12:05:30

0

试试这个YOURFILE复制到文件夹中的资产。

然后,AssetManager assetManage = getAssets();

然后,

InputStream myInput = null; 
    try { 
     myInput = assetManager.open("YOURFILE"); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

最后BufferedReader reader = new BufferedReader(new InputStreamReader(myInput));

按照上面的代码一步一步。