阅读保存文件的问题:Android

时间:2011-04-04 08:53:12

标签: android storage internal

我读了&写用户名&使用我的应用程序到内部存储的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();
    }*/

没有使用路径,文件名直接写入&amp;读取文件。我从我尝试使用StringTokenizer的地方查看了Problem facing in reading file from Internal memory of 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来保存这些数据。我在几个网站上看过JSON&amp; API,但无法弄清楚为什么以及应该在哪里使用它。使用MODE_PRIMITIVE我相信即使用户也无法读取文件。只有我的应用程序可以读取它。然后我认为我不应该使用JSON。如果我错了,请纠正我。

非常感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

建议:

如果您只保存用户名和密码,请使用SharedPreferences而不是将数据保存在文件中。这是一种非常安全的方式,而且非常麻烦。

使用此博客文章如何使用共享首选项:

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

答案 1 :(得分: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()的返回值,但请尝试查看它是否可以让您进一步发展。