【问题标题】:Can't create file in directory - Java无法在目录中创建文件 - Java
【发布时间】:2020-10-18 17:08:37
【问题描述】:

我想将HashMap 的所有元素保存在一个文件中。为此,我在一些谷歌搜索的帮助下编写了以下代码:

 public void saveCalendars() {
        
        try {FileOutputStream fos = new FileOutputStream(CALENDARPATH_STRING);
                 ObjectOutputStream oos = new ObjectOutputStream(fos);
                for(Calendar elementCalendar : calendarRegister.values()) {
                    oos.writeObject(elementCalendar);
                }
                 oos.close();
                 fos.close();
        } catch (FileNotFoundException e) {
            System.out.println("File not found");
            try {FileOutputStream fos = new FileOutputStream(new File(CALENDARPATH_STRING));
                     ObjectOutputStream oos = new ObjectOutputStream(fos);
                    for(Calendar elementCalendar : calendarRegister.values()) {
                        oos.writeObject(elementCalendar);
                    }
                     oos.close();
                     fos.close();
            } catch (IOException ex) {
                System.out.println("Creating: Error initializing stream");
                }
        } catch (IOException e) {
            System.out.println("Save: Error initializing stream");
            }

    }

final static String CALENDARPATH_STRING = "C:\\Windows\\calendars.dat";。 我认为我可以简单地使用相同的代码,但如果尚未创建文件,则使用 FileOutputStream fos = new FileOutputStream(new File(CALENDARPATH_STRING));。 不幸的是,它不起作用。这是第一次做这么省钱的东西,所以也许你能帮帮我。

【问题讨论】:

  • 您能否澄清一下,什么“不起作用”?你有例外吗?还是没有创建文件?
  • 部分问题是您的代码未显示已给出的错误。这些 IOExceptions 可能包含一条错误消息,说明 IO 失败的原因。打印消息!您可以使用 ex.getMessage() 从异常中获取字符串。
  • @IvanBabanin 我得到“找不到文件”和 IOException
  • @user13784117 谢谢!它说我无权访问.. 这就是问题所在!但我已经尝试了其他几个位置。到处都是一样的..
  • 您不能在 C:\Windows 中创建文件 - 该目录受到特别保护,否则会出现安全漏洞。我建议您首先尝试在您的主目录中创建一个文件,可能是 C:\Users\

标签: java hashmap save try-catch fileoutputstream


【解决方案1】:

几个建议:

  1. 使用File.createNewFile 创建新文件并验证其结果
  2. 在处理 IO 问题时使用 try-with-resources(我假设您使用 > JDK 7)。您可以在 official site 上阅读有关此功能的更多信息。

你可以避免重复:

    File calendarFile = new File(CALENDARPATH_STRING);
    try {
        if(calendarFile.createNewFile()) {
            System.out.println("File not found. New file was created");
        }
    } catch (IOException e) {
        System.out.printf("Can not create file %s\n", CALENDARPATH_STRING);
    }

    try(FileOutputStream fos = new FileOutputStream(calendarFile);
        ObjectOutputStream oos = new ObjectOutputStream(fos)) {
        for(Calendar elementCalendar : calendarRegister.values()) {
            oos.writeObject(elementCalendar);
        }
    } catch (IOException e) {
        System.out.println("Save: Error initializing stream");
    }

【讨论】:

  • 谢谢,代码现在看起来确实更好了,但它仍然是 IOException: Can not create file C:\Windows\calendars.dat
  • @benicamera,我相信这是因为 Windows 操作系统禁止在 `C:\Windows` 文件夹中写入文件。你试过不同的文件夹吗?
  • @benicamera,或者您可以以管理员身份运行 Java 程序,但我建议不要这样做。
  • 我试过了,但它说我没有访问权限。你知道哪些文件夹是免费的吗?
  • @benicamera,您能否在您的 C 盘中创建一个新文件夹,例如 calendars。然后将您的常量更新为新值:final static String CALENDARPATH_STRING = "C:\\calendars\\calendars.dat"; 并再试一次。
【解决方案2】:

嗯,我看你的文件CALENDAR_PATH_STRING的路径有问题

并使用new File(CALENDAR_PATH_STRING) 如果找不到特定文件,它将创建一个新文件。在本地我也可以看到它正在工作。

   public void saveCalendars(Map<String, Calendar> calendarRegister) {

     try (FileOutputStream fos = new FileOutputStream(new File(CALENDAR_PATH_STRING)); 
         ObjectOutputStream oos = new ObjectOutputStream(fos)) {
        for (Calendar elementCalendar : calendarRegister.values()) {
            oos.writeObject(elementCalendar);
        }
      } catch (IOException e) {
        System.out.println("Creating: Error initializing stream");
      }
  }

【讨论】:

  • 是的,它会起作用..我在本地和两个不同的地方进行了测试..尝试通过 Windows 资源管理器并确保您有权在此处创建文件@benicamera
  • 另外你不能在 Windows 目录中创建任何文件,尝试在桌面或任何其他驱动器中以 @benicamera 开头
  • 对我不起作用.. 测试了几个位置都没有成功... @Sabareesh Muralidharan
  • 你能说出你的选择吗? @benicamera
  • 您指的是哪些选项?
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 2014-09-21
  • 2013-10-05
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多