001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.lang3;
018
019 import java.io.File;
020
021 /**
022 * <p>
023 * Helpers for {@code java.lang.System}.
024 * </p>
025 * <p>
026 * If a system property cannot be read due to security restrictions, the corresponding field in this class will be set
027 * to {@code null} and a message will be written to {@code System.err}.
028 * </p>
029 * <p>
030 * #ThreadSafe#
031 * </p>
032 *
033 * @since 1.0
034 * @version $Id: SystemUtils.java 1199816 2011-11-09 16:11:34Z bayard $
035 */
036 public class SystemUtils {
037
038 /**
039 * The prefix String for all Windows OS.
040 */
041 private static final String OS_NAME_WINDOWS_PREFIX = "Windows";
042
043 // System property constants
044 // -----------------------------------------------------------------------
045 // These MUST be declared first. Other constants depend on this.
046
047 /**
048 * The System property key for the user home directory.
049 */
050 private static final String USER_HOME_KEY = "user.home";
051
052 /**
053 * The System property key for the user directory.
054 */
055 private static final String USER_DIR_KEY = "user.dir";
056
057 /**
058 * The System property key for the Java IO temporary directory.
059 */
060 private static final String JAVA_IO_TMPDIR_KEY = "java.io.tmpdir";
061
062 /**
063 * The System property key for the Java home directory.
064 */
065 private static final String JAVA_HOME_KEY = "java.home";
066
067 /**
068 * <p>
069 * The {@code awt.toolkit} System Property.
070 * </p>
071 * <p>
072 * Holds a class name, on Windows XP this is {@code sun.awt.windows.WToolkit}.
073 * </p>
074 * <p>
075 * <b>On platforms without a GUI, this value is {@code null}.</b>
076 * </p>
077 * <p>
078 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
079 * not exist.
080 * </p>
081 * <p>
082 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
083 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
084 * sync with that System property.
085 * </p>
086 *
087 * @since 2.1
088 */
089 public static final String AWT_TOOLKIT = getSystemProperty("awt.toolkit");
090
091 /**
092 * <p>
093 * The {@code file.encoding} System Property.
094 * </p>
095 * <p>
096 * File encoding, such as {@code Cp1252}.
097 * </p>
098 * <p>
099 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
100 * not exist.
101 * </p>
102 * <p>
103 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
104 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
105 * sync with that System property.
106 * </p>
107 *
108 * @since 2.0
109 * @since Java 1.2
110 */
111 public static final String FILE_ENCODING = getSystemProperty("file.encoding");
112
113 /**
114 * <p>
115 * The {@code file.separator} System Property. File separator (<code>"/"</code> on UNIX).
116 * </p>
117 * <p>
118 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
119 * not exist.
120 * </p>
121 * <p>
122 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
123 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
124 * sync with that System property.
125 * </p>
126 *
127 * @since Java 1.1
128 */
129 public static final String FILE_SEPARATOR = getSystemProperty("file.separator");
130
131 /**
132 * <p>
133 * The {@code java.awt.fonts} System Property.
134 * </p>
135 * <p>
136 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
137 * not exist.
138 * </p>
139 * <p>
140 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
141 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
142 * sync with that System property.
143 * </p>
144 *
145 * @since 2.1
146 */
147 public static final String JAVA_AWT_FONTS = getSystemProperty("java.awt.fonts");
148
149 /**
150 * <p>
151 * The {@code java.awt.graphicsenv} System Property.
152 * </p>
153 * <p>
154 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
155 * not exist.
156 * </p>
157 * <p>
158 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
159 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
160 * sync with that System property.
161 * </p>
162 *
163 * @since 2.1
164 */
165 public static final String JAVA_AWT_GRAPHICSENV = getSystemProperty("java.awt.graphicsenv");
166
167 /**
168 * <p>
169 * The {@code java.awt.headless} System Property. The value of this property is the String {@code "true"} or
170 * {@code "false"}.
171 * </p>
172 * <p>
173 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
174 * not exist.
175 * </p>
176 * <p>
177 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
178 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
179 * sync with that System property.
180 * </p>
181 *
182 * @see #isJavaAwtHeadless()
183 * @since 2.1
184 * @since Java 1.4
185 */
186 public static final String JAVA_AWT_HEADLESS = getSystemProperty("java.awt.headless");
187
188 /**
189 * <p>
190 * The {@code java.awt.printerjob} System Property.
191 * </p>
192 * <p>
193 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
194 * not exist.
195 * </p>
196 * <p>
197 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
198 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
199 * sync with that System property.
200 * </p>
201 *
202 * @since 2.1
203 */
204 public static final String JAVA_AWT_PRINTERJOB = getSystemProperty("java.awt.printerjob");
205
206 /**
207 * <p>
208 * The {@code java.class.path} System Property. Java class path.
209 * </p>
210 * <p>
211 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
212 * not exist.
213 * </p>
214 * <p>
215 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
216 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
217 * sync with that System property.
218 * </p>
219 *
220 * @since Java 1.1
221 */
222 public static final String JAVA_CLASS_PATH = getSystemProperty("java.class.path");
223
224 /**
225 * <p>
226 * The {@code java.class.version} System Property. Java class format version number.
227 * </p>
228 * <p>
229 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
230 * not exist.
231 * </p>
232 * <p>
233 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
234 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
235 * sync with that System property.
236 * </p>
237 *
238 * @since Java 1.1
239 */
240 public static final String JAVA_CLASS_VERSION = getSystemProperty("java.class.version");
241
242 /**
243 * <p>
244 * The {@code java.compiler} System Property. Name of JIT compiler to use. First in JDK version 1.2. Not used in Sun
245 * JDKs after 1.2.
246 * </p>
247 * <p>
248 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
249 * not exist.
250 * </p>
251 * <p>
252 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
253 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
254 * sync with that System property.
255 * </p>
256 *
257 * @since Java 1.2. Not used in Sun versions after 1.2.
258 */
259 public static final String JAVA_COMPILER = getSystemProperty("java.compiler");
260
261 /**
262 * <p>
263 * The {@code java.endorsed.dirs} System Property. Path of endorsed directory or directories.
264 * </p>
265 * <p>
266 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
267 * not exist.
268 * </p>
269 * <p>
270 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
271 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
272 * sync with that System property.
273 * </p>
274 *
275 * @since Java 1.4
276 */
277 public static final String JAVA_ENDORSED_DIRS = getSystemProperty("java.endorsed.dirs");
278
279 /**
280 * <p>
281 * The {@code java.ext.dirs} System Property. Path of extension directory or directories.
282 * </p>
283 * <p>
284 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
285 * not exist.
286 * </p>
287 * <p>
288 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
289 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
290 * sync with that System property.
291 * </p>
292 *
293 * @since Java 1.3
294 */
295 public static final String JAVA_EXT_DIRS = getSystemProperty("java.ext.dirs");
296
297 /**
298 * <p>
299 * The {@code java.home} System Property. Java installation directory.
300 * </p>
301 * <p>
302 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
303 * not exist.
304 * </p>
305 * <p>
306 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
307 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
308 * sync with that System property.
309 * </p>
310 *
311 * @since Java 1.1
312 */
313 public static final String JAVA_HOME = getSystemProperty(JAVA_HOME_KEY);
314
315 /**
316 * <p>
317 * The {@code java.io.tmpdir} System Property. Default temp file path.
318 * </p>
319 * <p>
320 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
321 * not exist.
322 * </p>
323 * <p>
324 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
325 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
326 * sync with that System property.
327 * </p>
328 *
329 * @since Java 1.2
330 */
331 public static final String JAVA_IO_TMPDIR = getSystemProperty(JAVA_IO_TMPDIR_KEY);
332
333 /**
334 * <p>
335 * The {@code java.library.path} System Property. List of paths to search when loading libraries.
336 * </p>
337 * <p>
338 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
339 * not exist.
340 * </p>
341 * <p>
342 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
343 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
344 * sync with that System property.
345 * </p>
346 *
347 * @since Java 1.2
348 */
349 public static final String JAVA_LIBRARY_PATH = getSystemProperty("java.library.path");
350
351 /**
352 * <p>
353 * The {@code java.runtime.name} System Property. Java Runtime Environment name.
354 * </p>
355 * <p>
356 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
357 * not exist.
358 * </p>
359 * <p>
360 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
361 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
362 * sync with that System property.
363 * </p>
364 *
365 * @since 2.0
366 * @since Java 1.3
367 */
368 public static final String JAVA_RUNTIME_NAME = getSystemProperty("java.runtime.name");
369
370 /**
371 * <p>
372 * The {@code java.runtime.version} System Property. Java Runtime Environment version.
373 * </p>
374 * <p>
375 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
376 * not exist.
377 * </p>
378 * <p>
379 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
380 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
381 * sync with that System property.
382 * </p>
383 *
384 * @since 2.0
385 * @since Java 1.3
386 */
387 public static final String JAVA_RUNTIME_VERSION = getSystemProperty("java.runtime.version");
388
389 /**
390 * <p>
391 * The {@code java.specification.name} System Property. Java Runtime Environment specification name.
392 * </p>
393 * <p>
394 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
395 * not exist.
396 * </p>
397 * <p>
398 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
399 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
400 * sync with that System property.
401 * </p>
402 *
403 * @since Java 1.2
404 */
405 public static final String JAVA_SPECIFICATION_NAME = getSystemProperty("java.specification.name");
406
407 /**
408 * <p>
409 * The {@code java.specification.vendor} System Property. Java Runtime Environment specification vendor.
410 * </p>
411 * <p>
412 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
413 * not exist.
414 * </p>
415 * <p>
416 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
417 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
418 * sync with that System property.
419 * </p>
420 *
421 * @since Java 1.2
422 */
423 public static final String JAVA_SPECIFICATION_VENDOR = getSystemProperty("java.specification.vendor");
424
425 /**
426 * <p>
427 * The {@code java.specification.version} System Property. Java Runtime Environment specification version.
428 * </p>
429 * <p>
430 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
431 * not exist.
432 * </p>
433 * <p>
434 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
435 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
436 * sync with that System property.
437 * </p>
438 *
439 * @since Java 1.3
440 */
441 public static final String JAVA_SPECIFICATION_VERSION = getSystemProperty("java.specification.version");
442 private static final JavaVersion JAVA_SPECIFICATION_VERSION_AS_ENUM = JavaVersion.get(JAVA_SPECIFICATION_VERSION);
443
444 /**
445 * <p>
446 * The {@code java.util.prefs.PreferencesFactory} System Property. A class name.
447 * </p>
448 * <p>
449 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
450 * not exist.
451 * </p>
452 * <p>
453 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
454 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
455 * sync with that System property.
456 * </p>
457 *
458 * @since 2.1
459 * @since Java 1.4
460 */
461 public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY =
462 getSystemProperty("java.util.prefs.PreferencesFactory");
463
464 /**
465 * <p>
466 * The {@code java.vendor} System Property. Java vendor-specific string.
467 * </p>
468 * <p>
469 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
470 * not exist.
471 * </p>
472 * <p>
473 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
474 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
475 * sync with that System property.
476 * </p>
477 *
478 * @since Java 1.1
479 */
480 public static final String JAVA_VENDOR = getSystemProperty("java.vendor");
481
482 /**
483 * <p>
484 * The {@code java.vendor.url} System Property. Java vendor URL.
485 * </p>
486 * <p>
487 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
488 * not exist.
489 * </p>
490 * <p>
491 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
492 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
493 * sync with that System property.
494 * </p>
495 *
496 * @since Java 1.1
497 */
498 public static final String JAVA_VENDOR_URL = getSystemProperty("java.vendor.url");
499
500 /**
501 * <p>
502 * The {@code java.version} System Property. Java version number.
503 * </p>
504 * <p>
505 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
506 * not exist.
507 * </p>
508 * <p>
509 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
510 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
511 * sync with that System property.
512 * </p>
513 *
514 * @since Java 1.1
515 */
516 public static final String JAVA_VERSION = getSystemProperty("java.version");
517
518 /**
519 * <p>
520 * The {@code java.vm.info} System Property. Java Virtual Machine implementation info.
521 * </p>
522 * <p>
523 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
524 * not exist.
525 * </p>
526 * <p>
527 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
528 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
529 * sync with that System property.
530 * </p>
531 *
532 * @since 2.0
533 * @since Java 1.2
534 */
535 public static final String JAVA_VM_INFO = getSystemProperty("java.vm.info");
536
537 /**
538 * <p>
539 * The {@code java.vm.name} System Property. Java Virtual Machine implementation name.
540 * </p>
541 * <p>
542 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
543 * not exist.
544 * </p>
545 * <p>
546 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
547 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
548 * sync with that System property.
549 * </p>
550 *
551 * @since Java 1.2
552 */
553 public static final String JAVA_VM_NAME = getSystemProperty("java.vm.name");
554
555 /**
556 * <p>
557 * The {@code java.vm.specification.name} System Property. Java Virtual Machine specification name.
558 * </p>
559 * <p>
560 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
561 * not exist.
562 * </p>
563 * <p>
564 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
565 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
566 * sync with that System property.
567 * </p>
568 *
569 * @since Java 1.2
570 */
571 public static final String JAVA_VM_SPECIFICATION_NAME = getSystemProperty("java.vm.specification.name");
572
573 /**
574 * <p>
575 * The {@code java.vm.specification.vendor} System Property. Java Virtual Machine specification vendor.
576 * </p>
577 * <p>
578 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
579 * not exist.
580 * </p>
581 * <p>
582 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
583 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
584 * sync with that System property.
585 * </p>
586 *
587 * @since Java 1.2
588 */
589 public static final String JAVA_VM_SPECIFICATION_VENDOR = getSystemProperty("java.vm.specification.vendor");
590
591 /**
592 * <p>
593 * The {@code java.vm.specification.version} System Property. Java Virtual Machine specification version.
594 * </p>
595 * <p>
596 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
597 * not exist.
598 * </p>
599 * <p>
600 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
601 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
602 * sync with that System property.
603 * </p>
604 *
605 * @since Java 1.2
606 */
607 public static final String JAVA_VM_SPECIFICATION_VERSION = getSystemProperty("java.vm.specification.version");
608
609 /**
610 * <p>
611 * The {@code java.vm.vendor} System Property. Java Virtual Machine implementation vendor.
612 * </p>
613 * <p>
614 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
615 * not exist.
616 * </p>
617 * <p>
618 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
619 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
620 * sync with that System property.
621 * </p>
622 *
623 * @since Java 1.2
624 */
625 public static final String JAVA_VM_VENDOR = getSystemProperty("java.vm.vendor");
626
627 /**
628 * <p>
629 * The {@code java.vm.version} System Property. Java Virtual Machine implementation version.
630 * </p>
631 * <p>
632 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
633 * not exist.
634 * </p>
635 * <p>
636 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
637 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
638 * sync with that System property.
639 * </p>
640 *
641 * @since Java 1.2
642 */
643 public static final String JAVA_VM_VERSION = getSystemProperty("java.vm.version");
644
645 /**
646 * <p>
647 * The {@code line.separator} System Property. Line separator (<code>"\n"</code> on UNIX).
648 * </p>
649 * <p>
650 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
651 * not exist.
652 * </p>
653 * <p>
654 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
655 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
656 * sync with that System property.
657 * </p>
658 *
659 * @since Java 1.1
660 */
661 public static final String LINE_SEPARATOR = getSystemProperty("line.separator");
662
663 /**
664 * <p>
665 * The {@code os.arch} System Property. Operating system architecture.
666 * </p>
667 * <p>
668 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
669 * not exist.
670 * </p>
671 * <p>
672 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
673 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
674 * sync with that System property.
675 * </p>
676 *
677 * @since Java 1.1
678 */
679 public static final String OS_ARCH = getSystemProperty("os.arch");
680
681 /**
682 * <p>
683 * The {@code os.name} System Property. Operating system name.
684 * </p>
685 * <p>
686 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
687 * not exist.
688 * </p>
689 * <p>
690 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
691 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
692 * sync with that System property.
693 * </p>
694 *
695 * @since Java 1.1
696 */
697 public static final String OS_NAME = getSystemProperty("os.name");
698
699 /**
700 * <p>
701 * The {@code os.version} System Property. Operating system version.
702 * </p>
703 * <p>
704 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
705 * not exist.
706 * </p>
707 * <p>
708 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
709 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
710 * sync with that System property.
711 * </p>
712 *
713 * @since Java 1.1
714 */
715 public static final String OS_VERSION = getSystemProperty("os.version");
716
717 /**
718 * <p>
719 * The {@code path.separator} System Property. Path separator (<code>":"</code> on UNIX).
720 * </p>
721 * <p>
722 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
723 * not exist.
724 * </p>
725 * <p>
726 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
727 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
728 * sync with that System property.
729 * </p>
730 *
731 * @since Java 1.1
732 */
733 public static final String PATH_SEPARATOR = getSystemProperty("path.separator");
734
735 /**
736 * <p>
737 * The {@code user.country} or {@code user.region} System Property. User's country code, such as {@code GB}. First
738 * in Java version 1.2 as {@code user.region}. Renamed to {@code user.country} in 1.4
739 * </p>
740 * <p>
741 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
742 * not exist.
743 * </p>
744 * <p>
745 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
746 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
747 * sync with that System property.
748 * </p>
749 *
750 * @since 2.0
751 * @since Java 1.2
752 */
753 public static final String USER_COUNTRY = getSystemProperty("user.country") == null ?
754 getSystemProperty("user.region") : getSystemProperty("user.country");
755
756 /**
757 * <p>
758 * The {@code user.dir} System Property. User's current working directory.
759 * </p>
760 * <p>
761 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
762 * not exist.
763 * </p>
764 * <p>
765 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
766 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
767 * sync with that System property.
768 * </p>
769 *
770 * @since Java 1.1
771 */
772 public static final String USER_DIR = getSystemProperty(USER_DIR_KEY);
773
774 /**
775 * <p>
776 * The {@code user.home} System Property. User's home directory.
777 * </p>
778 * <p>
779 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
780 * not exist.
781 * </p>
782 * <p>
783 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
784 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
785 * sync with that System property.
786 * </p>
787 *
788 * @since Java 1.1
789 */
790 public static final String USER_HOME = getSystemProperty(USER_HOME_KEY);
791
792 /**
793 * <p>
794 * The {@code user.language} System Property. User's language code, such as {@code "en"}.
795 * </p>
796 * <p>
797 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
798 * not exist.
799 * </p>
800 * <p>
801 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
802 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
803 * sync with that System property.
804 * </p>
805 *
806 * @since 2.0
807 * @since Java 1.2
808 */
809 public static final String USER_LANGUAGE = getSystemProperty("user.language");
810
811 /**
812 * <p>
813 * The {@code user.name} System Property. User's account name.
814 * </p>
815 * <p>
816 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
817 * not exist.
818 * </p>
819 * <p>
820 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
821 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
822 * sync with that System property.
823 * </p>
824 *
825 * @since Java 1.1
826 */
827 public static final String USER_NAME = getSystemProperty("user.name");
828
829 /**
830 * <p>
831 * The {@code user.timezone} System Property. For example: {@code "America/Los_Angeles"}.
832 * </p>
833 * <p>
834 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does
835 * not exist.
836 * </p>
837 * <p>
838 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
839 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of
840 * sync with that System property.
841 * </p>
842 *
843 * @since 2.1
844 */
845 public static final String USER_TIMEZONE = getSystemProperty("user.timezone");
846
847 // Java version checks
848 // -----------------------------------------------------------------------
849 // These MUST be declared after those above as they depend on the
850 // values being set up
851
852 /**
853 * <p>
854 * Is {@code true} if this is Java version 1.1 (also 1.1.x versions).
855 * </p>
856 * <p>
857 * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
858 * </p>
859 */
860 public static final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1");
861
862 /**
863 * <p>
864 * Is {@code true} if this is Java version 1.2 (also 1.2.x versions).
865 * </p>
866 * <p>
867 * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
868 * </p>
869 */
870 public static final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2");
871
872 /**
873 * <p>
874 * Is {@code true} if this is Java version 1.3 (also 1.3.x versions).
875 * </p>
876 * <p>
877 * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
878 * </p>
879 */
880 public static final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3");
881
882 /**
883 * <p>
884 * Is {@code true} if this is Java version 1.4 (also 1.4.x versions).
885 * </p>
886 * <p>
887 * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
888 * </p>
889 */
890 public static final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4");
891
892 /**
893 * <p>
894 * Is {@code true} if this is Java version 1.5 (also 1.5.x versions).
895 * </p>
896 * <p>
897 * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
898 * </p>
899 */
900 public static final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5");
901
902 /**
903 * <p>
904 * Is {@code true} if this is Java version 1.6 (also 1.6.x versions).
905 * </p>
906 * <p>
907 * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
908 * </p>
909 */
910 public static final boolean IS_JAVA_1_6 = getJavaVersionMatches("1.6");
911
912 /**
913 * <p>
914 * Is {@code true} if this is Java version 1.7 (also 1.7.x versions).
915 * </p>
916 * <p>
917 * The field will return {@code false} if {@link #JAVA_VERSION} is {@code null}.
918 * </p>
919 *
920 * @since 3.0
921 */
922 public static final boolean IS_JAVA_1_7 = getJavaVersionMatches("1.7");
923
924 // Operating system checks
925 // -----------------------------------------------------------------------
926 // These MUST be declared after those above as they depend on the
927 // values being set up
928 // OS names from http://www.vamphq.com/os.html
929 // Selected ones included - please advise dev@commons.apache.org
930 // if you want another added or a mistake corrected
931
932 /**
933 * <p>
934 * Is {@code true} if this is AIX.
935 * </p>
936 * <p>
937 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
938 * </p>
939 *
940 * @since 2.0
941 */
942 public static final boolean IS_OS_AIX = getOSMatchesName("AIX");
943
944 /**
945 * <p>
946 * Is {@code true} if this is HP-UX.
947 * </p>
948 * <p>
949 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
950 * </p>
951 *
952 * @since 2.0
953 */
954 public static final boolean IS_OS_HP_UX = getOSMatchesName("HP-UX");
955
956 /**
957 * <p>
958 * Is {@code true} if this is Irix.
959 * </p>
960 * <p>
961 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
962 * </p>
963 *
964 * @since 2.0
965 */
966 public static final boolean IS_OS_IRIX = getOSMatchesName("Irix");
967
968 /**
969 * <p>
970 * Is {@code true} if this is Linux.
971 * </p>
972 * <p>
973 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
974 * </p>
975 *
976 * @since 2.0
977 */
978 public static final boolean IS_OS_LINUX = getOSMatchesName("Linux") || getOSMatchesName("LINUX");
979
980 /**
981 * <p>
982 * Is {@code true} if this is Mac.
983 * </p>
984 * <p>
985 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
986 * </p>
987 *
988 * @since 2.0
989 */
990 public static final boolean IS_OS_MAC = getOSMatchesName("Mac");
991
992 /**
993 * <p>
994 * Is {@code true} if this is Mac.
995 * </p>
996 * <p>
997 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
998 * </p>
999 *
1000 * @since 2.0
1001 */
1002 public static final boolean IS_OS_MAC_OSX = getOSMatchesName("Mac OS X");
1003
1004 /**
1005 * <p>
1006 * Is {@code true} if this is FreeBSD.
1007 * </p>
1008 * <p>
1009 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1010 * </p>
1011 *
1012 * @since 3.1
1013 */
1014 public static final boolean IS_OS_FREE_BSD = getOSMatchesName("FreeBSD");
1015
1016 /**
1017 * <p>
1018 * Is {@code true} if this is OpenBSD.
1019 * </p>
1020 * <p>
1021 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1022 * </p>
1023 *
1024 * @since 3.1
1025 */
1026 public static final boolean IS_OS_OPEN_BSD = getOSMatchesName("OpenBSD");
1027
1028 /**
1029 * <p>
1030 * Is {@code true} if this is NetBSD.
1031 * </p>
1032 * <p>
1033 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1034 * </p>
1035 *
1036 * @since 3.1
1037 */
1038 public static final boolean IS_OS_NET_BSD = getOSMatchesName("NetBSD");
1039
1040 /**
1041 * <p>
1042 * Is {@code true} if this is OS/2.
1043 * </p>
1044 * <p>
1045 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1046 * </p>
1047 *
1048 * @since 2.0
1049 */
1050 public static final boolean IS_OS_OS2 = getOSMatchesName("OS/2");
1051
1052 /**
1053 * <p>
1054 * Is {@code true} if this is Solaris.
1055 * </p>
1056 * <p>
1057 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1058 * </p>
1059 *
1060 * @since 2.0
1061 */
1062 public static final boolean IS_OS_SOLARIS = getOSMatchesName("Solaris");
1063
1064 /**
1065 * <p>
1066 * Is {@code true} if this is SunOS.
1067 * </p>
1068 * <p>
1069 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1070 * </p>
1071 *
1072 * @since 2.0
1073 */
1074 public static final boolean IS_OS_SUN_OS = getOSMatchesName("SunOS");
1075
1076 /**
1077 * <p>
1078 * Is {@code true} if this is a UNIX like system, as in any of AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS.
1079 * </p>
1080 * <p>
1081 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1082 * </p>
1083 *
1084 * @since 2.1
1085 */
1086 public static final boolean IS_OS_UNIX = IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX || IS_OS_MAC_OSX
1087 || IS_OS_SOLARIS || IS_OS_SUN_OS || IS_OS_FREE_BSD || IS_OS_OPEN_BSD || IS_OS_NET_BSD;
1088
1089 /**
1090 * <p>
1091 * Is {@code true} if this is Windows.
1092 * </p>
1093 * <p>
1094 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1095 * </p>
1096 *
1097 * @since 2.0
1098 */
1099 public static final boolean IS_OS_WINDOWS = getOSMatchesName(OS_NAME_WINDOWS_PREFIX);
1100
1101 /**
1102 * <p>
1103 * Is {@code true} if this is Windows 2000.
1104 * </p>
1105 * <p>
1106 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1107 * </p>
1108 *
1109 * @since 2.0
1110 */
1111 public static final boolean IS_OS_WINDOWS_2000 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.0");
1112
1113 /**
1114 * <p>
1115 * Is {@code true} if this is Windows 2003.
1116 * </p>
1117 * <p>
1118 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1119 * </p>
1120 *
1121 * @since 3.1
1122 */
1123 public static final boolean IS_OS_WINDOWS_2003 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.2");
1124
1125 /**
1126 * <p>
1127 * Is {@code true} if this is Windows 2008.
1128 * </p>
1129 * <p>
1130 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1131 * </p>
1132 *
1133 * @since 3.1
1134 */
1135 public static final boolean IS_OS_WINDOWS_2008 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " Server 2008", "6.1");
1136
1137 /**
1138 * <p>
1139 * Is {@code true} if this is Windows 95.
1140 * </p>
1141 * <p>
1142 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1143 * </p>
1144 *
1145 * @since 2.0
1146 */
1147 public static final boolean IS_OS_WINDOWS_95 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.0");
1148 // Java 1.2 running on Windows98 returns 'Windows 95', hence the above
1149
1150 /**
1151 * <p>
1152 * Is {@code true} if this is Windows 98.
1153 * </p>
1154 * <p>
1155 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1156 * </p>
1157 *
1158 * @since 2.0
1159 */
1160 public static final boolean IS_OS_WINDOWS_98 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.1");
1161 // Java 1.2 running on Windows98 returns 'Windows 95', hence the above
1162
1163 /**
1164 * <p>
1165 * Is {@code true} if this is Windows ME.
1166 * </p>
1167 * <p>
1168 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1169 * </p>
1170 *
1171 * @since 2.0
1172 */
1173 public static final boolean IS_OS_WINDOWS_ME = getOSMatches(OS_NAME_WINDOWS_PREFIX, "4.9");
1174 // Java 1.2 running on WindowsME may return 'Windows 95', hence the above
1175
1176 /**
1177 * <p>
1178 * Is {@code true} if this is Windows NT.
1179 * </p>
1180 * <p>
1181 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1182 * </p>
1183 *
1184 * @since 2.0
1185 */
1186 public static final boolean IS_OS_WINDOWS_NT = getOSMatchesName(OS_NAME_WINDOWS_PREFIX + " NT");
1187 // Windows 2000 returns 'Windows 2000' but may suffer from same Java1.2 problem
1188
1189 /**
1190 * <p>
1191 * Is {@code true} if this is Windows XP.
1192 * </p>
1193 * <p>
1194 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1195 * </p>
1196 *
1197 * @since 2.0
1198 */
1199 public static final boolean IS_OS_WINDOWS_XP = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.1");
1200
1201 // -----------------------------------------------------------------------
1202 /**
1203 * <p>
1204 * Is {@code true} if this is Windows Vista.
1205 * </p>
1206 * <p>
1207 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1208 * </p>
1209 *
1210 * @since 2.4
1211 */
1212 public static final boolean IS_OS_WINDOWS_VISTA = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.0");
1213
1214 /**
1215 * <p>
1216 * Is {@code true} if this is Windows 7.
1217 * </p>
1218 * <p>
1219 * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1220 * </p>
1221 *
1222 * @since 3.0
1223 */
1224 public static final boolean IS_OS_WINDOWS_7 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.1");
1225
1226 /**
1227 * <p>
1228 * Gets the Java home directory as a {@code File}.
1229 * </p>
1230 *
1231 * @return a directory
1232 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow
1233 * access to the specified system property.
1234 * @see System#getProperty(String)
1235 * @since 2.1
1236 */
1237 public static File getJavaHome() {
1238 return new File(System.getProperty(JAVA_HOME_KEY));
1239 }
1240
1241 /**
1242 * <p>
1243 * Gets the Java IO temporary directory as a {@code File}.
1244 * </p>
1245 *
1246 * @return a directory
1247 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow
1248 * access to the specified system property.
1249 * @see System#getProperty(String)
1250 * @since 2.1
1251 */
1252 public static File getJavaIoTmpDir() {
1253 return new File(System.getProperty(JAVA_IO_TMPDIR_KEY));
1254 }
1255
1256 /**
1257 * <p>
1258 * Decides if the Java version matches.
1259 * </p>
1260 *
1261 * @param versionPrefix the prefix for the java version
1262 * @return true if matches, or false if not or can't determine
1263 */
1264 private static boolean getJavaVersionMatches(String versionPrefix) {
1265 return isJavaVersionMatch(JAVA_SPECIFICATION_VERSION, versionPrefix);
1266 }
1267
1268 /**
1269 * Decides if the operating system matches.
1270 *
1271 * @param osNamePrefix the prefix for the os name
1272 * @param osVersionPrefix the prefix for the version
1273 * @return true if matches, or false if not or can't determine
1274 */
1275 private static boolean getOSMatches(String osNamePrefix, String osVersionPrefix) {
1276 return isOSMatch(OS_NAME, OS_VERSION, osNamePrefix, osVersionPrefix);
1277 }
1278
1279 /**
1280 * Decides if the operating system matches.
1281 *
1282 * @param osNamePrefix the prefix for the os name
1283 * @return true if matches, or false if not or can't determine
1284 */
1285 private static boolean getOSMatchesName(String osNamePrefix) {
1286 return isOSNameMatch(OS_NAME, osNamePrefix);
1287 }
1288
1289 // -----------------------------------------------------------------------
1290 /**
1291 * <p>
1292 * Gets a System property, defaulting to {@code null} if the property cannot be read.
1293 * </p>
1294 * <p>
1295 * If a {@code SecurityException} is caught, the return value is {@code null} and a message is written to
1296 * {@code System.err}.
1297 * </p>
1298 *
1299 * @param property the system property name
1300 * @return the system property value or {@code null} if a security problem occurs
1301 */
1302 private static String getSystemProperty(String property) {
1303 try {
1304 return System.getProperty(property);
1305 } catch (SecurityException ex) {
1306 // we are not allowed to look at this property
1307 System.err.println("Caught a SecurityException reading the system property '" + property
1308 + "'; the SystemUtils property value will default to null.");
1309 return null;
1310 }
1311 }
1312
1313 /**
1314 * <p>
1315 * Gets the user directory as a {@code File}.
1316 * </p>
1317 *
1318 * @return a directory
1319 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow
1320 * access to the specified system property.
1321 * @see System#getProperty(String)
1322 * @since 2.1
1323 */
1324 public static File getUserDir() {
1325 return new File(System.getProperty(USER_DIR_KEY));
1326 }
1327
1328 /**
1329 * <p>
1330 * Gets the user home directory as a {@code File}.
1331 * </p>
1332 *
1333 * @return a directory
1334 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow
1335 * access to the specified system property.
1336 * @see System#getProperty(String)
1337 * @since 2.1
1338 */
1339 public static File getUserHome() {
1340 return new File(System.getProperty(USER_HOME_KEY));
1341 }
1342
1343 /**
1344 * Returns whether the {@link #JAVA_AWT_HEADLESS} value is {@code true}.
1345 *
1346 * @return {@code true} if {@code JAVA_AWT_HEADLESS} is {@code "true"}, {@code false} otherwise.
1347 * @see #JAVA_AWT_HEADLESS
1348 * @since 2.1
1349 * @since Java 1.4
1350 */
1351 public static boolean isJavaAwtHeadless() {
1352 return JAVA_AWT_HEADLESS != null ? JAVA_AWT_HEADLESS.equals(Boolean.TRUE.toString()) : false;
1353 }
1354
1355 /**
1356 * <p>
1357 * Is the Java version at least the requested version.
1358 * </p>
1359 * <p>
1360 * Example input:
1361 * </p>
1362 * <ul>
1363 * <li>{@code 1.2f} to test for Java 1.2</li>
1364 * <li>{@code 1.31f} to test for Java 1.3.1</li>
1365 * </ul>
1366 *
1367 * @param requiredVersion the required version, for example 1.31f
1368 * @return {@code true} if the actual version is equal or greater than the required version
1369 */
1370 public static boolean isJavaVersionAtLeast(JavaVersion requiredVersion) {
1371 return JAVA_SPECIFICATION_VERSION_AS_ENUM.atLeast(requiredVersion);
1372 }
1373
1374 /**
1375 * <p>
1376 * Decides if the Java version matches.
1377 * </p>
1378 * <p>
1379 * This method is package private instead of private to support unit test invocation.
1380 * </p>
1381 *
1382 * @param version the actual Java version
1383 * @param versionPrefix the prefix for the expected Java version
1384 * @return true if matches, or false if not or can't determine
1385 */
1386 static boolean isJavaVersionMatch(String version, String versionPrefix) {
1387 if (version == null) {
1388 return false;
1389 }
1390 return version.startsWith(versionPrefix);
1391 }
1392
1393 /**
1394 * Decides if the operating system matches.
1395 * <p>
1396 * This method is package private instead of private to support unit test invocation.
1397 * </p>
1398 *
1399 * @param osName the actual OS name
1400 * @param osVersion the actual OS version
1401 * @param osNamePrefix the prefix for the expected OS name
1402 * @param osVersionPrefix the prefix for the expected OS version
1403 * @return true if matches, or false if not or can't determine
1404 */
1405 static boolean isOSMatch(String osName, String osVersion, String osNamePrefix, String osVersionPrefix) {
1406 if (osName == null || osVersion == null) {
1407 return false;
1408 }
1409 return osName.startsWith(osNamePrefix) && osVersion.startsWith(osVersionPrefix);
1410 }
1411
1412 /**
1413 * Decides if the operating system matches.
1414 * <p>
1415 * This method is package private instead of private to support unit test invocation.
1416 * </p>
1417 *
1418 * @param osName the actual OS name
1419 * @param osNamePrefix the prefix for the expected OS name
1420 * @return true if matches, or false if not or can't determine
1421 */
1422 static boolean isOSNameMatch(String osName, String osNamePrefix) {
1423 if (osName == null) {
1424 return false;
1425 }
1426 return osName.startsWith(osNamePrefix);
1427 }
1428
1429 // -----------------------------------------------------------------------
1430 /**
1431 * <p>
1432 * SystemUtils instances should NOT be constructed in standard programming. Instead, the class should be used as
1433 * {@code SystemUtils.FILE_SEPARATOR}.
1434 * </p>
1435 * <p>
1436 * This constructor is public to permit tools that require a JavaBean instance to operate.
1437 * </p>
1438 */
1439 public SystemUtils() {
1440 super();
1441 }
1442
1443 }