Java read/write 访问异常FileNotFoundException(访问被拒绝)
Java read/write access exception FileNotFoundException (Access is denied)
这里我有2个方法。
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();
正在打印我不会写但它确实有效。我的意思是文件出现,数据写入成功
您的 windows/linux 文件 read/right 访问指定 file/folder 位置似乎有问题。在您 运行 此应用程序之前,您需要确保您有足够的权利这样做。请记住,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();
}
此外,我刚刚注意到您是从 Runtime
呼叫 .exec()
。您还可以使用 checkExec()
方法检查 - 似乎 "Invisible" 标志正在影响此操作。
希望对您有所帮助。
你的问题是隐藏的标志。我不知道为什么,但是一旦文件有隐藏标志 Java 就不能再写入它了。
我测试了它,你可以删除文件(在写一个新文件之前),或者如果你想在事务上更安全一点,你可以写入一个不同的文件并在之后用 REPLACE_EXISTING 重命名它你关闭了它。两者都在隐藏文件之上工作。
顺便说一句:我认为使用Java序列化来存储如此简单的信息不是一个好主意。你最好使用文本格式。
这里我有2个方法。
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();
正在打印我不会写但它确实有效。我的意思是文件出现,数据写入成功
您的 windows/linux 文件 read/right 访问指定 file/folder 位置似乎有问题。在您 运行 此应用程序之前,您需要确保您有足够的权利这样做。请记住,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();
}
此外,我刚刚注意到您是从 Runtime
呼叫 .exec()
。您还可以使用 checkExec()
方法检查 - 似乎 "Invisible" 标志正在影响此操作。
希望对您有所帮助。
你的问题是隐藏的标志。我不知道为什么,但是一旦文件有隐藏标志 Java 就不能再写入它了。
我测试了它,你可以删除文件(在写一个新文件之前),或者如果你想在事务上更安全一点,你可以写入一个不同的文件并在之后用 REPLACE_EXISTING 重命名它你关闭了它。两者都在隐藏文件之上工作。
顺便说一句:我认为使用Java序列化来存储如此简单的信息不是一个好主意。你最好使用文本格式。