View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3;
18  
19  import java.io.File;
20  import java.nio.file.Path;
21  import java.nio.file.Paths;
22  
23  /**
24   * Helpers for {@link System}.
25   *
26   * <p>
27   * If a system property cannot be read due to security restrictions, the corresponding field in this class will be set to {@code null} and a message will be
28   * written to {@code System.err}.
29   * </p>
30   * <p>
31   * #ThreadSafe#
32   * </p>
33   *
34   * @since 1.0
35   * @see SystemProperties
36   */
37  public class SystemUtils {
38  
39      /**
40       * The prefix String for all Windows OS.
41       */
42      private static final String OS_NAME_WINDOWS_PREFIX = "Windows";
43  
44      // System property constants
45      // -----------------------------------------------------------------------
46      // These MUST be declared first. Other constants depend on this.
47  
48      /**
49       * A constant for the System Property {@code file.encoding}.
50       *
51       * <p>
52       * File encoding, such as {@code Cp1252}.
53       * </p>
54       * <p>
55       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
56       * </p>
57       * <p>
58       * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
59       * called after this class is loaded, the value will be out of sync with that System property.
60       * </p>
61       *
62       * @see SystemProperties#getFileEncoding()
63       * @since 2.0
64       * @since Java 1.2
65       */
66      public static final String FILE_ENCODING = SystemProperties.getFileEncoding();
67  
68      /**
69       * A constant for the System Property {@code file.separator}.
70       * <p>
71       * The file separator is:
72       * </p>
73       * <ul>
74       * <li>{@code "/"} on Unix</li>
75       * <li>{@code "\"} on Windows.</li>
76       * </ul>
77       *
78       * <p>
79       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
80       * </p>
81       * <p>
82       * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
83       * called after this class is loaded, the value will be out of sync with that System property.
84       * </p>
85       *
86       * @see SystemProperties#getFileSeparator()
87       * @since Java 1.1
88       * @deprecated Use {@link File#separator}, since it is guaranteed to be a string containing a single character and it does not require a privilege check.
89       */
90      @Deprecated
91      public static final String FILE_SEPARATOR = SystemProperties.getFileSeparator();
92  
93      /**
94       * A constant for the System Property {@code java.awt.fonts}.
95       *
96       * <p>
97       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
98       * </p>
99       * <p>
100      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
101      * called after this class is loaded, the value will be out of sync with that System property.
102      * </p>
103      *
104      * @see SystemProperties#getJavaAwtFonts()
105      * @since 2.1
106      * @deprecated Deprecated without replacement.
107      */
108     @Deprecated
109     public static final String JAVA_AWT_FONTS = SystemProperties.getJavaAwtFonts();
110 
111     /**
112      * A constant for the System Property {@code java.awt.graphicsenv}.
113      *
114      * <p>
115      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
116      * </p>
117      * <p>
118      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
119      * called after this class is loaded, the value will be out of sync with that System property.
120      * </p>
121      *
122      * @see SystemProperties#getJavaAwtGraphicsenv()
123      * @since 2.1
124      * @deprecated Deprecated without replacement.
125      */
126     @Deprecated
127     public static final String JAVA_AWT_GRAPHICSENV = SystemProperties.getJavaAwtGraphicsenv();
128 
129     /**
130      * A constant for the System Property {@code java.awt.headless}. The value of this property is the String {@code "true"} or {@code "false"}.
131      *
132      * <p>
133      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
134      * </p>
135      * <p>
136      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
137      * called after this class is loaded, the value will be out of sync with that System property.
138      * </p>
139      *
140      * @see #isJavaAwtHeadless()
141      * @see SystemProperties#getJavaAwtHeadless()
142      * @since 2.1
143      * @since Java 1.4
144      * @deprecated Deprecated without replacement.
145      */
146     @Deprecated
147     public static final String JAVA_AWT_HEADLESS = SystemProperties.getJavaAwtHeadless();
148 
149     /**
150      * A constant for the System Property {@code java.awt.printerjob}.
151      *
152      * <p>
153      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
154      * </p>
155      * <p>
156      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
157      * called after this class is loaded, the value will be out of sync with that System property.
158      * </p>
159      *
160      * @see SystemProperties#getJavaAwtPrinterjob()
161      * @since 2.1
162      * @deprecated Deprecated without replacement.
163      */
164     @Deprecated
165     public static final String JAVA_AWT_PRINTERJOB = SystemProperties.getJavaAwtPrinterjob();
166 
167     /**
168      * A constant for the System Property {@code java.class.path}. Java class path.
169      *
170      * <p>
171      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
172      * </p>
173      * <p>
174      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
175      * called after this class is loaded, the value will be out of sync with that System property.
176      * </p>
177      *
178      * @see SystemProperties#getJavaClassPath()
179      * @since Java 1.1
180      */
181     public static final String JAVA_CLASS_PATH = SystemProperties.getJavaClassPath();
182 
183     /**
184      * A constant for the System Property {@code java.class.version}. Java class format version number.
185      *
186      * <p>
187      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
188      * </p>
189      * <p>
190      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
191      * called after this class is loaded, the value will be out of sync with that System property.
192      * </p>
193      *
194      * @see SystemProperties#getJavaClassVersion()
195      * @since Java 1.1
196      */
197     public static final String JAVA_CLASS_VERSION = SystemProperties.getJavaClassVersion();
198 
199     /**
200      * A constant for the System Property {@code java.compiler}. Name of JIT compiler to use. First in JDK version 1.2. Not used in Sun JDKs after 1.2.
201      *
202      * <p>
203      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
204      * </p>
205      * <p>
206      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
207      * called after this class is loaded, the value will be out of sync with that System property.
208      * </p>
209      *
210      * @see SystemProperties#getJavaCompiler()
211      * @since Java 1.2. Not used in Sun versions after 1.2.
212      * @deprecated Deprecated without replacement; see https://bugs.openjdk.org/browse/JDK-8305998
213      */
214     @Deprecated
215     public static final String JAVA_COMPILER = SystemProperties.getJavaCompiler();
216 
217     /**
218      * A constant for the System Property {@code java.endorsed.dirs}. Path of endorsed directory or directories.
219      *
220      * <p>
221      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
222      * </p>
223      * <p>
224      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
225      * called after this class is loaded, the value will be out of sync with that System property.
226      * </p>
227      *
228      * @see SystemProperties#getJavaEndorsedDirs()
229      * @since Java 1.4
230      * @deprecated Deprecated without replacement.
231      */
232     @Deprecated
233     public static final String JAVA_ENDORSED_DIRS = SystemProperties.getJavaEndorsedDirs();
234 
235     /**
236      * A constant for the System Property {@code java.ext.dirs}. Path of extension directory or directories.
237      *
238      * <p>
239      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
240      * </p>
241      * <p>
242      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
243      * called after this class is loaded, the value will be out of sync with that System property.
244      * </p>
245      *
246      * @see SystemProperties#getJavaExtDirs()
247      * @since Java 1.3
248      * @deprecated Deprecated without replacement.
249      */
250     @Deprecated
251     public static final String JAVA_EXT_DIRS = SystemProperties.getJavaExtDirs();
252 
253     /**
254      * A constant for the System Property {@code java.home}. Java installation directory.
255      *
256      * <p>
257      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
258      * </p>
259      * <p>
260      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
261      * called after this class is loaded, the value will be out of sync with that System property.
262      * </p>
263      *
264      * @see SystemProperties#getJavaHome()
265      * @since Java 1.1
266      */
267     public static final String JAVA_HOME = SystemProperties.getJavaHome();
268 
269     /**
270      * A constant for the System Property {@code java.io.tmpdir}. Default temp file path.
271      *
272      * <p>
273      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
274      * </p>
275      * <p>
276      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
277      * called after this class is loaded, the value will be out of sync with that System property.
278      * </p>
279      *
280      * @see SystemProperties#getJavaIoTmpdir()
281      * @since Java 1.2
282      */
283     public static final String JAVA_IO_TMPDIR = SystemProperties.getJavaIoTmpdir();
284 
285     /**
286      * A constant for the System Property {@code java.library.path}. List of paths to search when loading libraries.
287      *
288      * <p>
289      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
290      * </p>
291      * <p>
292      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
293      * called after this class is loaded, the value will be out of sync with that System property.
294      * </p>
295      *
296      * @see SystemProperties#getJavaLibraryPath()
297      * @since Java 1.2
298      */
299     public static final String JAVA_LIBRARY_PATH = SystemProperties.getJavaLibraryPath();
300 
301     /**
302      * A constant for the System Property {@code java.runtime.name}. Java Runtime Environment name.
303      *
304      * <p>
305      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
306      * </p>
307      * <p>
308      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
309      * called after this class is loaded, the value will be out of sync with that System property.
310      * </p>
311      *
312      * @see SystemProperties#getJavaRuntimeName()
313      * @since 2.0
314      * @since Java 1.3
315      */
316     public static final String JAVA_RUNTIME_NAME = SystemProperties.getJavaRuntimeName();
317 
318     /**
319      * A constant for the System Property {@code java.runtime.version}. Java Runtime Environment version.
320      *
321      * <p>
322      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
323      * </p>
324      * <p>
325      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
326      * called after this class is loaded, the value will be out of sync with that System property.
327      * </p>
328      *
329      * @see SystemProperties#getJavaRuntimeVersion()
330      * @since 2.0
331      * @since Java 1.3
332      */
333     public static final String JAVA_RUNTIME_VERSION = SystemProperties.getJavaRuntimeVersion();
334 
335     /**
336      * A constant for the System Property {@code java.specification.name}. Java Runtime Environment specification name.
337      *
338      * <p>
339      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
340      * </p>
341      * <p>
342      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
343      * called after this class is loaded, the value will be out of sync with that System property.
344      * </p>
345      *
346      * @see SystemProperties#getJavaSpecificationName()
347      * @since Java 1.2
348      */
349     public static final String JAVA_SPECIFICATION_NAME = SystemProperties.getJavaSpecificationName();
350 
351     /**
352      * A constant for the System Property {@code java.specification.vendor}. Java Runtime Environment specification vendor.
353      *
354      * <p>
355      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
356      * </p>
357      * <p>
358      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
359      * called after this class is loaded, the value will be out of sync with that System property.
360      * </p>
361      *
362      * @see SystemProperties#getJavaSpecificationVendor()
363      * @since Java 1.2
364      */
365     public static final String JAVA_SPECIFICATION_VENDOR = SystemProperties.getJavaSpecificationVendor();
366 
367     /**
368      * A constant for the System Property {@code java.specification.version}. Java Runtime Environment specification version.
369      *
370      * <p>
371      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
372      * </p>
373      * <p>
374      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
375      * called after this class is loaded, the value will be out of sync with that System property.
376      * </p>
377      *
378      * @see SystemProperties#getJavaSpecificationVersion()
379      * @since Java 1.3
380      */
381     public static final String JAVA_SPECIFICATION_VERSION = SystemProperties.getJavaSpecificationVersion();
382 
383     /**
384      * A constant for the Java version, may be null.
385      */
386     static final JavaVersion JAVA_SPECIFICATION_VERSION_ENUM = JavaVersion.get(JAVA_SPECIFICATION_VERSION);
387 
388     /**
389      * A constant for the System Property {@code java.util.prefs.PreferencesFactory}. A class name.
390      *
391      * <p>
392      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
393      * </p>
394      * <p>
395      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
396      * called after this class is loaded, the value will be out of sync with that System property.
397      * </p>
398      *
399      * @see SystemProperties#getJavaUtilPrefsPreferencesFactory()
400      * @since 2.1
401      * @since Java 1.4
402      */
403     public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY = SystemProperties.getJavaUtilPrefsPreferencesFactory();
404 
405     /**
406      * A constant for the System Property {@code java.vendor}. Java vendor-specific string.
407      *
408      * <p>
409      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
410      * </p>
411      * <p>
412      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
413      * called after this class is loaded, the value will be out of sync with that System property.
414      * </p>
415      *
416      * @see SystemProperties#getJavaVendor()
417      * @since Java 1.1
418      */
419     public static final String JAVA_VENDOR = SystemProperties.getJavaVendor();
420 
421     /**
422      * A constant for the System Property {@code java.vendor.url}. Java vendor URL.
423      *
424      * <p>
425      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
426      * </p>
427      * <p>
428      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
429      * called after this class is loaded, the value will be out of sync with that System property.
430      * </p>
431      *
432      * @see SystemProperties#getJavaVendorUrl()
433      * @since Java 1.1
434      */
435     public static final String JAVA_VENDOR_URL = SystemProperties.getJavaVendorUrl();
436 
437     /**
438      * A constant for the System Property {@code java.version}. Java version number.
439      *
440      * <p>
441      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
442      * </p>
443      * <p>
444      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
445      * called after this class is loaded, the value will be out of sync with that System property.
446      * </p>
447      *
448      * @see SystemProperties#getJavaVersion()
449      * @since Java 1.1
450      */
451     public static final String JAVA_VERSION = SystemProperties.getJavaVersion();
452 
453     /**
454      * A constant for the System Property {@code java.vm.info}. Java Virtual Machine implementation info.
455      *
456      * <p>
457      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
458      * </p>
459      * <p>
460      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
461      * called after this class is loaded, the value will be out of sync with that System property.
462      * </p>
463      *
464      * @see SystemProperties#getJavaVmInfo()
465      * @since 2.0
466      * @since Java 1.2
467      */
468     public static final String JAVA_VM_INFO = SystemProperties.getJavaVmInfo();
469 
470     /**
471      * A constant for the System Property {@code java.vm.name}. Java Virtual Machine implementation name.
472      *
473      * <p>
474      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
475      * </p>
476      * <p>
477      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
478      * called after this class is loaded, the value will be out of sync with that System property.
479      * </p>
480      *
481      * @see SystemProperties#getJavaVmName()
482      * @since Java 1.2
483      */
484     public static final String JAVA_VM_NAME = SystemProperties.getJavaVmName();
485 
486     /**
487      * A constant for the System Property {@code java.vm.specification.name}. Java Virtual Machine specification name.
488      *
489      * <p>
490      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
491      * </p>
492      * <p>
493      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
494      * called after this class is loaded, the value will be out of sync with that System property.
495      * </p>
496      *
497      * @see SystemProperties#getJavaVmSpecificationName()
498      * @since Java 1.2
499      */
500     public static final String JAVA_VM_SPECIFICATION_NAME = SystemProperties.getJavaVmSpecificationName();
501 
502     /**
503      * A constant for the System Property {@code java.vm.specification.vendor}. Java Virtual Machine specification vendor.
504      *
505      * <p>
506      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
507      * </p>
508      * <p>
509      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
510      * called after this class is loaded, the value will be out of sync with that System property.
511      * </p>
512      *
513      * @see SystemProperties#getJavaVmSpecificationVendor()
514      * @since Java 1.2
515      */
516     public static final String JAVA_VM_SPECIFICATION_VENDOR = SystemProperties.getJavaVmSpecificationVendor();
517 
518     /**
519      * A constant for the System Property {@code java.vm.specification.version}. Java Virtual Machine specification version.
520      *
521      * <p>
522      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
523      * </p>
524      * <p>
525      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
526      * called after this class is loaded, the value will be out of sync with that System property.
527      * </p>
528      *
529      * @see SystemProperties#getJavaVmSpecificationVersion()
530      * @since Java 1.2
531      */
532     public static final String JAVA_VM_SPECIFICATION_VERSION = SystemProperties.getJavaVmSpecificationVersion();
533 
534     /**
535      * A constant for the System Property {@code java.vm.vendor}. Java Virtual Machine implementation vendor.
536      *
537      * <p>
538      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
539      * </p>
540      * <p>
541      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
542      * called after this class is loaded, the value will be out of sync with that System property.
543      * </p>
544      *
545      * @see SystemProperties#getJavaVmVendor()
546      * @since Java 1.2
547      */
548     public static final String JAVA_VM_VENDOR = SystemProperties.getJavaVmVendor();
549 
550     /**
551      * A constant for the System Property {@code java.vm.version}. Java Virtual Machine implementation version.
552      *
553      * <p>
554      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
555      * </p>
556      * <p>
557      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
558      * called after this class is loaded, the value will be out of sync with that System property.
559      * </p>
560      *
561      * @see SystemProperties#getJavaVmVersion()
562      * @since Java 1.2
563      */
564     public static final String JAVA_VM_VERSION = SystemProperties.getJavaVmVersion();
565 
566     /**
567      * A constant for the System Property {@code line.separator}. Line separator ({@code &quot;\n&quot;} on Unix).
568      *
569      * <p>
570      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
571      * </p>
572      * <p>
573      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
574      * called after this class is loaded, the value will be out of sync with that System property.
575      * </p>
576      *
577      * @see SystemProperties#getLineSeparator()
578      * @since Java 1.1
579      * @deprecated Use {@link System#lineSeparator()} instead, since it does not require a privilege check.
580      */
581     @Deprecated
582     public static final String LINE_SEPARATOR = SystemProperties.getLineSeparator();
583 
584     /**
585      * A constant for the System Property {@code os.arch}. Operating system architecture.
586      *
587      * <p>
588      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
589      * </p>
590      * <p>
591      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
592      * called after this class is loaded, the value will be out of sync with that System property.
593      * </p>
594      *
595      * @see SystemProperties#getOsArch()
596      * @since Java 1.1
597      */
598     public static final String OS_ARCH = SystemProperties.getOsArch();
599 
600     /**
601      * A constant for the System Property {@code os.name}. Operating system name.
602      *
603      * <p>
604      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
605      * </p>
606      * <p>
607      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
608      * called after this class is loaded, the value will be out of sync with that System property.
609      * </p>
610      *
611      * @see SystemProperties#getOsName()
612      * @since Java 1.1
613      */
614     public static final String OS_NAME = SystemProperties.getOsName();
615 
616     /**
617      * A constant for the System Property {@code os.version}. Operating system version.
618      *
619      * <p>
620      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
621      * </p>
622      * <p>
623      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
624      * called after this class is loaded, the value will be out of sync with that System property.
625      * </p>
626      *
627      * @see SystemProperties#getOsVersion()
628      * @since Java 1.1
629      */
630     public static final String OS_VERSION = SystemProperties.getOsVersion();
631 
632     /**
633      * A constant for the System Property {@code path.separator}. Path separator ({@code &quot;:&quot;} on Unix).
634      *
635      * <p>
636      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
637      * </p>
638      * <p>
639      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
640      * called after this class is loaded, the value will be out of sync with that System property.
641      * </p>
642      *
643      * @see SystemProperties#getPathSeparator()
644      * @since Java 1.1
645      * @deprecated Use {@link File#pathSeparator}, since it is guaranteed to be a string containing a single character and it does not require a privilege
646      *             check.
647      */
648     @Deprecated
649     public static final String PATH_SEPARATOR = SystemProperties.getPathSeparator();
650 
651     /**
652      * A constant for the System Property {@code user.country} or {@code user.region}. User's country code, such as {@code "GB"}. First in Java version 1.2 as
653      * {@code user.region}. Renamed to {@code user.country} in 1.4
654      *
655      * <p>
656      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
657      * </p>
658      * <p>
659      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
660      * called after this class is loaded, the value will be out of sync with that System property.
661      * </p>
662      *
663      * @since 2.0
664      * @since Java 1.2
665      */
666     public static final String USER_COUNTRY = SystemProperties.getProperty(SystemProperties.USER_COUNTRY,
667             () -> SystemProperties.getProperty(SystemProperties.USER_REGION));
668 
669     /**
670      * A constant for the System Property {@code user.dir}. User's current working directory.
671      *
672      * <p>
673      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
674      * </p>
675      * <p>
676      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
677      * called after this class is loaded, the value will be out of sync with that System property.
678      * </p>
679      *
680      * @see SystemProperties#getUserDir()
681      * @since Java 1.1
682      */
683     public static final String USER_DIR = SystemProperties.getUserDir();
684 
685     /**
686      * A constant for the System Property {@code user.home}. User's home directory.
687      *
688      * <p>
689      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
690      * </p>
691      * <p>
692      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
693      * called after this class is loaded, the value will be out of sync with that System property.
694      * </p>
695      *
696      * @see SystemProperties#getUserHome()
697      * @since Java 1.1
698      */
699     public static final String USER_HOME = SystemProperties.getUserHome();
700 
701     /**
702      * A constant for the System Property {@code user.language}. User's language code, such as {@code "en"}.
703      *
704      * <p>
705      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
706      * </p>
707      * <p>
708      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
709      * called after this class is loaded, the value will be out of sync with that System property.
710      * </p>
711      *
712      * @see SystemProperties#getUserLanguage()
713      * @since 2.0
714      * @since Java 1.2
715      */
716     public static final String USER_LANGUAGE = SystemProperties.getUserLanguage();
717 
718     /**
719      * A constant for the System Property {@code user.name}. User's account name.
720      *
721      * <p>
722      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
723      * </p>
724      * <p>
725      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
726      * called after this class is loaded, the value will be out of sync with that System property.
727      * </p>
728      *
729      * @see SystemProperties#getUserName()
730      * @since Java 1.1
731      */
732     public static final String USER_NAME = SystemProperties.getUserName();
733 
734     /**
735      * A constant for the System Property {@code user.timezone}. For example: {@code "America/Los_Angeles"}.
736      *
737      * <p>
738      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
739      * </p>
740      * <p>
741      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
742      * called after this class is loaded, the value will be out of sync with that System property.
743      * </p>
744      *
745      * @see SystemProperties#getUserTimezone()
746      * @since 2.1
747      */
748     public static final String USER_TIMEZONE = SystemProperties.getUserTimezone();
749 
750     // Java version checks
751     // -----------------------------------------------------------------------
752     // These MUST be declared after those above as they depend on the
753     // values being set up
754 
755     /**
756      * The constant {@code true} if this is Java version 1.1 (also 1.1.x versions).
757      * <p>
758      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
759      * </p>
760      * <p>
761      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
762      * </p>
763      * <p>
764      * This value is initialized when the class is loaded.
765      * </p>
766      */
767     public static final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1");
768 
769     /**
770      * The constant {@code true} if this is Java version 1.2 (also 1.2.x versions).
771      * <p>
772      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
773      * </p>
774      * <p>
775      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
776      * </p>
777      * <p>
778      * This value is initialized when the class is loaded.
779      * </p>
780      */
781     public static final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2");
782 
783     /**
784      * The constant {@code true} if this is Java version 1.3 (also 1.3.x versions).
785      * <p>
786      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
787      * </p>
788      * <p>
789      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
790      * </p>
791      * <p>
792      * This value is initialized when the class is loaded.
793      * </p>
794      */
795     public static final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3");
796 
797     /**
798      * The constant {@code true} if this is Java version 1.4 (also 1.4.x versions).
799      * <p>
800      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
801      * </p>
802      * <p>
803      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
804      * </p>
805      * <p>
806      * This value is initialized when the class is loaded.
807      * </p>
808      */
809     public static final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4");
810 
811     /**
812      * The constant {@code true} if this is Java version 1.5 (also 1.5.x versions).
813      * <p>
814      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
815      * </p>
816      * <p>
817      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
818      * </p>
819      * <p>
820      * This value is initialized when the class is loaded.
821      * </p>
822      */
823     public static final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5");
824 
825     /**
826      * The constant {@code true} if this is Java version 1.6 (also 1.6.x versions).
827      * <p>
828      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
829      * </p>
830      * <p>
831      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
832      * </p>
833      * <p>
834      * This value is initialized when the class is loaded.
835      * </p>
836      */
837     public static final boolean IS_JAVA_1_6 = getJavaVersionMatches("1.6");
838 
839     /**
840      * The constant {@code true} if this is Java version 1.7 (also 1.7.x versions).
841      * <p>
842      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
843      * </p>
844      * <p>
845      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
846      * </p>
847      * <p>
848      * This value is initialized when the class is loaded.
849      * </p>
850      *
851      * @since 3.0
852      */
853     public static final boolean IS_JAVA_1_7 = getJavaVersionMatches("1.7");
854 
855     /**
856      * The constant {@code true} if this is Java version 1.8 (also 1.8.x versions).
857      * <p>
858      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
859      * </p>
860      * <p>
861      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
862      * </p>
863      * <p>
864      * This value is initialized when the class is loaded.
865      * </p>
866      *
867      * @since 3.3.2
868      */
869     public static final boolean IS_JAVA_1_8 = getJavaVersionMatches("1.8");
870 
871     /**
872      * The constant {@code true} if this is Java version 1.9 (also 1.9.x versions).
873      * <p>
874      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
875      * </p>
876      * <p>
877      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
878      * </p>
879      * <p>
880      * This value is initialized when the class is loaded.
881      * </p>
882      *
883      * @since 3.4
884      * @deprecated As of release 3.5, replaced by {@link #IS_JAVA_9}.
885      */
886     @Deprecated
887     public static final boolean IS_JAVA_1_9 = getJavaVersionMatches("9");
888 
889     /**
890      * The constant {@code true} if this is Java version 9 (also 9.x versions).
891      * <p>
892      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
893      * </p>
894      * <p>
895      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
896      * </p>
897      * <p>
898      * This value is initialized when the class is loaded.
899      * </p>
900      *
901      * @since 3.5
902      */
903     public static final boolean IS_JAVA_9 = getJavaVersionMatches("9");
904 
905     /**
906      * The constant {@code true} if this is Java version 10 (also 10.x versions).
907      * <p>
908      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
909      * </p>
910      * <p>
911      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
912      * </p>
913      * <p>
914      * This value is initialized when the class is loaded.
915      * </p>
916      *
917      * @since 3.7
918      */
919     public static final boolean IS_JAVA_10 = getJavaVersionMatches("10");
920 
921     /**
922      * The constant {@code true} if this is Java version 11 (also 11.x versions).
923      * <p>
924      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
925      * </p>
926      * <p>
927      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
928      * </p>
929      * <p>
930      * This value is initialized when the class is loaded.
931      * </p>
932      *
933      * @since 3.8
934      */
935     public static final boolean IS_JAVA_11 = getJavaVersionMatches("11");
936 
937     /**
938      * The constant {@code true} if this is Java version 12 (also 12.x versions).
939      * <p>
940      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
941      * </p>
942      * <p>
943      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
944      * </p>
945      * <p>
946      * This value is initialized when the class is loaded.
947      * </p>
948      *
949      * @since 3.9
950      */
951     public static final boolean IS_JAVA_12 = getJavaVersionMatches("12");
952 
953     /**
954      * The constant {@code true} if this is Java version 13 (also 13.x versions).
955      * <p>
956      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
957      * </p>
958      * <p>
959      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
960      * </p>
961      * <p>
962      * This value is initialized when the class is loaded.
963      * </p>
964      *
965      * @since 3.9
966      */
967     public static final boolean IS_JAVA_13 = getJavaVersionMatches("13");
968 
969     /**
970      * The constant {@code true} if this is Java version 14 (also 14.x versions).
971      * <p>
972      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
973      * </p>
974      * <p>
975      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
976      * </p>
977      * <p>
978      * This value is initialized when the class is loaded.
979      * </p>
980      *
981      * @since 3.10
982      */
983     public static final boolean IS_JAVA_14 = getJavaVersionMatches("14");
984 
985     /**
986      * The constant {@code true} if this is Java version 15 (also 15.x versions).
987      * <p>
988      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
989      * </p>
990      * <p>
991      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
992      * </p>
993      * <p>
994      * This value is initialized when the class is loaded.
995      * </p>
996      *
997      * @since 3.10
998      */
999     public static final boolean IS_JAVA_15 = getJavaVersionMatches("15");
1000 
1001     /**
1002      * The constant {@code true} if this is Java version 16 (also 16.x versions).
1003      * <p>
1004      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1005      * </p>
1006      * <p>
1007      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1008      * </p>
1009      * <p>
1010      * This value is initialized when the class is loaded.
1011      * </p>
1012      *
1013      * @since 3.13.0
1014      */
1015     public static final boolean IS_JAVA_16 = getJavaVersionMatches("16");
1016 
1017     /**
1018      * The constant {@code true} if this is Java version 17 (also 17.x versions).
1019      * <p>
1020      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1021      * </p>
1022      * <p>
1023      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1024      * </p>
1025      * <p>
1026      * This value is initialized when the class is loaded.
1027      * </p>
1028      *
1029      * @since 3.13.0
1030      */
1031     public static final boolean IS_JAVA_17 = getJavaVersionMatches("17");
1032 
1033     /**
1034      * The constant {@code true} if this is Java version 18 (also 18.x versions).
1035      * <p>
1036      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1037      * </p>
1038      * <p>
1039      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1040      * </p>
1041      * <p>
1042      * This value is initialized when the class is loaded.
1043      * </p>
1044      *
1045      * @since 3.13.0
1046      */
1047     public static final boolean IS_JAVA_18 = getJavaVersionMatches("18");
1048 
1049     /**
1050      * The constant {@code true} if this is Java version 19 (also 19.x versions).
1051      * <p>
1052      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1053      * </p>
1054      * <p>
1055      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1056      * </p>
1057      * <p>
1058      * This value is initialized when the class is loaded.
1059      * </p>
1060      *
1061      * @since 3.13.0
1062      */
1063     public static final boolean IS_JAVA_19 = getJavaVersionMatches("19");
1064 
1065     /**
1066      * The constant {@code true} if this is Java version 20 (also 20.x versions).
1067      * <p>
1068      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1069      * </p>
1070      * <p>
1071      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1072      * </p>
1073      * <p>
1074      * This value is initialized when the class is loaded.
1075      * </p>
1076      *
1077      * @since 3.13.0
1078      */
1079     public static final boolean IS_JAVA_20 = getJavaVersionMatches("20");
1080 
1081     /**
1082      * The constant {@code true} if this is Java version 21 (also 21.x versions).
1083      * <p>
1084      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1085      * </p>
1086      * <p>
1087      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1088      * </p>
1089      * <p>
1090      * This value is initialized when the class is loaded.
1091      * </p>
1092      *
1093      * @since 3.13.0
1094      */
1095     public static final boolean IS_JAVA_21 = getJavaVersionMatches("21");
1096 
1097     /**
1098      * The constant {@code true} if this is Java version 22 (also 22.x versions).
1099      * <p>
1100      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1101      * </p>
1102      * <p>
1103      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1104      * </p>
1105      * <p>
1106      * This value is initialized when the class is loaded.
1107      * </p>
1108      *
1109      * @since 3.15.0
1110      */
1111     public static final boolean IS_JAVA_22 = getJavaVersionMatches("22");
1112 
1113     /**
1114      * The constant {@code true} if this is Java version 23 (also 23.x versions).
1115      * <p>
1116      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1117      * </p>
1118      * <p>
1119      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1120      * </p>
1121      * <p>
1122      * This value is initialized when the class is loaded.
1123      * </p>
1124      *
1125      * @since 3.18.0
1126      */
1127     public static final boolean IS_JAVA_23 = getJavaVersionMatches("23");
1128 
1129     /**
1130      * The constant {@code true} if this is Java version 24 (also 24.x versions).
1131      * <p>
1132      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1133      * </p>
1134      * <p>
1135      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1136      * </p>
1137      * <p>
1138      * This value is initialized when the class is loaded.
1139      * </p>
1140      *
1141      * @since 3.18.0
1142      */
1143     public static final boolean IS_JAVA_24 = getJavaVersionMatches("24");
1144 
1145     /**
1146      * The constant {@code true} if this is Java version 25 (also 25.x versions).
1147      * <p>
1148      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1149      * </p>
1150      * <p>
1151      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1152      * </p>
1153      * <p>
1154      * This value is initialized when the class is loaded.
1155      * </p>
1156      *
1157      * @since 3.20.0
1158      */
1159     public static final boolean IS_JAVA_25 = getJavaVersionMatches("25");
1160 
1161     /**
1162      * The constant {@code true} if this is Java version 26 (also 26.x versions).
1163      * <p>
1164      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1165      * </p>
1166      * <p>
1167      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1168      * </p>
1169      * <p>
1170      * This value is initialized when the class is loaded.
1171      * </p>
1172      *
1173      * @since 3.20.0
1174      */
1175     public static final boolean IS_JAVA_26 = getJavaVersionMatches("26");
1176 
1177     /**
1178      * The constant {@code true} if this is Java version 27 (also 27.x versions).
1179      * <p>
1180      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1181      * </p>
1182      * <p>
1183      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1184      * </p>
1185      * <p>
1186      * This value is initialized when the class is loaded.
1187      * </p>
1188      *
1189      * @since 3.21.0
1190      */
1191     public static final boolean IS_JAVA_27 = getJavaVersionMatches("27");
1192 
1193     // Operating system checks
1194     // -----------------------------------------------------------------------
1195     // These MUST be declared after those above as they depend on the
1196     // values being set up
1197     // Please advise dev@commons.apache.org if you want another added
1198     // or a mistake corrected
1199 
1200     /**
1201      * The constant {@code true} if this is AIX.
1202      * <p>
1203      * The result depends on the value of the {@link #OS_NAME} constant.
1204      * </p>
1205      * <p>
1206      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1207      * </p>
1208      * <p>
1209      * This value is initialized when the class is loaded.
1210      * </p>
1211      *
1212      * @since 2.0
1213      */
1214     public static final boolean IS_OS_AIX = getOsNameMatches("AIX");
1215 
1216     /**
1217      * The constant {@code true} if this is Android.
1218      *
1219      * <p>
1220      * See https://developer.android.com/reference/java/lang/System#getProperties().
1221      * </p>
1222      * <p>
1223      * This value is initialized when the class is loaded.
1224      * </p>
1225      *
1226      * @since 3.15.0
1227      */
1228     public static final boolean IS_OS_ANDROID = Strings.CS.contains(SystemProperties.getJavaVendor(), "Android");
1229 
1230     /**
1231      * The constant {@code true} if this is HP-UX.
1232      * <p>
1233      * The result depends on the value of the {@link #OS_NAME} constant.
1234      * </p>
1235      * <p>
1236      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1237      * </p>
1238      * <p>
1239      * This value is initialized when the class is loaded.
1240      * </p>
1241      *
1242      * @since 2.0
1243      */
1244     public static final boolean IS_OS_HP_UX = getOsNameMatches("HP-UX");
1245 
1246     /**
1247      * The constant {@code true} if this is IBM OS/400.
1248      * <p>
1249      * The result depends on the value of the {@link #OS_NAME} constant.
1250      * </p>
1251      * <p>
1252      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1253      * </p>
1254      * <p>
1255      * This value is initialized when the class is loaded.
1256      * </p>
1257      *
1258      * @since 3.3
1259      */
1260     public static final boolean IS_OS_400 = getOsNameMatches("OS/400");
1261 
1262     /**
1263      * The constant {@code true} if this is Irix.
1264      * <p>
1265      * The result depends on the value of the {@link #OS_NAME} constant.
1266      * </p>
1267      * <p>
1268      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1269      * </p>
1270      * <p>
1271      * This value is initialized when the class is loaded.
1272      * </p>
1273      *
1274      * @since 2.0
1275      */
1276     public static final boolean IS_OS_IRIX = getOsNameMatches("Irix");
1277 
1278     /**
1279      * The constant {@code true} if this is Linux.
1280      * <p>
1281      * The result depends on the value of the {@link #OS_NAME} constant.
1282      * </p>
1283      * <p>
1284      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1285      * </p>
1286      * <p>
1287      * This value is initialized when the class is loaded.
1288      * </p>
1289      *
1290      * @since 2.0
1291      */
1292     public static final boolean IS_OS_LINUX = getOsNameMatches("Linux");
1293 
1294     /**
1295      * The constant {@code true} if this is Mac.
1296      * <p>
1297      * The result depends on the value of the {@link #OS_NAME} constant.
1298      * </p>
1299      * <p>
1300      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1301      * </p>
1302      * <p>
1303      * This value is initialized when the class is loaded.
1304      * </p>
1305      *
1306      * @since 2.0
1307      */
1308     public static final boolean IS_OS_MAC = getOsNameMatches("Mac");
1309 
1310     /**
1311      * The constant {@code true} if this is Mac.
1312      * <p>
1313      * The result depends on the value of the {@link #OS_NAME} constant.
1314      * </p>
1315      * <p>
1316      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1317      * </p>
1318      * <p>
1319      * This value is initialized when the class is loaded.
1320      * </p>
1321      *
1322      * @since 2.0
1323      */
1324     public static final boolean IS_OS_MAC_OSX = getOsNameMatches("Mac OS X");
1325 
1326     /**
1327      * The constant {@code true} if this is macOS X Cheetah.
1328      * <p>
1329      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1330      * </p>
1331      * <p>
1332      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1333      * </p>
1334      * <p>
1335      * This value is initialized when the class is loaded.
1336      * </p>
1337      *
1338      * @since 3.4
1339      */
1340     public static final boolean IS_OS_MAC_OSX_CHEETAH = getOsMatches("Mac OS X", "10.0");
1341 
1342     /**
1343      * The constant {@code true} if this is macOS X Puma.
1344      * <p>
1345      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1346      * </p>
1347      * <p>
1348      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1349      * </p>
1350      * <p>
1351      * This value is initialized when the class is loaded.
1352      * </p>
1353      *
1354      * @since 3.4
1355      */
1356     public static final boolean IS_OS_MAC_OSX_PUMA = getOsMatches("Mac OS X", "10.1");
1357 
1358     /**
1359      * The constant {@code true} if this is macOS X Jaguar.
1360      * <p>
1361      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1362      * </p>
1363      * <p>
1364      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1365      * </p>
1366      * <p>
1367      * This value is initialized when the class is loaded.
1368      * </p>
1369      *
1370      * @since 3.4
1371      */
1372     public static final boolean IS_OS_MAC_OSX_JAGUAR = getOsMatches("Mac OS X", "10.2");
1373 
1374     /**
1375      * The constant {@code true} if this is macOS X Panther.
1376      * <p>
1377      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1378      * </p>
1379      * <p>
1380      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1381      * </p>
1382      * <p>
1383      * This value is initialized when the class is loaded.
1384      * </p>
1385      *
1386      * @since 3.4
1387      */
1388     public static final boolean IS_OS_MAC_OSX_PANTHER = getOsMatches("Mac OS X", "10.3");
1389 
1390     /**
1391      * The constant {@code true} if this is macOS X Tiger.
1392      * <p>
1393      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1394      * </p>
1395      * <p>
1396      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1397      * </p>
1398      * <p>
1399      * This value is initialized when the class is loaded.
1400      * </p>
1401      *
1402      * @since 3.4
1403      */
1404     public static final boolean IS_OS_MAC_OSX_TIGER = getOsMatches("Mac OS X", "10.4");
1405 
1406     /**
1407      * The constant {@code true} if this is macOS X Leopard.
1408      * <p>
1409      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1410      * </p>
1411      * <p>
1412      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1413      * </p>
1414      * <p>
1415      * This value is initialized when the class is loaded.
1416      * </p>
1417      *
1418      * @since 3.4
1419      */
1420     public static final boolean IS_OS_MAC_OSX_LEOPARD = getOsMatches("Mac OS X", "10.5");
1421 
1422     /**
1423      * The constant {@code true} if this is macOS X Snow Leopard.
1424      * <p>
1425      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1426      * </p>
1427      * <p>
1428      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1429      * </p>
1430      * <p>
1431      * This value is initialized when the class is loaded.
1432      * </p>
1433      *
1434      * @since 3.4
1435      */
1436     public static final boolean IS_OS_MAC_OSX_SNOW_LEOPARD = getOsMatches("Mac OS X", "10.6");
1437 
1438     /**
1439      * The constant {@code true} if this is macOS X Lion.
1440      * <p>
1441      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1442      * </p>
1443      * <p>
1444      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1445      * </p>
1446      * <p>
1447      * This value is initialized when the class is loaded.
1448      * </p>
1449      *
1450      * @since 3.4
1451      */
1452     public static final boolean IS_OS_MAC_OSX_LION = getOsMatches("Mac OS X", "10.7");
1453 
1454     /**
1455      * The constant {@code true} if this is macOS X Mountain Lion.
1456      * <p>
1457      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1458      * </p>
1459      * <p>
1460      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1461      * </p>
1462      * <p>
1463      * This value is initialized when the class is loaded.
1464      * </p>
1465      *
1466      * @since 3.4
1467      */
1468     public static final boolean IS_OS_MAC_OSX_MOUNTAIN_LION = getOsMatches("Mac OS X", "10.8");
1469 
1470     /**
1471      * The constant {@code true} if this is macOS X Mavericks.
1472      * <p>
1473      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1474      * </p>
1475      * <p>
1476      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1477      * </p>
1478      * <p>
1479      * This value is initialized when the class is loaded.
1480      * </p>
1481      *
1482      * @since 3.4
1483      */
1484     public static final boolean IS_OS_MAC_OSX_MAVERICKS = getOsMatches("Mac OS X", "10.9");
1485 
1486     /**
1487      * The constant {@code true} if this is macOS X Yosemite.
1488      * <p>
1489      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1490      * </p>
1491      * <p>
1492      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1493      * </p>
1494      * <p>
1495      * This value is initialized when the class is loaded.
1496      * </p>
1497      *
1498      * @since 3.4
1499      */
1500     public static final boolean IS_OS_MAC_OSX_YOSEMITE = getOsMatches("Mac OS X", "10.10");
1501 
1502     /**
1503      * The constant {@code true} if this is macOS X El Capitan.
1504      * <p>
1505      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1506      * </p>
1507      * <p>
1508      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1509      * </p>
1510      * <p>
1511      * This value is initialized when the class is loaded.
1512      * </p>
1513      *
1514      * @since 3.5
1515      */
1516     public static final boolean IS_OS_MAC_OSX_EL_CAPITAN = getOsMatches("Mac OS X", "10.11");
1517 
1518     /**
1519      * The constant {@code true} if this is macOS X Sierra.
1520      * <p>
1521      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1522      * </p>
1523      * <p>
1524      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1525      * </p>
1526      * <p>
1527      * This value is initialized when the class is loaded.
1528      * </p>
1529      *
1530      * @since 3.12.0
1531      */
1532     public static final boolean IS_OS_MAC_OSX_SIERRA = getOsMatches("Mac OS X", "10.12");
1533 
1534     /**
1535      * The constant {@code true} if this is macOS X High Sierra.
1536      * <p>
1537      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1538      * </p>
1539      * <p>
1540      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1541      * </p>
1542      * <p>
1543      * This value is initialized when the class is loaded.
1544      * </p>
1545      *
1546      * @since 3.12.0
1547      */
1548     public static final boolean IS_OS_MAC_OSX_HIGH_SIERRA = getOsMatches("Mac OS X", "10.13");
1549 
1550     /**
1551      * The constant {@code true} if this is macOS X Mojave.
1552      * <p>
1553      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1554      * </p>
1555      * <p>
1556      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1557      * </p>
1558      * <p>
1559      * This value is initialized when the class is loaded.
1560      * </p>
1561      *
1562      * @since 3.12.0
1563      */
1564     public static final boolean IS_OS_MAC_OSX_MOJAVE = getOsMatches("Mac OS X", "10.14");
1565 
1566     /**
1567      * The constant {@code true} if this is macOS X Catalina.
1568      *
1569      * <p>
1570      * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1571      * </p>
1572      * <p>
1573      * This value is initialized when the class is loaded.
1574      * </p>
1575      *
1576      * @since 3.12.0
1577      */
1578     public static final boolean IS_OS_MAC_OSX_CATALINA = getOsMatches("Mac OS X", "10.15");
1579 
1580     /**
1581      * The constant {@code true} if this is macOS X Big Sur.
1582      * <p>
1583      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1584      * </p>
1585      * <p>
1586      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1587      * </p>
1588      * <p>
1589      * This value is initialized when the class is loaded.
1590      * </p>
1591      *
1592      * @since 3.12.0
1593      */
1594     public static final boolean IS_OS_MAC_OSX_BIG_SUR = getOsMatches("Mac OS X", "11");
1595 
1596     /**
1597      * The constant {@code true} if this is macOS X Monterey.
1598      * <p>
1599      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1600      * </p>
1601      * <p>
1602      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1603      * </p>
1604      * <p>
1605      * This value is initialized when the class is loaded.
1606      * </p>
1607      *
1608      * @since 3.13.0
1609      */
1610     public static final boolean IS_OS_MAC_OSX_MONTEREY = getOsMatches("Mac OS X", "12");
1611 
1612     /**
1613      * The constant {@code true} if this is macOS X Ventura.
1614      * <p>
1615      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1616      * </p>
1617      * <p>
1618      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1619      * </p>
1620      * <p>
1621      * This value is initialized when the class is loaded.
1622      * </p>
1623      *
1624      * @since 3.13.0
1625      */
1626     public static final boolean IS_OS_MAC_OSX_VENTURA = getOsMatches("Mac OS X", "13");
1627 
1628     /**
1629      * The constant {@code true} if this is macOS X Sonoma.
1630      * <p>
1631      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1632      * </p>
1633      * <p>
1634      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1635      * </p>
1636      * <p>
1637      * This value is initialized when the class is loaded.
1638      * </p>
1639      *
1640      * @since 3.15.0
1641      */
1642     public static final boolean IS_OS_MAC_OSX_SONOMA = getOsMatches("Mac OS X", "14");
1643 
1644     /**
1645      * The constant {@code true} if this is macOS X Sequoia.
1646      * <p>
1647      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1648      * </p>
1649      * <p>
1650      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1651      * </p>
1652      * <p>
1653      * This value is initialized when the class is loaded.
1654      * </p>
1655      *
1656      * @since 3.18.0
1657      */
1658     public static final boolean IS_OS_MAC_OSX_SEQUOIA = getOsMatches("Mac OS X", "15");
1659 
1660     /**
1661      * The constant {@code true} if this is FreeBSD.
1662      * <p>
1663      * The result depends on the value of the {@link #OS_NAME} constant.
1664      * </p>
1665      * <p>
1666      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1667      * </p>
1668      * <p>
1669      * This value is initialized when the class is loaded.
1670      * </p>
1671      *
1672      * @since 3.1
1673      */
1674     public static final boolean IS_OS_FREE_BSD = getOsNameMatches("FreeBSD");
1675 
1676     /**
1677      * The constant {@code true} if this is OpenBSD.
1678      * <p>
1679      * The result depends on the value of the {@link #OS_NAME} constant.
1680      * </p>
1681      * <p>
1682      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1683      * </p>
1684      * <p>
1685      * This value is initialized when the class is loaded.
1686      * </p>
1687      *
1688      * @since 3.1
1689      */
1690     public static final boolean IS_OS_OPEN_BSD = getOsNameMatches("OpenBSD");
1691 
1692     /**
1693      * The constant {@code true} if this is NetBSD.
1694      * <p>
1695      * The result depends on the value of the {@link #OS_NAME} constant.
1696      * </p>
1697      * <p>
1698      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1699      * </p>
1700      * <p>
1701      * This value is initialized when the class is loaded.
1702      * </p>
1703      *
1704      * @since 3.1
1705      */
1706     public static final boolean IS_OS_NET_BSD = getOsNameMatches("NetBSD");
1707 
1708     /**
1709      * The constant {@code true} if this is Netware.
1710      * <p>
1711      * The result depends on the value of the {@link #OS_NAME} constant.
1712      * </p>
1713      * <p>
1714      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1715      * </p>
1716      * <p>
1717      * This value is initialized when the class is loaded.
1718      * </p>
1719      *
1720      * @since 3.19.0
1721      */
1722     public static final boolean IS_OS_NETWARE = getOsNameMatches("Netware");
1723 
1724     /**
1725      * The constant {@code true} if this is OS/2.
1726      * <p>
1727      * The result depends on the value of the {@link #OS_NAME} constant.
1728      * </p>
1729      * <p>
1730      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1731      * </p>
1732      * <p>
1733      * This value is initialized when the class is loaded.
1734      * </p>
1735      *
1736      * @since 2.0
1737      */
1738     public static final boolean IS_OS_OS2 = getOsNameMatches("OS/2");
1739 
1740     /**
1741      * The constant {@code true} if this is Solaris.
1742      * <p>
1743      * The result depends on the value of the {@link #OS_NAME} constant.
1744      * </p>
1745      * <p>
1746      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1747      * </p>
1748      * <p>
1749      * This value is initialized when the class is loaded.
1750      * </p>
1751      *
1752      * @since 2.0
1753      */
1754     public static final boolean IS_OS_SOLARIS = getOsNameMatches("Solaris");
1755 
1756     /**
1757      * The constant {@code true} if this is SunOS.
1758      * <p>
1759      * The result depends on the value of the {@link #OS_NAME} constant.
1760      * </p>
1761      * <p>
1762      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1763      * </p>
1764      * <p>
1765      * This value is initialized when the class is loaded.
1766      * </p>
1767      *
1768      * @since 2.0
1769      */
1770     public static final boolean IS_OS_SUN_OS = getOsNameMatches("SunOS");
1771 
1772     /**
1773      * The constant {@code true} if this is a Unix like system, as in any of AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS.
1774      *
1775      * <p>
1776      * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1777      * </p>
1778      * <p>
1779      * This value is initialized when the class is loaded.
1780      * </p>
1781      *
1782      * @since 2.1
1783      */
1784     public static final boolean IS_OS_UNIX = IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX || IS_OS_MAC_OSX || IS_OS_SOLARIS || IS_OS_SUN_OS
1785             || IS_OS_FREE_BSD || IS_OS_OPEN_BSD || IS_OS_NET_BSD;
1786 
1787     /**
1788      * The constant {@code true} if this is Windows.
1789      * <p>
1790      * The result depends on the value of the {@link #OS_NAME} constant.
1791      * </p>
1792      * <p>
1793      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1794      * </p>
1795      * <p>
1796      * This value is initialized when the class is loaded.
1797      * </p>
1798      *
1799      * @since 2.0
1800      */
1801     public static final boolean IS_OS_WINDOWS = getOsNameMatches(OS_NAME_WINDOWS_PREFIX);
1802 
1803     /**
1804      * The constant {@code true} if this is Windows 2000.
1805      * <p>
1806      * The result depends on the value of the {@link #OS_NAME} constant.
1807      * </p>
1808      * <p>
1809      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1810      * </p>
1811      * <p>
1812      * This value is initialized when the class is loaded.
1813      * </p>
1814      *
1815      * @since 2.0
1816      */
1817     public static final boolean IS_OS_WINDOWS_2000 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 2000");
1818 
1819     /**
1820      * The constant {@code true} if this is Windows 2003.
1821      * <p>
1822      * The result depends on the value of the {@link #OS_NAME} constant.
1823      * </p>
1824      * <p>
1825      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1826      * </p>
1827      * <p>
1828      * This value is initialized when the class is loaded.
1829      * </p>
1830      *
1831      * @since 3.1
1832      */
1833     public static final boolean IS_OS_WINDOWS_2003 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 2003");
1834 
1835     /**
1836      * The constant {@code true} if this is Windows Server 2008.
1837      * <p>
1838      * The result depends on the value of the {@link #OS_NAME} constant.
1839      * </p>
1840      * <p>
1841      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1842      * </p>
1843      * <p>
1844      * This value is initialized when the class is loaded.
1845      * </p>
1846      *
1847      * @since 3.1
1848      */
1849     public static final boolean IS_OS_WINDOWS_2008 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Server 2008");
1850 
1851     /**
1852      * The constant {@code true} if this is Windows Server 2012.
1853      * <p>
1854      * The result depends on the value of the {@link #OS_NAME} constant.
1855      * </p>
1856      * <p>
1857      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1858      * </p>
1859      * <p>
1860      * This value is initialized when the class is loaded.
1861      * </p>
1862      *
1863      * @since 3.4
1864      */
1865     public static final boolean IS_OS_WINDOWS_2012 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Server 2012");
1866 
1867     /**
1868      * The constant {@code true} if this is Windows 95.
1869      * <p>
1870      * The result depends on the value of the {@link #OS_NAME} constant.
1871      * </p>
1872      * <p>
1873      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1874      * </p>
1875      * <p>
1876      * This value is initialized when the class is loaded.
1877      * </p>
1878      *
1879      * @since 2.0
1880      */
1881     public static final boolean IS_OS_WINDOWS_95 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 95");
1882 
1883     /**
1884      * The constant {@code true} if this is Windows 98.
1885      * <p>
1886      * The result depends on the value of the {@link #OS_NAME} constant.
1887      * </p>
1888      * <p>
1889      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1890      * </p>
1891      * <p>
1892      * This value is initialized when the class is loaded.
1893      * </p>
1894      *
1895      * @since 2.0
1896      */
1897     public static final boolean IS_OS_WINDOWS_98 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 98");
1898 
1899     /**
1900      * The constant {@code true} if this is Windows ME.
1901      * <p>
1902      * The result depends on the value of the {@link #OS_NAME} constant.
1903      * </p>
1904      * <p>
1905      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1906      * </p>
1907      * <p>
1908      * This value is initialized when the class is loaded.
1909      * </p>
1910      *
1911      * @since 2.0
1912      */
1913     public static final boolean IS_OS_WINDOWS_ME = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Me");
1914 
1915     /**
1916      * The constant {@code true} if this is Windows NT.
1917      * <p>
1918      * The result depends on the value of the {@link #OS_NAME} constant.
1919      * </p>
1920      * <p>
1921      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1922      * </p>
1923      * <p>
1924      * This value is initialized when the class is loaded.
1925      * </p>
1926      *
1927      * @since 2.0
1928      */
1929     public static final boolean IS_OS_WINDOWS_NT = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " NT");
1930 
1931     /**
1932      * The constant {@code true} if this is Windows XP.
1933      * <p>
1934      * The result depends on the value of the {@link #OS_NAME} constant.
1935      * </p>
1936      * <p>
1937      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1938      * </p>
1939      * <p>
1940      * This value is initialized when the class is loaded.
1941      * </p>
1942      *
1943      * @since 2.0
1944      */
1945     public static final boolean IS_OS_WINDOWS_XP = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " XP");
1946 
1947     /**
1948      * The constant {@code true} if this is Windows Vista.
1949      * <p>
1950      * The result depends on the value of the {@link #OS_NAME} constant.
1951      * </p>
1952      * <p>
1953      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1954      * </p>
1955      * <p>
1956      * This value is initialized when the class is loaded.
1957      * </p>
1958      *
1959      * @since 2.4
1960      */
1961     public static final boolean IS_OS_WINDOWS_VISTA = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Vista");
1962 
1963     /**
1964      * The constant {@code true} if this is Windows 7.
1965      * <p>
1966      * The result depends on the value of the {@link #OS_NAME} constant.
1967      * </p>
1968      * <p>
1969      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1970      * </p>
1971      * <p>
1972      * This value is initialized when the class is loaded.
1973      * </p>
1974      *
1975      * @since 3.0
1976      */
1977     public static final boolean IS_OS_WINDOWS_7 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 7");
1978 
1979     /**
1980      * The constant {@code true} if this is Windows 8.
1981      * <p>
1982      * The result depends on the value of the {@link #OS_NAME} constant.
1983      * </p>
1984      * <p>
1985      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1986      * </p>
1987      * <p>
1988      * This value is initialized when the class is loaded.
1989      * </p>
1990      *
1991      * @since 3.2
1992      */
1993     public static final boolean IS_OS_WINDOWS_8 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 8");
1994 
1995     /**
1996      * The constant {@code true} if this is Windows 10.
1997      * <p>
1998      * The result depends on the value of the {@link #OS_NAME} constant.
1999      * </p>
2000      * <p>
2001      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
2002      * </p>
2003      * <p>
2004      * This value is initialized when the class is loaded.
2005      * </p>
2006      *
2007      * @since 3.5
2008      */
2009     public static final boolean IS_OS_WINDOWS_10 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 10");
2010 
2011     /**
2012      * The constant {@code true} if this is Windows 11.
2013      * <p>
2014      * The result depends on the value of the {@link #OS_NAME} constant.
2015      * </p>
2016      * <p>
2017      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
2018      * </p>
2019      * <p>
2020      * OpenJDK fixed the return value for {@code os.name} on Windows 11 to versions 8, 11, and 17:
2021      * </p>
2022      * <ul>
2023      * <li>Affects Java versions 7u321, 8u311, 11.0.13-oracle, 17.0.1: https://bugs.openjdk.org/browse/JDK-8274737</li>
2024      * <li>Fixed in OpenJDK commit https://github.com/openjdk/jdk/commit/97ea9dd2f24f9f1fb9b9345a4202a825ee28e014</li>
2025      * </ul>
2026      * <p>
2027      * This value is initialized when the class is loaded.
2028      * </p>
2029      *
2030      * @since 3.13.0
2031      */
2032     public static final boolean IS_OS_WINDOWS_11 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 11");
2033 
2034     /**
2035      * The constant {@code true} if this is z/OS.
2036      * <p>
2037      * The result depends on the value of the {@link #OS_NAME} constant.
2038      * </p>
2039      * <p>
2040      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
2041      * </p>
2042      * <p>
2043      * This value is initialized when the class is loaded.
2044      * </p>
2045      *
2046      * @since 3.5
2047      */
2048     // Values on a z/OS system I tested (Gary Gregory - 2016-03-12)
2049     // os.arch = s390x
2050     // os.encoding = ISO8859_1
2051     // os.name = z/OS
2052     // os.version = 02.02.00
2053     public static final boolean IS_OS_ZOS = getOsNameMatches("z/OS");
2054 
2055     /**
2056      * The System property key for the user home directory.
2057      */
2058     public static final String USER_HOME_KEY = "user.home";
2059 
2060     /**
2061      * The System property key for the user name.
2062      *
2063      * @deprecated Use {@link SystemProperties#USER_NAME}.
2064      */
2065     @Deprecated
2066     public static final String USER_NAME_KEY = "user.name";
2067 
2068     /**
2069      * The System property key for the user directory.
2070      *
2071      * @deprecated Use {@link SystemProperties#USER_DIR}.
2072      */
2073     @Deprecated
2074     public static final String USER_DIR_KEY = "user.dir";
2075 
2076     /**
2077      * The System property key for the Java IO temporary directory.
2078      *
2079      * @deprecated Use {@link SystemProperties#JAVA_IO_TMPDIR}.
2080      */
2081     @Deprecated
2082     public static final String JAVA_IO_TMPDIR_KEY = "java.io.tmpdir";
2083 
2084     /**
2085      * The System property key for the Java home directory.
2086      *
2087      * @deprecated Use {@link SystemProperties#JAVA_HOME}.
2088      */
2089     @Deprecated
2090     public static final String JAVA_HOME_KEY = "java.home";
2091 
2092     /**
2093      * A constant for the System Property {@code awt.toolkit}.
2094      *
2095      * <p>
2096      * Holds a class name, on Windows XP this is {@code sun.awt.windows.WToolkit}.
2097      * </p>
2098      * <p>
2099      * <strong>On platforms without a GUI, this value is {@code null}.</strong>
2100      * </p>
2101      * <p>
2102      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
2103      * </p>
2104      * <p>
2105      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
2106      * called after this class is loaded, the value will be out of sync with that System property.
2107      * </p>
2108      *
2109      * @since 2.1
2110      * @see SystemProperties#getAwtToolkit()
2111      * @deprecated Deprecated without replacement.
2112      */
2113     @Deprecated
2114     public static final String AWT_TOOLKIT = SystemProperties.getAwtToolkit();
2115 
2116     /**
2117      * Gets an environment variable, defaulting to {@code defaultValue} if the variable cannot be read.
2118      *
2119      * <p>
2120      * If a {@link SecurityException} is caught, the return value is {@code defaultValue} and a message is written to {@code System.err}.
2121      * </p>
2122      *
2123      * @param name         the environment variable name.
2124      * @param defaultValue the default value.
2125      * @return the environment variable value or {@code defaultValue} if a security problem occurs.
2126      * @since 3.8
2127      */
2128     public static String getEnvironmentVariable(final String name, final String defaultValue) {
2129         try {
2130             final String value = System.getenv(name);
2131             return value == null ? defaultValue : value;
2132         } catch (final SecurityException ex) {
2133             // we are not allowed to look at this property
2134             // System.err.println("Caught a SecurityException reading the environment variable '" + name + "'.");
2135             return defaultValue;
2136         }
2137     }
2138 
2139     /**
2140      * Gets the host name from an environment variable ({@code COMPUTERNAME} on Windows, {@code HOSTNAME} elsewhere).
2141      *
2142      * <p>
2143      * If you want to know what the network stack says is the host name, you should use {@code InetAddress.getLocalHost().getHostName()}.
2144      * </p>
2145      *
2146      * @return the host name. Will be {@code null} if the environment variable is not defined.
2147      * @since 3.6
2148      */
2149     public static String getHostName() {
2150         return IS_OS_WINDOWS ? System.getenv("COMPUTERNAME") : System.getenv("HOSTNAME");
2151     }
2152 
2153     /**
2154      * Gets the current Java home directory as a {@link File}.
2155      *
2156      * @return a directory.
2157      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2158      * @see SystemProperties#getJavaHome()
2159      * @since 2.1
2160      */
2161     public static File getJavaHome() {
2162         return new File(SystemProperties.getJavaHome());
2163     }
2164 
2165     /**
2166      * Gets the current Java home directory as a {@link File}.
2167      *
2168      * @return a directory.
2169      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2170      * @see SystemProperties#getJavaHome()
2171      * @since 3.18.0
2172      */
2173     public static Path getJavaHomePath() {
2174         return Paths.get(SystemProperties.getJavaHome());
2175     }
2176 
2177     /**
2178      * Gets the current Java IO temporary directory as a {@link File}.
2179      *
2180      * @return a directory.
2181      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2182      * @see SystemProperties#getJavaIoTmpdir()
2183      * @since 2.1
2184      */
2185     public static File getJavaIoTmpDir() {
2186         return new File(SystemProperties.getJavaIoTmpdir());
2187     }
2188 
2189     /**
2190      * Gets the current Java IO temporary directory as a {@link Path}.
2191      *
2192      * @return a directory.
2193      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2194      * @see SystemProperties#getJavaIoTmpdir()
2195      * @since 3.18.0
2196      */
2197     public static Path getJavaIoTmpDirPath() {
2198         return Paths.get(SystemProperties.getJavaIoTmpdir());
2199     }
2200 
2201     /**
2202      * Tests if the Java version matches the version we are running.
2203      * <p>
2204      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
2205      * </p>
2206      *
2207      * @param versionPrefix the prefix for the Java version.
2208      * @return true if matches, or false if not or can't determine.
2209      */
2210     private static boolean getJavaVersionMatches(final String versionPrefix) {
2211         return isJavaVersionMatch(JAVA_SPECIFICATION_VERSION, versionPrefix);
2212     }
2213 
2214     /**
2215      * Tests if the operating system matches the given name prefix and version prefix.
2216      * <p>
2217      * The result depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
2218      * </p>
2219      * <p>
2220      * The method returns {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
2221      * </p>
2222      *
2223      * @param osNamePrefix    the prefix for the OS name.
2224      * @param osVersionPrefix the prefix for the version.
2225      * @return true if matches, or false if not or can't determine.
2226      */
2227     private static boolean getOsMatches(final String osNamePrefix, final String osVersionPrefix) {
2228         return isOsMatch(OS_NAME, OS_VERSION, osNamePrefix, osVersionPrefix);
2229     }
2230 
2231     /**
2232      * Tests if the operating system matches the given string with a case-insensitive comparison.
2233      * <p>
2234      * The result depends on the value of the {@link #OS_NAME} constant.
2235      * </p>
2236      * <p>
2237      * The method returns {@code false} if {@link #OS_NAME} is {@code null}.
2238      * </p>
2239      *
2240      * @param osNamePrefix the prefix for the OS name.
2241      * @return true if matches, or false if not or can't determine.
2242      */
2243     private static boolean getOsNameMatches(final String osNamePrefix) {
2244         return isOsNameMatch(OS_NAME, osNamePrefix);
2245     }
2246 
2247     /**
2248      * Gets the current user directory as a {@link File}.
2249      * <p>
2250      * The result is based on the system property {@value SystemProperties#USER_DIR}.
2251      * </p>
2252      *
2253      * @return a directory.
2254      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2255      * @see SystemProperties#getUserDir()
2256      * @since 2.1
2257      */
2258     public static File getUserDir() {
2259         return new File(SystemProperties.getUserDir());
2260     }
2261 
2262     /**
2263      * Gets the current user directory as a {@link Path}.
2264      * <p>
2265      * The result is based on the system property {@value SystemProperties#USER_DIR}.
2266      * </p>
2267      *
2268      * @return a directory.
2269      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2270      * @see SystemProperties#getUserDir()
2271      * @since 3.18.0
2272      */
2273     public static Path getUserDirPath() {
2274         return Paths.get(SystemProperties.getUserDir());
2275     }
2276 
2277     /**
2278      * Gets the current user home directory as a {@link File}.
2279      * <p>
2280      * The result is based on the system property {@value SystemProperties#USER_HOME}.
2281      * </p>
2282      *
2283      * @return a directory.
2284      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2285      * @see SystemProperties#getUserHome()
2286      * @since 2.1
2287      */
2288     public static File getUserHome() {
2289         return new File(SystemProperties.getUserHome());
2290     }
2291 
2292     /**
2293      * Gets the current user home directory as a {@link Path}.
2294      * <p>
2295      * The result is based on the system property {@value SystemProperties#USER_HOME}.
2296      * </p>
2297      *
2298      * @return a directory.
2299      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2300      * @see SystemProperties#getUserHome()
2301      * @since 3.18.0
2302      */
2303     public static Path getUserHomePath() {
2304         return Paths.get(SystemProperties.getUserHome());
2305     }
2306 
2307     /**
2308      * Gets the current user name.
2309      * <p>
2310      * The result is based on the system property {@value SystemProperties#USER_NAME}.
2311      * </p>
2312      *
2313      * @return a name.
2314      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2315      * @see SystemProperties#getUserName()
2316      * @since 3.10
2317      * @deprecated Use {@link SystemProperties#getUserName()}.
2318      */
2319     @Deprecated
2320     public static String getUserName() {
2321         return SystemProperties.getUserName();
2322     }
2323 
2324     /**
2325      * Gets the user name.
2326      * <p>
2327      * The result is based on the system property {@value SystemProperties#USER_NAME}.
2328      * </p>
2329      *
2330      * @param defaultValue A default value.
2331      * @return a name.
2332      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2333      * @see SystemProperties#getUserName()
2334      * @since 3.10
2335      * @deprecated Use {@link SystemProperties#getUserName(String)}.
2336      */
2337     @Deprecated
2338     public static String getUserName(final String defaultValue) {
2339         return SystemProperties.getUserName(defaultValue);
2340     }
2341 
2342     /**
2343      * Tests whether the {@link #JAVA_AWT_HEADLESS} value is {@code true}.
2344      * <p>
2345      * The result is based on the system property {@value SystemProperties#JAVA_AWT_HEADLESS}.
2346      * </p>
2347      *
2348      * @return {@code true} if {@code JAVA_AWT_HEADLESS} is {@code "true"}, {@code false} otherwise.
2349      * @see #JAVA_AWT_HEADLESS
2350      * @since 2.1
2351      * @since Java 1.4
2352      * @deprecated Deprecated without replacement.
2353      */
2354     @Deprecated
2355     public static boolean isJavaAwtHeadless() {
2356         return Boolean.TRUE.toString().equals(JAVA_AWT_HEADLESS);
2357     }
2358 
2359     /**
2360      * Tests whether the Java version is at least the requested version.
2361      * <p>
2362      * The result is based on the system property saved in {@link #JAVA_SPECIFICATION_VERSION}.
2363      * </p>
2364      *
2365      * @param requiredVersion the required version, for example 1.31f.
2366      * @return {@code true} if the actual version is equal or greater than the required version.
2367      */
2368     public static boolean isJavaVersionAtLeast(final JavaVersion requiredVersion) {
2369         return JAVA_SPECIFICATION_VERSION_ENUM != null && JAVA_SPECIFICATION_VERSION_ENUM.atLeast(requiredVersion);
2370     }
2371 
2372     /**
2373      * Tests whether the Java version is at most the requested version.
2374      * <p>
2375      * The result is based on the system property saved in {@link #JAVA_SPECIFICATION_VERSION}.
2376      * </p>
2377      *
2378      * @param requiredVersion the required version, for example 1.31f.
2379      * @return {@code true} if the actual version is equal or less than the required version.
2380      * @since 3.9
2381      */
2382     public static boolean isJavaVersionAtMost(final JavaVersion requiredVersion) {
2383         return JAVA_SPECIFICATION_VERSION_ENUM != null && JAVA_SPECIFICATION_VERSION_ENUM.atMost(requiredVersion);
2384     }
2385 
2386     /**
2387      * Tests whether the Java version matches.
2388      *
2389      * <p>
2390      * This method is package private instead of private to support unit test invocation.
2391      * </p>
2392      *
2393      * @param version       the actual Java version.
2394      * @param versionPrefix the prefix for the expected Java version.
2395      * @return true if matches, or false if not or can't determine.
2396      */
2397     static boolean isJavaVersionMatch(final String version, final String versionPrefix) {
2398         if (version == null) {
2399             return false;
2400         }
2401         return version.startsWith(versionPrefix);
2402     }
2403 
2404     /**
2405      * Tests whether the operating system matches.
2406      * <p>
2407      * This method is package private instead of private to support unit test invocation.
2408      * </p>
2409      *
2410      * @param osName          the actual OS name.
2411      * @param osVersion       the actual OS version.
2412      * @param osNamePrefix    the prefix for the expected OS name.
2413      * @param osVersionPrefix the prefix for the expected OS version.
2414      * @return true if matches, or false if not or can't determine.
2415      */
2416     static boolean isOsMatch(final String osName, final String osVersion, final String osNamePrefix, final String osVersionPrefix) {
2417         if (osName == null || osVersion == null) {
2418             return false;
2419         }
2420         return isOsNameMatch(osName, osNamePrefix) && isOsVersionMatch(osVersion, osVersionPrefix);
2421     }
2422 
2423     /**
2424      * Tests whether the operating system matches with a case-insensitive comparison.
2425      * <p>
2426      * This method is package private instead of private to support unit test invocation.
2427      * </p>
2428      *
2429      * @param osName       the actual OS name.
2430      * @param osNamePrefix the prefix for the expected OS name.
2431      * @return true for a case-insensitive match, or false if not.
2432      */
2433     static boolean isOsNameMatch(final String osName, final String osNamePrefix) {
2434         if (osName == null) {
2435             return false;
2436         }
2437         return Strings.CI.startsWith(osName, osNamePrefix);
2438     }
2439 
2440     /**
2441      * Tests whether the operating system version matches.
2442      * <p>
2443      * This method is package private instead of private to support unit test invocation.
2444      * </p>
2445      *
2446      * @param osVersion       the actual OS version.
2447      * @param osVersionPrefix the prefix for the expected OS version.
2448      * @return true if matches, or false if not or can't determine.
2449      */
2450     static boolean isOsVersionMatch(final String osVersion, final String osVersionPrefix) {
2451         if (StringUtils.isEmpty(osVersion)) {
2452             return false;
2453         }
2454         // Compare parts of the version string instead of using String.startsWith(String) because otherwise
2455         // osVersionPrefix 10.1 would also match osVersion 10.10
2456         final String[] versionPrefixParts = JavaVersion.split(osVersionPrefix);
2457         final String[] versionParts = JavaVersion.split(osVersion);
2458         for (int i = 0; i < Math.min(versionPrefixParts.length, versionParts.length); i++) {
2459             if (!versionPrefixParts[i].equals(versionParts[i])) {
2460                 return false;
2461             }
2462         }
2463         return true;
2464     }
2465 
2466     /**
2467      * SystemUtils instances shouldn't be constructed in standard programming. Instead, elements should be accessed directly, for example
2468      * {@code SystemUtils.FILE_SEPARATOR}.
2469      *
2470      * <p>
2471      * This constructor is public to permit tools that require a JavaBean instance to operate.
2472      * </p>
2473      */
2474     public SystemUtils() {
2475     }
2476 
2477 }