java-executable jar-创建filewriter时出错:filenotfoundexception访问被拒绝

lfapxunr  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(462)

我有一个程序,其中有一个文件,我写的进展,我已经做了,所以如果程序关闭,我可以重新读取我已经做了什么。
因此,如果文件不存在(第一次启动程序时),我就创建它,然后写入它。
当我使用eclipse时,这项工作就完成了。但是由于我导出到一个可执行jar,如果文件已经存在,我就有一个错误!也就是说,我可以创建文件并在第一次写入它,但如果我关闭并重新启动程序则不行。
代码如下:

String donePath = "./done.txt";
        try {
            File doneFile = new File(donePath);
            doneFile.createNewFile();
            allreadyDone = new ArrayList<String>(Arrays.asList(new String(
                                Files.readAllBytes(Paths.get(donePath))).split("\n")));
            doneFileWriter =  new FileWriter(donePath, true);
        } catch (IOException e1) {
            e1.printStackTrace();
        }

我得到了:

java.io.FileNotFoundException: .\done.txt (Accès refusé)
        at java.base/java.io.FileOutputStream.open0(Native Method)
        at java.base/java.io.FileOutputStream.open(FileOutputStream.java:292)
        at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:235)
        at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:156)
        at java.base/java.io.FileWriter.<init>(FileWriter.java:82)
        at =============.Main.main(Main.java:51)
ve7v8dk2

ve7v8dk21#

您需要将createnewfile()放在if语句中,这样,如果成功地创建了它,它就会继续,如果不成功,它只会输出“file already exists”。

try {           

          File myObj = new File(filename);
                      if (myObj.createNewFile()) {
                        System.out.println("File created: " + myObj.getName());      
                      } else {
                        System.out.println("File already exists.");          
                      }
                    } catch (IOException e) {
                      System.out.println("An error occurred.");
                      e.printStackTrace();
                    }
myss37ts

myss37ts2#

我用扩展的
打印已完成的工作
写东西(当前时间)
刷新并关闭donefilewriter的finally块。
最后一个街区一切正常。没有finally块,实际上什么也写不出来。
我希望“acc”ès拒绝é" 如果日志文件已打开(由其他运行示例打开)。或者,如果您首先与一个拥有日志文件的用户一起运行代码。然后为下一次运行使用另一个没有写访问权限的用户。
您使用相当现代的java.nio.path。因此,我建议进行一些类型更改和调试输出:

Path donePath = Paths.get("./done.txt");
try {
  File doneFile = donePath.toFile();
  UserPrincipal owner = Files.getOwner(donePath);
  String permissions = PosixFilePermissions.toString(
                         Files.getPosixFilePermissions(donePath));
  System.out.println(
    String.format("abs path:%s, owner:%s, can write:%b, permissions:%s", 
                  doneFile.getAbsolutePath(), owner.getName(), 
                  doneFile.canWrite(), permissions));
  allreadyDone = new ArrayList<String>(Arrays.asList(new String(
                   Files.readAllBytes(donePath)).split("\n")));

你用什么操作系统?哪个java实现(供应商/版本)?你的调试输出是什么?

相关问题