Saya ingin menentukan sistem operasi host yang dijalankan oleh program Java saya (misalnya: Saya ingin dapat memuat properti yang berbeda berdasarkan apakah saya menggunakan platform Windows atau Unix). Apa cara teraman untuk melakukan ini dengan keandalan 100%?
java
operating-system
karlgrz
sumber
sumber
Windows 10
namunos.name
memberi sayaWindows 8.1
. Mengapa demikian? Dari mana datangnya ini?Seperti yang ditunjukkan dalam jawaban lain, System.getProperty menyediakan data mentah. Namun, komponen Apache Commons Lang menyediakan pembungkus untuk java.lang.System dengan sifat-sifat praktis seperti
SystemUtils.IS_OS_WINDOWS
, sangat mirip dengan utilitas Swingx OS yang disebutkan di atas.sumber
Oktober 2008:
Saya akan merekomendasikan untuk menyimpannya dalam variabel statis:
Dengan begitu, setiap kali Anda meminta Os, Anda tidak mengambil properti lebih dari satu kali seumur hidup aplikasi Anda.
Februari 2016: 7+ tahun kemudian:
Ada bug dengan Windows 10 (yang tidak ada pada saat jawaban aslinya).
Lihat " Java" os.name "untuk Windows 10? "
sumber
isWindows
,isUnix
cara, dll Itu Anda menyimpan pada waktu perbandingan string juga.beberapa tautan dalam jawaban di atas tampaknya rusak. Saya telah menambahkan pointer ke kode sumber saat ini dalam kode di bawah ini dan menawarkan pendekatan untuk menangani cek dengan enum sebagai jawaban sehingga pernyataan switch dapat digunakan saat mengevaluasi hasilnya:
Kelas pembantu adalah:
sumber
Kelas JavaFX berikut memiliki metode statis untuk menentukan OS saat ini (isWindows (), isLinux () ...):
Contoh:
sumber
TL; DR
Untuk mengakses OS penggunaan:
System.getProperty("os.name")
.Tapi mengapa tidak membuat kelas utilitas, buat itu bisa digunakan kembali! Dan mungkin jauh lebih cepat pada beberapa panggilan. Bersih, jernih, lebih cepat!
Buat kelas Util untuk fungsi utilitas tersebut. Kemudian buat enum publik untuk setiap jenis sistem operasi.
Sekarang, Anda dapat dengan mudah memanggil kelas dari kelas mana saja sebagai berikut, (PS Karena kami menyatakan variabel os sebagai statis, itu akan memakan waktu hanya sekali untuk mengidentifikasi jenis sistem, maka itu dapat digunakan sampai aplikasi Anda berhenti.)
dan itu dia!
sumber
Contoh kecil dari apa yang ingin Anda capai mungkin
class
mirip dengan apa yang ada di bawahnya:Implementasi khusus ini cukup dapat diandalkan dan harus dapat diterapkan secara universal. Cukup salin dan tempel ke
class
pilihan Anda.sumber
Jika Anda tertarik pada bagaimana proyek open source melakukan hal-hal seperti ini, Anda dapat melihat kelas Terracotta (Os.java) yang menangani sampah ini di sini:
http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/Dan Anda dapat melihat kelas serupa untuk menangani versi JVM (Vm.java dan VmVersion.java) di sini:
sumber
toLowerCase
tanpa menentukan lokalCoba ini, sederhana dan mudah
sumber
Diambil dari proyek ini https://github.com/RishiGupta12/serial-communication-manager
sumber
Kode di bawah ini menunjukkan nilai-nilai yang bisa Anda dapatkan dari API Sistem, ini semua hal yang bisa Anda dapatkan melalui API ini.
Jawaban: -
sumber
Saya menemukan bahwa Utils OS dari Swingx melakukan pekerjaan.
sumber
Saya pikir mengikuti dapat memberikan cakupan yang lebih luas dalam garis yang lebih sedikit
Lebih detail di sini: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
sumber
sumber
Anda cukup menggunakan metode sun.awt.OSInfo # getOSType ()
sumber
Jika Anda bekerja di lingkungan yang peka terhadap keamanan, silakan baca ini.
Harap jangan pernah mempercayai properti yang diperoleh melalui
System#getProperty(String)
subrutin! Sebenarnya, hampir setiap properti termasukos.arch
,,os.name
danos.version
tidak dibaca hanya seperti yang Anda harapkan - sebagai gantinya, mereka sebenarnya sangat berlawanan.Pertama-tama, kode apa pun dengan izin yang memadai untuk menjalankan
System#setProperty(String, String)
subrutin dapat mengubah literal yang dikembalikan sesuka hati. Namun, itu belum tentu masalah utama di sini, karena dapat diselesaikan melalui penggunaan yang disebutSecurityManager
, seperti yang dijelaskan secara lebih rinci di sini .Masalah sebenarnya adalah bahwa setiap pengguna dapat mengedit properti ini ketika menjalankan
JAR
pertanyaan tersebut. Ini berarti bahwa tidak ada cara untuk menentukan apakah properti ini memang benar-benar akurat. Karena itu, berikut adalah beberapa pemeriksaan tambahan untuk mencoba dan menghindari gangguan:Ide bagus lainnya adalah memeriksa keberadaan direktori khusus sistem operasi. Apa pun pendekatan yang Anda ambil, ingatlah bahwa bahasa Jawa diindentasikan sebagai platform silang. Jadi, mengapa Anda tidak mencoba melakukan hal yang sama?
sumber
Saya menyukai jawaban Wolfgang, hanya karena saya percaya hal-hal seperti itu harus menjadi konstanta ...
jadi saya ulangi sedikit untuk saya sendiri, dan berpikir untuk membagikannya :)
sumber
Kode ini untuk menampilkan semua informasi tentang jenis sistem os, nama, informasi java dan sebagainya.
sumber
Di kelas com.sun.jna.Platform Anda dapat menemukan metode statis yang berguna seperti
dan banyak lagi.
Jika Anda menggunakan Maven, tambahkan saja ketergantungan
Jika tidak, cari saja file jar perpustakaan jna (mis. Jna-5.2.0.jar) dan tambahkan ke classpath.
sumber
Gunakan saja
com.sun.javafx.util.Utils
seperti di bawah ini.ATAU GUNAKAN
sumber