写入内部存储器时java.io.FileNotFoundException

时间:2015-03-28 15:17:06

标签: java android

我已经编写了一些用于制作/编辑文件的功能,但它们运行良好。但是,我需要在许多活动中使用这些功能,所以我找到了关于如何全局化功能的指南,并以某种方式做到了。但是在我将我的函数放在单独的类中之后,它们就停止了工作。我的logcat无法正常工作,所以我无法尝试,但即使我可以,我也不认为它会对我有所帮助。

以下是MainActivity.java的一部分:

MyHelper myHelp = new MyHelper(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myHelp.synchronizedb("filename");
}

以下是MyHelper.java的一部分:

public class MyHelper extends ActionBarActivity {
Context mContext;

public MyHelper(Context context){
    this.mContext = context;
}
public void writeFile(String fname, String fcontent) {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(openFileOutput(fname, MODE_APPEND)));
        bw.write(fcontent);
        bw.close();
}



public void synchronizedb(String filename) {
    writeFile(filename, "blabla");
}
}

1 个答案:

答案 0 :(得分:0)

您正在不正确地创建一个未被使用的类,如Activity子类扩展ActionBarActivity。为Activity的任何子类调用new是行不通的,因为只有系统创建的Activity才能完全正常运行,并且只有之后才能使用onCreate()方法由系统调用。

为了能够使用从Activity(和类似的)继承的方法(如openFileOutput()),你可能会使你的助手类成为一种假活动。但那是行不通的。

更可行的解决方案是放弃"扩展ActionBarActivity"从您的类名,并使用传入的上下文引用:

mContext.openFileOutput(...)

或者,或许甚至更好,在构造函数中发现了内部存储位置并保存以供以后使用:

public class MyHelper {
  Context mContext;
  File mDir;

    public MyHelper(Context context){
        this.mContext = context;
        this.mDir = context.getFilesDir();
    }
    public void writeFile(String fname, String fcontent) {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
               new FileOutputStream(new File(mDir, fname), MODE_APPEND)));
            bw.write(fcontent);
            bw.close();
    }

此外,由于关于Activity类在调用onCreate()之后才能完全正常运行的规则,您必须将助手类的创建移动到利用Activity onCreate之后或之后( )

MyHelper myHelp; //can't initialize as our context is not yet valid
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myHelp = new MyHelper(this); //now we have a working context to pass
    myHelp.synchronizedb("filename");
}