如何在java中获取桌面路径

jum*_*mar 57 java desktop

我认为这只适用于英语Windows安装:

System.getProperty("user.home") + "/Desktop";
Run Code Online (Sandbox Code Playgroud)

如何让这个非英语Windows工作?

小智 41

我使用法语版的Windows并使用它的指令:

System.getProperty("user.home") + "/Desktop";
Run Code Online (Sandbox Code Playgroud)

对我来说很好.

  • 不要这样做.如果用户移动了桌面,则无法使用!如果你有一个固态C:驱动器,将桌面移动到另一个驱动器上是很常见的.这会阻止对SSD的大量写入(读取不会缩短生命周期,写入会这样做),这意味着您可以使用小型C:驱动器和大型正常驱动器. (5认同)

Dan*_*ell 8

我认为这是同一个问题......但我不确定!:

在Windows下的java中,如何找到重定向的Desktop文件夹?

阅读它我会期望该解决方案返回user.home,但显然不是,并且答案中的链接评论回来了.我自己没试过.

我想通过使用JFileChooser该解决方案将需要一个非无头JVM,但你可能正在运行其中一个.

  • 上面提到的链接给出了正确的答案.`File home = FileSystemView.getFileSystemView().getHomeDirectory();`然后如果你需要它作为字符串`home.getAbsolutePath();` (4认同)

mau*_*tto 8

javax.swing.filechooser.FileSystemView.getFileSystemView().getHomeDirectory()
Run Code Online (Sandbox Code Playgroud)

  • 开发人员选择了打包的位置:-) (2认同)
  • 这在OSX上不起作用-解析为``user.home`` (2认同)

Rea*_*wTo 6

这仅适用于Windows.启动REG.EXE并捕获其输出:

import java.io.*;

public class WindowsUtils {
  private static final String REGQUERY_UTIL = "reg query ";
  private static final String REGSTR_TOKEN = "REG_SZ";
  private static final String DESKTOP_FOLDER_CMD = REGQUERY_UTIL 
     + "\"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\" 
     + "Explorer\\Shell Folders\" /v DESKTOP";

  private WindowsUtils() {}

  public static String getCurrentUserDesktopPath() {
    try {
      Process process = Runtime.getRuntime().exec(DESKTOP_FOLDER_CMD);
      StreamReader reader = new StreamReader(process.getInputStream());

      reader.start();
      process.waitFor();
      reader.join();
      String result = reader.getResult();
      int p = result.indexOf(REGSTR_TOKEN);

      if (p == -1) return null;
      return result.substring(p + REGSTR_TOKEN.length()).trim();
    }
    catch (Exception e) {
      return null;
    }
  }

  /**
   * TEST
   */
  public static void main(String[] args) {
    System.out.println("Desktop directory : " 
       + getCurrentUserDesktopPath());
  }


  static class StreamReader extends Thread {
    private InputStream is;
    private StringWriter sw;

    StreamReader(InputStream is) {
      this.is = is;
      sw = new StringWriter();
    }

    public void run() {
      try {
        int c;
        while ((c = is.read()) != -1)
          sw.write(c);
        }
        catch (IOException e) { ; }
      }

    String getResult() {
      return sw.toString();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用JNA(这里有完整的例子)

   Shell32.INSTANCE.SHGetFolderPath(null,
      ShlObj.CSIDL_DESKTOPDIRECTORY, null, ShlObj.SHGFP_TYPE_CURRENT,
      pszPath);
Run Code Online (Sandbox Code Playgroud)

  • 使用 JNA 比调用过程并解析结果要好得多。 (2认同)

Grz*_*zki 3

看来没那么容易啊...

但是您可以尝试找到一个浏览一些开源项目代码的答案,例如在Koders上。我想所有的解决方案都归结为检查HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\DesktopWindows 注册表中的路径。并且可能是特定于 Windows 的。

如果您需要更通用的解决方案,我会尝试找到一个您知道可以在不同平台上正常工作的开源应用程序,并将一些图标放在用户的桌面上。