无法写入文本文件

时间:2011-07-22 17:11:52

标签: java android

我正在做的是这个: 我有一个类“欢迎”,它调用另一个类“textWriter”,其中包含一个方法“写”。欢迎将两个字符串传递给“write”,“name”是要写入的文本文件的名称,“something”是要打印的东西。

我在prt = new PrintStream(output);

上一直收到空指针错误

这里是logcat

07-22 16:40:22.561: ERROR/AndroidRuntime(2245): FATAL EXCEPTION: main
07-22 16:40:22.561: ERROR/AndroidRuntime(2245): java.lang.NullPointerException
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at com.rhobot.budget.textWriter.write(textWriter.java:24)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at com.rhobot.budget.Welcome.setSubChoices(Welcome.java:37)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at com.rhobot.budget.Welcome$1.onClick(Welcome.java:76)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at android.view.View.performClick(View.java:2408)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at android.view.View$PerformClick.run(View.java:8816)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at android.os.Handler.handleCallback(Handler.java:587)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at android.os.Looper.loop(Looper.java:123)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at android.app.ActivityThread.main(ActivityThread.java:4627)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at java.lang.reflect.Method.invokeNative(Native Method)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at java.lang.reflect.Method.invoke(Method.java:521)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-22 16:40:22.561: ERROR/AndroidRuntime(2245):     at dalvik.system.NativeStart.main(Native Method)

这是欢迎课程:

public class Welcome extends Activity
{
P p = new P(); //shared prefs helper
loadArray la = new loadArray(); //array loader
textWriter tw = new textWriter();
private EditText txtBalance;
private Button btnEnter;
int subItemCount, addItemCount;
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.welcomescreen);
    capture();
}
public static String sub_choice_key = "sub_choice_key.txt";
public static String sub_compare = "sub_compare.txt";
public static String add_choice_key = "add_choice_key.txt";
public static String add_compare = "add_compare.txt";

public void setSubChoices() throws FileNotFoundException {
    // TODO create a master list of choices
    tw.write(sub_choice_key,"-1");
    tw.write(sub_choice_key,"-2");
    tw.write(sub_choice_key,"-3");
    tw.write(sub_compare,"-1");
    tw.write(sub_compare,"-2");
    tw.write(sub_compare,"-3");
    p.pisI("subItemCount", 3, this);
}...

这是textWriter类

public class textWriter extends Activity{

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
}
public void write(String name, String something) {

    try {
        FileOutputStream output;
        output = openFileOutput(name,MODE_APPEND);
        PrintStream prt;
        prt = new PrintStream(output);
        prt.println(something);
        prt.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我想强调这些是两个不同的文件,我正在导入所有正确的东西,我相信..我也有这条线 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 在我的Android清单中。

我在做错了什么?是上下文吗?还是缺少?如果是这样我应该如何实施呢?

我这样做是因为我想在其他程序中使用这个textWrite作为一种简单(不太杂乱)的数据写入方式。在我的主要部分,如果我这样做,它可以为我节省大约50行代码 提前致谢- Tricknology

2 个答案:

答案 0 :(得分:1)

不是创建新的Activity,而是将write方法放在您调用它的原始活动中。

当textWriter调用openOutputStream()但尚未创建时,会出现问题。所以是的,我会说这是Context的问题,因为尚未创建调用openOutputStream()的上下文。

答案 1 :(得分:1)

正如mightkevin所说,问题是缺乏有效的背景。

如果您希望类结构保持不变,可以执行的一个简单修复是从extends Activity中删除textWriter,而是在构造函数中传入Context,即:

public class textWriter{
    private Context m_context;

    public textWriter(Context ctx) {
        m_context = ctx;
    }    
    public void write(String name, String something) {

        try {
            FileOutputStream output;
            output = m_context.openFileOutput(name,MODE_APPEND);
            PrintStream prt;
            prt = new PrintStream(output);
            prt.println(something);
            prt.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

然后你需要像这样构建它:textWriter tw = new textWriter(this);

相关问题