Проблема с чтением сохраненного файла: Android - PullRequest
0 голосов
/ 04 апреля 2011

Я читаю и записываю имя пользователя и пароль на устройство Android с помощью приложения во внутреннюю память.Я успешно записываю на устройство, но при чтении получаю ошибку.При запуске приложения я читаю этот файл и получаю «Приложение (...) неожиданно остановилось. Пожалуйста, повторите попытку.» с кнопкой «Принудительно закрыть», и приложение закрывается.Я пробовал разные способы чтения, но все показали одинаковые результаты.Я записываю свои данные как имя пользователя + "\ n" + passwrd + "\ n".Это код для чтения данных:

    private static String ReadFromFile(String fileName) {
    String text = "";
    FileInputStream fis = null;
    byte[] fileData;
    try {
        StringBuffer sb = new StringBuffer();
        int c = 0;
        fis = AppContext.openFileInput(fileName);
        if (fis.available() != 0) {
            fileData = new byte[fis.available()];
            c = fis.read(fileData);
            Log.i(TAG, "Read Byes = " + c );
            java.util.StringTokenizer stk = new java.util.StringTokenizer(new String(fileData), "\n");
            text = stk.toString();
        } else 
            throw new IOException("fis.available() <= 0");          /*
        c = (char)fis.read();
        while (c != -1){
            if (c != -1)
                sb.append(c);
            c = (char)fis.read();
        }
        text = sb.toString();
        */
        fis.close();            
    } catch (FileNotFoundException e) {
        text = "null " +  e.getMessage();
    } catch (IOException e) {
        text = "null " + e.getMessage();
    } finally {
        fis = null;
    }   
    return text;
}

    /*
    try {
        StringBuffer sb = new StringBuffer();
        RandomAccessFile raf = new RandomAccessFile(ENC_LOGIN_FILE, "r");
        while ((str1 = raf.readLine()) != null){
            sb.append(str1);
        }
        str1 = sb.toString();
    } catch (FileNotFoundException e) {
        errorMessage = "File Not Found: " + e.getMessage();
        //e.printStackTrace();
    } catch (IOException ioe) {
        errorMessage = "IOExcp: " + ioe.getMessage();
        //e.printStackTrace();
    }*/

Путь не используется и имя файла дается непосредственно для записи и чтения файла.Я проверил Проблема, возникающая при чтении файла из внутренней памяти Android , откуда я попробовал StringTokenizer.

Может кто-нибудь помочь мне узнать, где я иду не так.Установлено следующее разрешение:

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"></uses-permission>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"></uses-permission>    
<uses-permission android:name="android.permission.READ_SYNC_STATS"></uses-permission>
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

Также, как мне отладить приложение.Как проверить данные, написанные в журнале.Если я использую SOP, где он отображается - он не отображается в окне консоли?Пожалуйста, помогите мне, я новичок в разработке Android.Еще одна вещь, которую необходимо уточнить: мой девиз - хранить имя пользователя и пароль таким образом, чтобы пользователь не мог прочитать их напрямую.Я уже использовал MODE_PRIMITIVE.Есть ли необходимость использовать JSONObject для сохранения этих данных.Я посмотрел на JSON на нескольких сайтах и ​​API, но не мог понять, почему и где его следует использовать.Использование MODE_PRIMITIVE Я считаю, что даже пользователь не может прочитать файл.Только мое приложение может прочитать его.Тогда я не думаю, что я должен использовать JSON.Пожалуйста, поправьте меня, если я ошибаюсь.

Любая помощь высоко ценится.

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Предложение:

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

Используйте эту статью блога о том, как использовать общие настройки:

http://saigeethamn.blogspot.com/2009/10/shared-preferences-android-developer.html

0 голосов
/ 04 апреля 2011
fis = AppContext.openFileInput(fileName);
fileData = new byte[fis.available()];
java.util.StringTokenizer stk =
    new java.util.StringTokenizer(new String(fileData), "\n");

Мне кажется, что вы пытаетесь создать новый String, используя в качестве входных данных неинициализированный массив. Вы просили, чтобы массив был определенного размера, но вы ничего не сделали для чтения данных в массив. (Обратите внимание, что available() запрашивает только размер данных, которые могут быть прочитаны без блокировки; он фактически не читает данные. Для этого вам нужен метод read().)

Попробуйте это:

fis = AppContext.openFileInput(fileName);
fileData = new byte[fis.available()];
fis.read(fileData);
java.util.StringTokenizer stk =
    new java.util.StringTokenizer(new String(fileData), "\n");

Вам следует проверить возвращаемое значение fis.read(), но попытайтесь проверить, позволяет ли оно вам двигаться дальше.

...