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