2014-10-08 108 views
1

我创建了一个简单的程序,将使用下面的代码写一个目录中的文件的特定目录:将文件写入

String nameProve = nameField.getText(); 

String employee = ("C:\\Users\\ALLEN\\workspace32bit\\RETRIEVE_CHECKER1\\RETRIEVE_CHECKED1" + nameProve + ".txt"); 

PrintWriter outputStream1 = null; 
try 
{ 
    outputStream1 = new PrintWriter(employeeName); 
} 
catch(Exception e) 
{ 
    JOptionPane.showMessageDialog(null, "Can not write to " + employeeName); 
    System.exit(0); 
} 

outputStream1.println("Employee Retrieve Executed"); 
outputStream1.close(); 

我已经导出我的代码到一个.jar文件和我的代码工作得很好,如果我在计算机中执行它,我已经开发了我的程序,但是当我将jar文件复制到其他计算机上时,我还创建了与我的代码中的目录相对应的forlder(手动) t工作,我的catch块将显示消息不能写入“C:\ Users \ ALLEN \ workspace32bit \ RETRIEVE_CHECKER1 \ RETRIEVE_CHECKED1”+ nameProve +“.txt”

有人可以给我一些关于如何解决这个错误的建议吗?谢谢!

+0

你能提供您收到的异常? – 2014-10-08 09:27:01

+0

无法写入到C:\ Users \ ALLEN \ workspace32bit \ RETRIEVE_CHECKER1 \ RETRIEVE_CHECKED1Edward.txt“,并且在我单击确定后程序退出并且写入方法没有执行。 – user3796035 2014-10-08 09:55:33

+0

在RETRIEVE_CHECKED1之后和Edward之前应该有一个斜杠。 txt',否则找不到位置 – 2014-10-08 10:40:48

回答

0

很明显,您是您的机器上的用户ALLEN并以该用户的身份运行该程序,因此您可以正常工作,因为您是目录C:\Users\ALLEN的所有者。

然后你的jar复制到另一台机器,用户ALLEN不存在,并您登录为用户antoher比方说他的名字是Bob并创建目录温特C:\Users。您可能已经注意到,当您想要创建该目录时,用户Bob窗口已警告您需要管理员权限才能完成此操作。

现在,您尝试与只能访问他自己的目录C:\Users\Bob的用户Bob一起运行程序,并尝试写入ALLEN的自己的目录。所以会发生什么是你得到一个IOException告诉你access denied这是好事!

你不应该写信给其他用户的私人注册表,这是一个安全问题。

在你的代码处理文件系统时,从不硬编码绝对路径,总是使用相对路径,或者如果你需要定义一个你需要编程所需的所有数据的direcotry应该被定位,然后传递ist作为参数。

做最简单的,IST使用以下,并与工作电流working directory

String employee = "RETRIEVE_CHECKER1\\RETRIEVE_CHECKED1" + nameProve + ".txt"; 

则需要由在位置的手,你在你的程序运行的程序,或更好,但创建目录RETRIEVE_CHECKER1使用File#mkdir,并使用它是这样的:你赶上

File employee = new File(dir, "RETRIEVE_CHECKED1" + nameProve + ".txt"); 
PrintWriter outputStream1 = new PrintWriter(employeeName); 
+0

感谢man ......不熟悉计算机名称和安全问题,这对我有很大的帮助 – user3796035 2014-10-09 00:20:44

+0

我尝试了一种具有相同目录路径的阅读方法,我手动复制.txt文件到另一个站当我运行我的程序已被导出到一个jar文件它工作它读取文件,我使用相同的文件目录,任何解释为什么我的阅读方法工作,而不是我的写作方法? – user3796035 2014-10-09 00:32:48

+0

@ user3796035计算机上的用户在不同的资源上被授予访问权限,最常见的权限是'read','write'和'execute',前两个是显而易见的,第三个是用于运行一个可执行文件。如果您查看您能够阅读的文件的属性或您可以在安全选项卡中阅读的目录,则可以找到可以访问该文件的用户,方法是选择一个用户,您将看到哪些权限是授予他。你可以在这里找到更多关于这个主题的文章(http://en.wikipedia.org/wiki/File_system_permissions)。 – A4L 2014-10-09 06:41:39

0

异常将所有详情 - 像拒绝访问,目录不存在,等等。目前你失去的异常数据(消息,堆栈跟踪)当c处理它。

请这样做

  • 不要捕捉只是java.lang.Exception的。这是太宽 - 将抓到可能空指针异常和目前的误导性消息'“无法写入'。只捕获特定的异常,而不是实际从try块抛出的异常。在你的情况,这将是java.io. FileNotFoundException
  • 不要丢失异常的细节。它打印到标准错误日志,甚至更好的使用登录电子框架

catch块不会忽略这些问题:

catch(FileNotFoundException e) { 
    JOptionPane.showMessageDialog(null, e.getMessage()); 
    e.printStackTrace(); 
}