这里我有两种方法。
private boolean readData(){
if (!new File(config).exists()) {
return false;
} else {
Hashtable<String, String> data;
FileInputStream fis;
try {
fis = new FileInputStream(config);
ObjectInputStream oin = new ObjectInputStream(fis);
data = (Hashtable<String, String>) oin.readObject();
username = data.get("username");
password = data.get("password");
folder = data.get("folder");
fis.close();
oin.close();
return true;
} catch (FileNotFoundException fnfe) {
return false;
} catch (IOException ioe) {
return false;
} catch (ClassNotFoundException cnfe) {
return false;
}
}
}
private boolean writeData() {
try {
FileOutputStream fos = new FileOutputStream(config);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Hashtable<String, String> data = new Hashtable<>();
sout(username);
data.put("username", username);
data.put("password", password);
data.put("folder", folder);
oos.writeObject(data);
oos.flush();
oos.close();
Runtime.getRuntime().exec("attrib +H " + config);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
我无法在Stack Overflow上找到答案。
顺便说一下 - writeData
,FileOutputStream
总是引发异常。
P.S。
我忘了添加。程序首次启动时,会成功记录文件数据。同样,它始终没有问题地从文件中读取数据。当我试图重写这个文件时出现问题。
if(new File(config).canWrite()){
sout("Can write");
} else{
sout("I can't write");
}
writeData();
正在打印我无法写但实际上它可以正常工作。我的意思是文件出现并且数据已成功写入其中。
答案 0 :(得分:2)
您的Windows / linux文件在指定的文件/文件夹位置上的读/右访问权似乎存在问题。在运行此应用程序之前,您需要确保您有足够的权限这样做。请记住,Java只会按照您的要求进行。您的错误消息非常明确地指导您找出问题的原因。
您可以通过执行此操作来检查write
对该文件夹的访问权限。
File f = new File("myfile.txt");
if (f.canWrite)
{
System.out.println("I can write here!!");
}
另一个是使用SecurityManger
并检查是否有针对您的写操作抛出的异常:
// Gets the application security manager
SecurityManager sm = System.getSecurityManager();
// Checks for write exceptions
try
{
sm.checkRead(myFilePath_str);
sm.checkWrite(myFilePath_str);
} catch(SecurityException se)
{ // Who threw it?
se.printStackTrace();
}
此外,我刚刚注意到您从.exec()
致电Runtime
。您还可以使用checkExec()
方法检查 - 似乎“Invisible”标志正在影响此操作。
希望这有帮助。
答案 1 :(得分:2)
你的问题是隐藏的旗帜。我不知道为什么,但是一旦文件中有隐藏的标志,Java就不能再写入它了。
我对它进行了测试,您可以删除该文件(在编写新文件之前),或者如果您希望在事务上更安全,可以写入其他文件并在关闭后使用REPLACE_EXISTING重命名。两者都在隐藏文件之上。
顺便说一句:我不认为使用Java序列化存储这么简单的信息是个好主意。你最好使用文本格式。