Getting My Documents path in Java
That's easy, JFileChooser
finds it for you
new JFileChooser().getFileSystemView().getDefaultDirectory().toString();
I hope this helps someone
You can get it using a registry query, no need for JNA or admin rights for that.
Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell
Folders\" /v personal");
Obviously this will fail on anything other than Windows, and I am not certain whether this works for Windows XP.
EDIT: Put this in a working sequence of code:
String myDocuments = null;
try {
Process p = Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\" /v personal");
p.waitFor();
InputStream in = p.getInputStream();
byte[] b = new byte[in.available()];
in.read(b);
in.close();
myDocuments = new String(b);
myDocuments = myDocuments.split("\\s\\s+")[4];
} catch(Throwable t) {
t.printStackTrace();
}
System.out.println(myDocuments);
Note this will lock the process until "reg query" is done, which might cause trouble dependeing on what you are doing.
Note in 2020: The ShellFolder class seems to be missing on Linux (tested with openjdk8), so IvanRF's answer is likely better.
Original answer:
The best way I've found is to use AWTs:
ShellFolder.get("fileChooserDefaultFolder");
I have redirected my Documents folder to the D: drive, and it successfully fetches this directory. It also does so in about 40 ms (on my machine). Using FileSystemView
takes about 48 ms, and new JFileChooser()
about 250 ms.
All three of these methods actually use ShellFolder
under the hood, and the difference with FileSystemView
is negligible, but calling it directly avoids the overhead of the other two.
Note: You can also cast this directly to File
instead of implicitly getting the toString()
method of it, which can help you further:
File documents = (File) ShellFolder.get("fileChooserDefaultFolder");
Since the most upvoted answer from @xchiltonx uses JFileChooser
I would like to add that, regarding performance, this is faster than using JFileChooser
:
FileSystemView.getFileSystemView().getDefaultDirectory().getPath()
In my PC, JFileChooser
aproach needed 300ms, and calling FileSystemView
directly needed less than 100ms.
Note: The question is a possible duplicate of How to find “My Documents” folder in Java