Java读/写访问异常FileNotFoundException(访问被拒绝)

时间:2015-03-22 11:47:48

标签: java filenotfoundexception

这里我有两种方法。

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();

正在打印我无法写但实际上它可以正常工作。我的意思是文件出现并且数据已成功写入其中。

2 个答案:

答案 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序列化存储这么简单的信息是个好主意。你最好使用文本格式。