2011-07-16 83 views
0

我是一个为android开发的业余程序员。我现在只是尝试了解基础知识,但是我有一个错误,我不知道为什么。android FileInputStream崩溃

我正在创建一个具有保存和加载按钮的活动,它使用fileOutputStreamfileInputStream来完成此任务。

我遇到的问题是,如果我第一次使用该活动时点击加载按钮,我的应用程序崩溃。任何人都可以帮助我如何跳过加载部分,如果该文件尚未创建?我应该在我的if语句中使用什么。

由于一吨,这是我的代码:

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class InternalData extends Activity implements OnClickListener { 

    String FILENAME = "InternalString"; 
    EditText sharedData; 
    TextView dataResults; 
    FileOutputStream fos; 
    String d; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sharedpreferences); 
     Button save = (Button) findViewById(R.id.bSave); 
     Button load = (Button) findViewById(R.id.bLoad); 
     sharedData = (EditText) findViewById(R.id.etSharedPrefs); 
     dataResults = (TextView) findViewById(R.id.tvLoadSharedPrefs); 
     save.setOnClickListener(this); 
     load.setOnClickListener(this); 
     try { 
      fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()) { 
     case R.id.bSave: 
      d = sharedData.getText().toString(); 

      try { 

       fos.write(d.getBytes()); 
       fos.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      break; 
     case R.id.bLoad: 
      FileInputStream fis = null; 
      try { 
       if (openFileInput(FILENAME) != null){ 
       fis = openFileInput(FILENAME); 
       byte[] data = new byte[fis.available()]; 
       while(fis.read(data) != -1){ 
        String readData = new String(data); 
        dataResults.setText(readData); 
       }} 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }finally{ 
       try { 
        fis.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      break; 
     } 
    } 
} 

感谢您的帮助卢卡斯,我已经更新了我的代码,我在想,如果你可以看看它在确保我使用的AsyncTask正常。再次感谢!

public class InternalData extends Activity implements OnClickListener { 

String FILENAME = "InternalString"; 
EditText sharedData; 
TextView dataResults; 
FileOutputStream fos; 
String d; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sharedpreferences); 
    Button save = (Button) findViewById(R.id.bSave); 
    Button load = (Button) findViewById(R.id.bLoad); 
    sharedData = (EditText) findViewById(R.id.etSharedPrefs); 
    dataResults = (TextView) findViewById(R.id.tvLoadSharedPrefs); 
    save.setOnClickListener(this); 
    load.setOnClickListener(this); 

} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.bSave: 
     d = sharedData.getText().toString(); 

     try { 
      fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
      fos.write(d.getBytes()); 
      fos.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     break; 
    case R.id.bLoad: 

      AsyncTask<String, Integer, String> dat = new loadInternalData().execute(FILENAME); 

     break; 
    } 
} 

public class loadInternalData extends AsyncTask<String, Integer, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     FileInputStream fis = null; 
     String collected = null; 
     try { 
      fis = openFileInput(FILENAME); 
      byte[] data = new byte[fis.available()]; 
      while (fis.read(data) != -1){ 
       collected = new String(data); 

      } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }finally{ 
      try { 
       fis.close(); 
       return collected; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     return collected; 
    } 
    @Override 
    protected void onPostExecute(String result) 
    { 
      super.onPostExecute(result); 
      Log.i("InteralStorage", "onPostExecute(): " + result); 
      dataResults.setText(result); 

    } 
} 

}

回答

2

要调用openFileInput两次。只需调用一次即可。

取而代之的是

if (openFileInput(FILENAME) != null){ 
    fis = openFileInput(FILENAME); 
} 

这样做:

fis = openFileInput(FILENAME); 
if (fis != null) { 
    // Read file 
} 
1

如果执行的UI线程的东西,它不应该需要更长的时间5秒钟或ANR将被触发。

如果你想做的事情可能需要更长的时间,那么这5秒钟,你会想要做一个ServiceAsyncTask。另外,如果你的应用程序被强制关闭并且你不知道为什么,你应该总是看看可以在Eclipse中显示的LogCat输出。此外,您应该将其包含在此处询问的每个问题(关于Android)。

+0

感谢您的帮助,我认为我得到了它的工作,你能否检查更新的代码,看看我是否正确使用它? – travis

+0

尽管它起作用,但如果我在将任何内容保存到文件之前点击加载按钮,它仍会崩溃,所以我仍然有我最初的问题 – travis

+0

好吧,请添加LogCat输出。 –