安装到C:/ Program Files时,Java应用程序无法写入/读取序列化文件 - java.io.FileNotFoundException :(拒绝访问)

时间:2013-03-28 11:39:31

标签: java serialization installer filenotfoundexception access-denied

我的应用程序使用此代码持久保存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目录中编写/读取文件吗?

2 个答案:

答案 0 :(得分:0)

从windows vista开始,没有应用程序可以访问系统文件夹区域而无需显式身份验证。 (像program-file / window32 / etc这样的文件夹....) 对于已安装的应用程序,身份验证由Windows安装程序完成。

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

答案 1 :(得分: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;
}