1

我的应用程序使用此代码永久保存 ArrayList,以便在重新启动应用程序时调用它。

    private static void storeDevices() {
    // Object serialization
    try {
        FileOutputStream fos = new FileOutputStream("devices.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(devices);
        oos.flush();
        oos.close();
    }
    catch(Exception e) {
        showAlert("Store Devices", "Exception storing devices to file: " + e);
    } 
}

当我从 Netbeans 运行时,一切正常。我已将应用程序包装在安装程序中(使用 Launch4J 和 Inno Setup Compiler),当我将应用程序安装到 C:/Program Files/MyApp(在 Windows 7 上)时,上面的代码给出了以下异常:

将设备存储到文件的异常:java.io.FileNotFoundException:devices.ser(访问被拒绝)

但是,当我安装到 C:/MyApp 时,一切正常。

这与从 C:/Program Files 目录继承的读/写权限有关吗?我知道我可以通过在 C:/temp 目录或类似的地方创建文件来解决这个问题,但我不想诉诸于此。那么有什么方法可以在我的 C:/Program Files/MyApp 目录中写入/读取文件吗?

4

2 回答 2

0

从 windows vista 开始,没有明确的身份验证,任何应用程序都无法访问系统文件夹区域。(程序文件/window32/ 等文件夹......)对于已安装的应用程序,身份验证由 windows-installer 完成。

为了能够访问(读/写),您需要以管理员身份运行,或者您需要更改这些文件夹的权限(不推荐)

于 2013-03-28T11:43:03.240 回答
0

我的解决方案是使用环境变量来获取正确的目录来存储应用程序数据。这是我创建的方法:

private String getAppDataDirectory(String subDirectory, boolean create) {

    String appDataDirectory;
    try {
        appDataDirectory = System.getenv("APPDATA"); //Windows
        //todo - could try "ALLUSERSPROFILE"
        if (appDataDirectory != null) {
            appDataDirectory += File.separator + subDirectory + File.separator;
        }
        else { //appDataDirectory is null
            appDataDirectory = System.getenv("HOME"); //Unix
            if (appDataDirectory != null) {
                appDataDirectory +=  File.separator + subDirectory + File.separator;
            }
            else { //appDataDirectory is still null
                throw new Exception("Could not access APPDATA or HOME environment variables");
            }
        }
    }
    catch(Exception e) {
        e.printStackTrace();
        appDataDirectory = "";
    }

    if (create && appDataDirectory != null && appDataDirectory.length() > 0) {
        try {
            File dir = new File(appDataDirectory);
            dir.mkdir();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    //log("appDataDirectory: " + appDataDirectory);
    return appDataDirectory;
}
于 2013-04-08T12:06:26.377 回答