我需要使用Java查找我的文檔路徑。下面的代碼不給我「準確」 loation在Java中獲取我的文檔路徑
System.getProperty("user.home");
應該是什麼其他的方式左右?
P.S: 我不想使用JFileChooser骯髒的伎倆。
我需要使用Java查找我的文檔路徑。下面的代碼不給我「準確」 loation在Java中獲取我的文檔路徑
System.getProperty("user.home");
應該是什麼其他的方式左右?
P.S: 我不想使用JFileChooser骯髒的伎倆。
您可以使用註冊表查詢來獲取它,不需要JNA或管理員權限。
Runtime.getRuntime().exec("reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell
Folders\" /v personal");
很明顯,除了Windows之外,這將失敗,我不確定這是否適用於Windows XP。
編輯:在代碼中的工作時序 將這個:
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);
注意,直到「REG查詢」完成,這將鎖定的過程中,這可能會導致麻煩dependeing你在做什麼。
有沒有辦法直接從Java內查詢註冊表? – 2012-03-13 20:19:09
通常可以使用'java.util.prefs'軟件包提供的工具,但它僅限於SOFTWARE \ JavaSoft \ Prefs'樹,我已經閱讀過與Windows'UAC衝突的內容。 除此之外,還有一些本機解決方案提供了一個JNI DLL來讀取和寫入Windows註冊表。但顯然這對項目分配有很大的影響。 'reg'命令應該是安全的,可以快速返回並且不會鎖定,因此我認爲這是查詢註冊表的最佳方式,即使它有點冗長(總是可以放入實用程序類) – pdinklag 2012-03-14 19:30:14
"user.home"
返回用戶的主目錄,而不是「我的文檔」文件夾。 在Windows中,這將是 「C:\ Users \用戶名\」 爲Vista或Windows 7,或 「C:\ Documents和Settings \用戶名」 的XP
你想要的是:
System.out.println(System.getProperty("user.home") + File.separatorChar + "My Documents");
該邏輯不可靠。文檔文件夾可能已被重定向到別處,或者該名稱可能是另一種語言。 – 2012-03-13 03:25:30
這很簡單,JFileChooser
發現它爲你
JFileChooser().getFileSystemView().getDefaultDirectory().toString();
我希望這可以幫助別人
謝謝,它爲我工作... :) – tausun 2013-01-17 06:06:00
這就是日食確實讓用戶的文檔文件夾
System.getProperty("user.dir") //$NON-NLS-1$
+ File.separator + "workspace")
希望這是有幫助!
這不是一個文檔文件夾 – coolguy 2017-05-29 18:02:02
使用JNA你可以這樣做:
String myDocsPath = Shell32Util.getFolderPath(ShlObj.CSIDL_PERSONAL);
JNA提取物對即時一個DLL,然後使用JNI這個DLL使Windows API調用。它雖然隱藏了你的所有JNI細節。使用JNA與使用任何其他Java庫JAR一樣簡單。
由於從@xchiltonx最upvoted答案使用JFileChooser
我想補充一點,對於性能,這比使用JFileChooser
更快:
FileSystemView.getFileSystemView().getDefaultDirectory().getPath()
在我的電腦,JFileChooser
形式給出需要300毫秒,和直接調用FileSystemView
需要不到100ms。
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(System.getProperty("user") + (File.separatorChar + "My Documents")));
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
System.out.println("Selected file: " + selectedFile.getAbsolutePath());
只需添加這一個 +(File.separatorChar +「我的文檔」) – 2017-10-21 16:07:25
你的答案有什麼好處?你至少可以解釋爲什麼這是一個更好的方式來做到這一點。已經有一個被接受的答案,另一個得分爲18. – louisfischer 2017-10-21 16:29:12
,因爲它會將你引導到我的文檔..它.. – 2017-10-26 16:32:04
可能重複你必須讓你的手髒的一種方式或其他。使用JNA/JNI的方法可以通過'McDowell'海報找到:http://stackoverflow.com/questions/585534/what-is-the-best-way-to-find-the-users-home-directory- in-java – sethcall 2012-03-13 02:44:59
發佈的示例中沒有帶有最新JNA的工作解決方案 – 2012-03-13 02:56:03
嗯,我不能說這些,但所有跡象表明,要獲得正確的解決方案非常艱難,而且像JNI似乎需要做'正確的東西'(即直接詢問窗口) – sethcall 2012-03-13 02:57:18