FileInputStream в другом классе? - PullRequest
0 голосов
/ 04 марта 2012

Я загружаю файл, который был сохранен другим классом через метод FileOutputstream. В любом случае, я хочу загрузить этот файл в другой класс, но он либо выдает мне синтаксические ошибки, либо вылетает из моего приложения.

Единственные учебники, которые я мог найти, где они сохранили и загрузили файл в том же классе, но я хочу загрузить его в другой класс и не смог найти, как решить проблему загрузки в другой класс.

Спасибо

Мой код:

public class LogIn extends Activity implements OnClickListener {
EditText eTuser;
EditText eTpassword;
CheckBox StaySignedIn;
Button bSubmit;
String user;
String pass;
FileOutputStream fos;
FileInputStream fis = null;
String FILENAME = "userandpass";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);
    eTuser = (EditText) findViewById(R.id.eTuser);
    eTpassword = (EditText) findViewById(R.id.eTpassword);
    StaySignedIn = (CheckBox) findViewById(R.id.Cbstay);
    bSubmit = (Button) findViewById(R.id.bLogIn);
    bSubmit.setOnClickListener(this);
    File file = getBaseContext().getFileStreamPath(FILENAME);
    if (file.exists()) {
        Intent i = new Intent(LogIn.this, ChatService.class);
        startActivity(i);
    }
    // if if file exist close bracket
    try {
        fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
        fos.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } // end of catch bracket
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } // end of catch

} // create ends here

public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {

    case R.id.bLogIn:
        String user = eTuser.getText().toString();
        String pass = eTpassword.getText().toString();
        Bundle userandpass = new Bundle();
        userandpass.putString("user", user);
        userandpass.putString("pass", pass);
        Intent login = new Intent(LogIn.this, logincheck.class);
        login.putExtra("pass", user);
        login.putExtra("user", pass);
        startActivity(login);

        if (StaySignedIn.isChecked())
            ;
        String userstaysignedin = eTuser.getText().toString();
        String passstaysignedin = eTpassword.getText().toString();
        try {
            fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
            fos.write(userstaysignedin.getBytes());
            fos.write(passstaysignedin.getBytes());
            fos.close();
        } catch (IOException e) {
            // end of try bracket, before the Catch IOExceptions e.
            e.printStackTrace();

        } // end of catch bracket

    } // switch and case ends here
}// Click ends here

}// main class ends here

Класс B (Класс, который загружает данные.)

public class ChatService extends Activity {
String collected = null;
FileInputStream fis = null;
String FILENAME;
TextView userandpass;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chatservice);
    userandpass = (TextView) findViewById(R.id.textView1);

    try {
        fis = openFileInput(FILENAME);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    byte[] dataArray = null;
    try {
        dataArray = new byte[fis.available()];
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        while (fis.read(dataArray) != -1)
            ;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    {
        // while statement
    }
    userandpass.setText(collected);

}// create ends here

} // класс заканчивается здесь

LogCat:

03-03 21:03:34.725: E/AndroidRuntime(279): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gta5news.bananaphone/com.gta5news.bananaphone.ChatService}: java.lang.NullPointerException
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.os.Looper.loop(Looper.java:123)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-03 21:03:34.725: E/AndroidRuntime(279):  at java.lang.reflect.Method.invokeNative(Native Method)
03-03 21:03:34.725: E/AndroidRuntime(279):  at java.lang.reflect.Method.invoke(Method.java:521)
03-03 21:03:34.725: E/AndroidRuntime(279):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-03 21:03:34.725: E/AndroidRuntime(279):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-03 21:03:34.725: E/AndroidRuntime(279):  at dalvik.system.NativeStart.main(Native Method)
03-03 21:03:34.725: E/AndroidRuntime(279): Caused by: java.lang.NullPointerException
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.ContextImpl.makeFilename(ContextImpl.java:1599)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.ContextImpl.openFileInput(ContextImpl.java:399)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.content.ContextWrapper.openFileInput(ContextWrapper.java:152)
03-03 21:03:34.725: E/AndroidRuntime(279):  at com.gta5news.bananaphone.ChatService.onCreate(ChatService.java:25)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-03 21:03:34.725: E/AndroidRuntime(279):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
03-03 21:03:34.725: E/AndroidRuntime(279):  ... 11 more

Ответы [ 3 ]

1 голос
/ 04 марта 2012

Трассировка стека расскажет вам все, что вам нужно знать.

Ошибка представляет собой исключение NullPointerException (означающее, что вы передаете пустую ссылку на метод, ожидающий ненулевую ссылку, или что вы вызываете метод с нулевой ссылкой).

Ошибка возникает внутри некоторого кода Android (ContextWrapper.openFileInput()), который вызывается вашим методом ChatService.onCreate(), в строке 25.

Строка 25 - это следующая строка:

fis = openFileInput(FILENAME);

Итак, ошибка ясна: FILENAME равно нулю. Вы не инициализировали его до вызова этого метода.

1 голос
/ 04 марта 2012

Я не уверен насчет потока вашей программы и если ваши два класса работают в одном потоке, но похоже, что у вас проблема с потоком программы.Вы пытаетесь открыть файл и получаете исключение NullPointerException.Убедитесь, что файл создан и у вас есть правильная ссылка на него перед попыткой чтения.

Если они работают в отдельных потоках, вы можете попробовать что-то вроде этого:

try {
    int waitTries=1;
    fis = openFileInput(FILENAME);
    while(fis.available()<EXPECTEDSIZE && waitTries++<10)
        Tread.sleep(50);
} 

ЕслиВы знаете, насколько большим должен быть файл (EXPECTEDSIZE - это некоторая постоянная, которую вы установите), тогда это может быть то, что вы ищете.

1 голос
/ 04 марта 2012

Строка FILENAME в классе ChatService равна нулю. Таким образом, вы получаете NullPointerException при попытке загрузить файл, используя fis = openFileInput(FILENAME).

Кроме того, ваш цикл чтения отбрасывает данные:

    while (fis.read(dataArray) != -1)
        ;

Он должен собрать данные и установить значение вашей collected String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...