【问题标题】:Windows 10 - ObjectOutputStream can't find relative paths because current working directory is System32Windows 10 - ObjectOutputStream 找不到相对路径,因为当前工作目录是 System32
【发布时间】:2022-01-22 08:58:56
【问题描述】:

当我调用方法时

System.out.print(new File("").getAbsolutePath())

从 main 我得到项目工作区

C:\Users\darkr\Desktop\NuovoWorkSpace\ProjectName.

当它被我们的 save() 方法调用时,它会序列化我们需要的东西,突然间给出的绝对路径来自

new File("").getAbsolutePath()

成为 System32(对我而言)和我同事的桌面目录。

我们正在使用 gitHub 来分享我们的更改,但这几乎是不可能的。

【问题讨论】:

  • 尝试使用 Path 类获取文件/目录路径。 字符串路径 = Paths.get("").toAbsolutePath().toString();

标签: java serialization relative-path absolute-path objectoutputstream


【解决方案1】:

您拥有的代码new File("").getAbsolutePath() 通常用于确定您启动应用程序main(String[]) 方法的当前目录。所以看起来你是从C:\Windows\System32 运行而不是在桌面文件夹上。

解决您的问题的最简单方法是编辑您的应用程序快捷方式(参见.lnk 文件并设置“开始于”文件夹),或在运行您的应用程序之前将cd 放在适当的可写目录中,或者更改您的应用程序使用文件选择器来选择保存的目标位置。

或者选择合理的输出路径而不是"",一些不错的候选者是:

// Local user profile
File folder = new File(System.getenv("LOCALAPPDATA"), "myfolder"); 
// Roaming user profile
File folder = new File(System.getenv("APPDATA"), "myfolder"); 
// Temp folder:
File folder = new File(System.getProperty("java.io.tmpdir"), "myfolder")

一些网站建议使用以下行之一来定位 Desktop,但这是不可靠的,因为如果文件夹已被移动或在某些非英语安装上运行,它将无法工作:

File maybeDesktop = new File(System.getProperty("user.home"), "Desktop");
Path maybeDesktop = Path.of(System.getProperty("user.home"), "Desktop");

如果要从 Java 中读取用户 Desktop 的确切位置,则需要使用 JNI/JNA/Panama 调用 Windows API 函数 SHGetFolderPathSHGetKnownFolderPath

【讨论】:

  • 是的。在 Windows 中使用 AppData 子目录,在 Mac 中使用 $HOME/Library/Support,在 Linux 中使用 $HOME/.local/share。
猜你喜欢
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2019-01-27
  • 2014-07-29
相关资源
最近更新 更多