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 上找不到答案。

顺便说一句 - 异常总是从 writeDataFileOutputStream.

抛出

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序列化来存储如此简单的信息不是一个好主意。你最好使用文本格式。