0

内部ストレージへのアプリケーションを使用して、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();
    }*/

パスは使用されず、ファイル名はファイルの書き込みと読み取りに直接指定されます。StringTokenizerを試したAndroidの内部メモリからファイルを読み取る際に直面する問題を確認しました。

誰かが私がどこで間違っているのかを知るのを手伝ってくれますか?次の権限が設定されています。

    <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を使用する場合、どこに表示されますか?コンソールウィンドウに表示されませんか?私を助けてください、私はアンドロイド開発の初心者です。もう1つ明確にすること:私のモットーは、ユーザーがユーザー名とパスワードを直接読み取れないように保存することです。私はすでにMODE_PRIMITIVEを使用しました。このデータを保存するためにJSONObjectを使用する必要がありますか。いくつかのサイトとAPIでJSONを調べましたが、JSONを使用する理由と場所がわかりませんでした。MODE_PRIMITIVEを使用すると、ユーザーでさえファイルを読み取ることができないと思います。私のアプリケーションだけがそれを読むことができます。それなら、JSONを使うべきではないと思います。私が間違っている場合は訂正してください。

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

1

提案:

ユーザー名とパスワードのみを保存する場合は 、データをファイルに保存する代わりにSharedPreferencesを使用してください。これは非常に安全な方法であり、さらに面倒なこともありません。

共有設定の使用方法に関するこのブログ記事を使用してください。

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

于 2011-04-04T09:47:45.787 に答える
0
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()、これを試して、さらに進むことができるかどうかを確認してください。

于 2011-04-04T09:08:38.440 に答える