Kesulitannya adalah itu harus lintas platform. Windows 2000, XP, Vista, OSX, Linux, varian unix lainnya. Saya mencari potongan kode yang dapat melakukan ini untuk semua platform, dan cara untuk mendeteksi platform.
Sekarang, Anda harus mengetahui bug 4787931 yang user.home
tidak berfungsi dengan benar, jadi tolong jangan berikan saya jawaban buku teks, saya dapat menemukannya sendiri di manual.
java
cross-platform
home-directory
Bruno Ranschaert
sumber
sumber
Jawaban:
Bug yang Anda referensi (bug 4787391) telah diperbaiki di Java 8. Bahkan jika Anda menggunakan versi Java yang lebih lama,
System.getProperty("user.home")
pendekatannya mungkin masih yang terbaik. Theuser.home
pendekatan tampaknya bekerja dalam jumlah yang sangat besar kasus. Solusi antipeluru 100% pada Windows sulit, karena Windows memiliki konsep pergeseran tentang apa arti direktori home.Jika
user.home
tidak cukup baik untuk Anda, saya sarankan memilih definisihome directory
untuk windows dan menggunakannya, dapatkan variabel lingkungan yang sesuaiSystem.getenv(String)
.sumber
Sebenarnya dengan Java 8 cara yang benar adalah menggunakan:
Bug JDK-6519127 telah diperbaiki dan bagian "Ketidakcocokan antara JDK 8 dan JDK 7" dari catatan rilis menyatakan:
Terlepas dari pertanyaan yang sudah tua saya meninggalkan ini untuk referensi di masa mendatang.
sumber
Lihat JavaDoc .
sumber
Konsep direktori HOME tampaknya agak kabur ketika datang ke Windows. Jika variabel lingkungan (HOMEDRIVE / HOMEPATH / USERPROFILE) tidak cukup, Anda mungkin harus menggunakan fungsi asli melalui JNI atau JNA . SHGetFolderPath memungkinkan Anda untuk mengambil folder khusus, seperti My Documents (CSIDL_PERSONAL) atau Local Settings \ Data Aplikasi (CSIDL_LOCAL_APPDATA).
Contoh kode JNA:
sumber
Orang lain telah menjawab pertanyaan di depan saya tetapi program yang berguna untuk mencetak semua properti yang tersedia adalah:
sumber
Ketika saya sedang mencari versi Scala, yang bisa saya temukan hanyalah kode JNA McDowell di atas. Saya menyertakan port Scala saya di sini, karena saat ini tidak ada tempat yang lebih tepat.
Seperti halnya versi Java, Anda harus menambahkan Java Native Access , termasuk kedua file jar, ke pustaka yang direferensikan.
Sangat menyenangkan untuk melihat bahwa JNA sekarang membuat ini jauh lebih mudah daripada ketika kode asli diposting.
sumber
Saya akan menggunakan algoritma yang dirinci dalam laporan bug menggunakan System.getenv (String), dan mundur untuk menggunakan properti user.dir jika tidak ada variabel lingkungan menunjukkan direktori yang ada yang valid. Ini harus bekerja lintas platform.
Saya pikir, di bawah Windows, apa yang benar-benar Anda cari adalah direktori "dokumen" nosional pengguna.
sumber
Alternatifnya adalah menggunakan Apache CommonsIO
FileUtils.getUserDirectory()
alih-alihSystem.getProperty("user.home")
. Ini akan memberi Anda hasil yang sama dan tidak ada kesempatan untuk memperkenalkan kesalahan ketik saat menentukan properti sistem.Ada kemungkinan besar Anda sudah memiliki perpustakaan Apache CommonsIO di proyek Anda. Jangan perkenalkan jika Anda berencana menggunakannya hanya untuk mendapatkan direktori home user.
sumber
Jika Anda menginginkan sesuatu yang berfungsi dengan baik di windows ada paket bernama WinFoldersJava yang membungkus panggilan asli untuk mendapatkan direktori 'khusus' pada Windows. Kami sering menggunakannya dan berfungsi dengan baik.
sumber