【问题标题】:Problem Reading Saved File : Android读取保存文件时出现问题:Android
【发布时间】:2011-04-04 08:53:12
【问题描述】:

我正在使用我的应用程序将用户名和密码读写到 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 的地方签出了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 来保存这些数据。我在几个站点和 API 中查看了 JSON,但无法弄清楚应该使用它的原因和位置。使用 MODE_PRIMITIVE 我相信即使用户也无法读取文件。只有我的应用程序可以读取它。那么我认为我不应该使用 JSON。如果我错了,请纠正我。

非常感谢任何帮助。

谢谢。

【问题讨论】:

    标签: android storage internal


    【解决方案1】:

    一个建议:

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

    使用这篇关于如何使用共享首选项的博客文章:

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

    【讨论】:

    • 感谢您提供此信息。但是通过使用 SharedPreferences,我的数据或至少应用程序名称(如果我使用 MODE_PRIMITIVE)将在整个设备中看到?就像在演示中一样,在我看到企业的地方,我也会看到我的应用程序名称吗?或者没有人也能看到这个名字。
    • 我试图从“DEv Tools”打开“Google LoginSERvice”,我得到了与我的应用程序相同的异常。从模拟器读取文件有什么问题吗? Google Login alos 可能使用与我从文件中读取数据相同的逻辑。我使用 SDK 2.3.3 API 10 模拟器。有什么想法吗?
    • 只有您的应用名称会像其他应用一样可见。另外,您可以使用 MODE_PRIVATE,而不是使用 MODE_PRIMITIVE。 sharedPreferences = getPreferences(MODE_PRIVATE);
    • 好的。如果我想稍后在我的应用程序中添加更多键/对值,我可以这样做吗?像以后将不得不添加 4-5 更多的值。我想我将能够在应用程序的任何其他部分添加更多数据?是/否?
    • 是的,您可以随时添加更多键值对,但使用唯一键。
    【解决方案2】:
    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()的返回值,但试试看它是否能让你更进一步。

    【讨论】:

    • 谢谢。这么愚蠢的错误。但这也失败了。我改变了,在 if(fis.availalbe() != 0) 里面,我添加了 c = fis.read(fileData);使用 fileData 和 text = stk.toString() 初始化 stringTokenizer。在 is(fis.available...) 的 else 部分,我抛出了一个异常。应捕获异常或消息应包含某些内容或为空,但在应用程序启动时出现相同的错误消息“应用程序已意外停止”和“强制关闭”按钮。我现在如何检查日志“Log.i”或 SOP tok 哪里出了什么问题?
    • @user455979,我建议编辑帖子以包含我的建议,也许其他人会知道其余的。祝你好运。 :)
    猜你喜欢
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2011-02-11
    • 2016-07-02
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多