0

我正在使用我的应用程序将用户名和密码读写到 android 设备到内部存储。我成功写入设备,但在阅读时出现错误。在应用程序开始时,我读取了该文件并得到“应用程序(...)已意外停止。请再试一次。” 使用“强制关闭”按钮并关闭应用程序。我尝试了不同的阅读方式,但都显示了相同的结果。我将我的数据写为用户名+“\n”+密码+“\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>

另外我如何调试应用程序。如何查看 Log 中写入的数据。如果我使用 SOP,它会在哪里显示 - 它不会显示在控制台窗口中?请帮助我,我是android开发的新手。还有一件事要澄清:我的座右铭是以用户不能直接读取它们的方式存储用户名和密码。我已经使用过 MODE_PRIMITIVE。他们是否需要使用 JSONObject 来保存这些数据。我在几个站点和 API 中查看了 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 回答