setProperties(null)
.
*/
static
{
// Note that this loadLibrary() takes precedence over the one in Object,
// since Object.This corresponds to the C stdin and C++ cin variables, which * typically input from the keyboard, but may be used to pipe input from * other processes or files. That should all be transparent to you, * however. */ public static final InputStream in = new BufferedInputStream(new FileInputStream(FileDescriptor.in)); /** * The standard output PrintStream. This is assigned at startup and * starts its life perfectly valid. Although it is marked final, you can * change it using {@link #setOut(PrintStream)} through some hefty VM magic. * *
This corresponds to the C stdout and C++ cout variables, which * typically output normal messages to the screen, but may be used to pipe * output to other processes or files. That should all be transparent to * you, however. */ public static final PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)), true); /** * The standard output PrintStream. This is assigned at startup and * starts its life perfectly valid. Although it is marked final, you can * change it using {@link #setErr(PrintStream)} through some hefty VM magic. * *
This corresponds to the C stderr and C++ cerr variables, which
* typically output error messages to the screen, but may be used to pipe
* output to other processes or files. That should all be transparent to
* you, however.
*/
public static final PrintStream err
= new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.err)), true);
/**
* This class is uninstantiable.
*/
private System()
{
}
/**
* Set {@link #in} to a new InputStream. This uses some VM magic to change
* a "final" variable, so naturally there is a security check,
* RuntimePermission("setIO")
.
*
* @param in the new InputStream
* @throws SecurityException if permission is denied
* @since 1.1
*/
public static void setIn(InputStream in)
{
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPermission(new RuntimePermission("setIO"));
setIn0(in);
}
/**
* Set {@link #out} to a new PrintStream. This uses some VM magic to change
* a "final" variable, so naturally there is a security check,
* RuntimePermission("setIO")
.
*
* @param out the new PrintStream
* @throws SecurityException if permission is denied
* @since 1.1
*/
public static void setOut(PrintStream out)
{
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPermission(new RuntimePermission("setIO"));
setOut0(out);
}
/**
* Set {@link #err} to a new PrintStream. This uses some VM magic to change
* a "final" variable, so naturally there is a security check,
* RuntimePermission("setIO")
.
*
* @param err the new PrintStream
* @throws SecurityException if permission is denied
* @since 1.1
*/
public static void setErr(PrintStream err)
{
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPermission(new RuntimePermission("setIO"));
setErr0(err);
}
/**
* Set the current SecurityManager. If a security manager already exists,
* then RuntimePermission("setSecurityManager")
is checked
* first. Since this permission is denied by the default security manager,
* setting the security manager is often an irreversible action.
*
* Spec Note: Don't ask me, I didn't write it. It looks
* pretty vulnerable; whoever gets to the gate first gets to set the policy.
* There is probably some way to set the original security manager as a
* command line argument to the VM, but I don't know it.
*
* @param sm the new SecurityManager
* @throws SecurityException if permission is denied
*/
public synchronized static void setSecurityManager(SecurityManager sm)
{
// Implementation note: the field lives in Runtime because of bootstrap
// initialization issues. This method is synchronized so that no other
// thread changes it to null before this thread makes the change.
if (Runtime.securityManager != null)
Runtime.securityManager.checkPermission
(new RuntimePermission("setSecurityManager"));
Runtime.securityManager = sm;
}
/**
* Get the current SecurityManager. If the SecurityManager has not been
* set yet, then this method returns null.
*
* @return the current SecurityManager, or null
*/
public static SecurityManager getSecurityManager()
{
// Implementation note: the field lives in Runtime because of bootstrap
// initialization issues.
return Runtime.securityManager;
}
/**
* Get the current time, measured in the number of milliseconds from the
* beginning of Jan. 1, 1970. This is gathered from the system clock, with
* any attendant incorrectness (it may be timezone dependent).
*
* @return the current time
* @see java.util.Date
*/
public static native long currentTimeMillis();
/**
* Copy one array onto another from src[srcStart]
...
* src[srcStart+len-1]
to dest[destStart]
...
* dest[destStart+len-1]
. First, the arguments are validated:
* neither array may be null, they must be of compatible types, and the
* start and length must fit within both arrays. Then the copying starts,
* and proceeds through increasing slots. If src and dest are the same
* array, this will appear to copy the data to a temporary location first.
* An ArrayStoreException in the middle of copying will leave earlier
* elements copied, but later elements unchanged.
*
* @param src the array to copy elements from
* @param srcStart the starting position in src
* @param dest the array to copy elements to
* @param destStart the starting position in dest
* @param len the number of elements to copy
* @throws NullPointerException if src or dest is null
* @throws ArrayStoreException if src or dest is not an array, if they are
* not compatible array types, or if an incompatible runtime type
* is stored in dest
* @throws IndexOutOfBoundsException if len is negative, or if the start or
* end copy position in either array is out of bounds
*/
public static native void arraycopy(Object src, int srcStart,
Object dest, int destStart, int len);
/**
* Get a hash code computed by the VM for the Object. This hash code will
* be the same as Object's hashCode() method. It is usually some
* convolution of the pointer to the Object internal to the VM. It
* follows standard hash code rules, in that it will remain the same for a
* given Object for the lifetime of that Object.
*
* @param o the Object to get the hash code for
* @return the VM-dependent hash code for this Object
* @since 1.1
*/
public static native int identityHashCode(Object o);
/**
* Get all the system properties at once. A security check may be performed,
* checkPropertiesAccess
. Note that a security manager may
* allow getting a single property, but not the entire group.
*
*
The required properties include: *
checkPropertiesAccess
. Note that a security manager may
* allow setting a single property, but not the entire group. An argument
* of null resets the properties to the startup default.
*
* @param properties the new set of system properties
* @throws SecurityException if permission is denied
*/
public static void setProperties(Properties properties)
{
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPropertiesAccess();
if (properties == null)
{
// Note that we use clone here and not new. Some programs
// assume that the system properties do not have a parent.
properties = (Properties) Runtime.defaultProperties.clone();
}
System.properties = properties;
}
/**
* Get a single system property by name. A security check may be performed,
* checkPropertyAccess(key)
.
*
* @param key the name of the system property to get
* @return the property, or null if not found
* @throws SecurityException if permission is denied
* @throws NullPointerException if key is null
* @throws IllegalArgumentException if key is ""
*/
public static String getProperty(String key)
{
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPropertyAccess(key);
else if (key.length() == 0)
throw new IllegalArgumentException("key can't be empty");
return properties.getProperty(key);
}
/**
* Get a single system property by name. A security check may be performed,
* checkPropertyAccess(key)
.
*
* @param key the name of the system property to get
* @param def the default
* @return the property, or def if not found
* @throws SecurityException if permission is denied
* @throws NullPointerException if key is null
* @throws IllegalArgumentException if key is ""
*/
public static String getProperty(String key, String def)
{
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPropertyAccess(key);
return properties.getProperty(key, def);
}
/**
* Set a single system property by name. A security check may be performed,
* checkPropertyAccess(key, "write")
.
*
* @param key the name of the system property to set
* @param value the new value
* @return the previous value, or null
* @throws SecurityException if permission is denied
* @throws NullPointerException if key is null
* @throws IllegalArgumentException if key is ""
* @since 1.2
*/
public static String setProperty(String key, String value)
{
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPermission(new PropertyPermission(key, "write"));
return (String) properties.setProperty(key, value);
}
/**
* Gets the value of an environment variable.
*
* @param name the name of the environment variable
* @return the string value of the variable
* @throws NullPointerException
* @throws SecurityException if permission is denied
* @since 1.5
*/
public static String getenv(String name)
{
if (name == null)
throw new NullPointerException();
SecurityManager sm = Runtime.securityManager; // Be thread-safe.
if (sm != null)
sm.checkPermission(new RuntimePermission("getenv."+name));
return getenv0(name);
}
/**
* Terminate the Virtual Machine. This just calls
* Runtime.getRuntime().exit(status)
, and never returns.
* Obviously, a security check is in order, checkExit
.
*
* @param status the exit status; by convention non-zero is abnormal
* @throws SecurityException if permission is denied
* @see Runtime#exit(int)
*/
public static void exit(int status)
{
Runtime.getRuntime().exit(status);
}
/**
* Calls the garbage collector. This is only a hint, and it is up to the
* implementation what this hint suggests, but it usually causes a
* best-effort attempt to reclaim unused memory from discarded objects.
* This calls Runtime.getRuntime().gc()
.
*
* @see Runtime#gc()
*/
public static void gc()
{
Runtime.getRuntime().gc();
}
/**
* Runs object finalization on pending objects. This is only a hint, and
* it is up to the implementation what this hint suggests, but it usually
* causes a best-effort attempt to run finalizers on all objects ready
* to be reclaimed. This calls
* Runtime.getRuntime().runFinalization()
.
*
* @see Runtime#runFinalization()
*/
public static void runFinalization()
{
Runtime.getRuntime().runFinalization();
}
/**
* Tell the Runtime whether to run finalization before exiting the
* JVM. This is inherently unsafe in multi-threaded applications,
* since it can force initialization on objects which are still in use
* by live threads, leading to deadlock; therefore this is disabled by
* default. There may be a security check, checkExit(0)
. This
* calls Runtime.getRuntime().runFinalizersOnExit()
.
*
* @param finalizeOnExit whether to run finalizers on exit
* @throws SecurityException if permission is denied
* @see Runtime#runFinalizersOnExit()
* @since 1.1
* @deprecated never rely on finalizers to do a clean, thread-safe,
* mop-up from your code
*/
public static void runFinalizersOnExit(boolean finalizeOnExit)
{
Runtime.getRuntime().runFinalizersOnExit(finalizeOnExit);
}
/**
* Load a code file using its explicit system-dependent filename. A security
* check may be performed, checkLink
. This just calls
* Runtime.getRuntime().load(filename)
.
*
* @param filename the code file to load
* @throws SecurityException if permission is denied
* @throws UnsatisfiedLinkError if the file cannot be loaded
* @see Runtime#load(String)
*/
public static void load(String filename)
{
Runtime.getRuntime().load(filename);
}
/**
* Load a library using its explicit system-dependent filename. A security
* check may be performed, checkLink
. This just calls
* Runtime.getRuntime().load(filename)
.
*
* @param libname the library file to load
* @throws SecurityException if permission is denied
* @throws UnsatisfiedLinkError if the file cannot be loaded
* @see Runtime#load(String)
*/
public static void loadLibrary(String libname)
{
Runtime.getRuntime().loadLibrary(libname);
}
/**
* Convert a library name to its platform-specific variant.
*
* @param libname the library name, as used in loadLibrary
* @return the platform-specific mangling of the name
* @since 1.2
*/
public static String mapLibraryName(String libname)
{
// XXX Fix this!!!!
return Runtime.nativeGetLibname("", libname);
}
/**
* Detect big-endian systems.
*
* @return true if the system is big-endian.
*/
static native boolean isWordsBigEndian();
/**
* Set {@link #in} to a new InputStream.
*
* @param in the new InputStream
* @see #setIn(InputStream)
*/
private static native void setIn0(InputStream in);
/**
* Set {@link #out} to a new PrintStream.
*
* @param out the new PrintStream
* @see #setOut(PrintStream)
*/
private static native void setOut0(PrintStream out);
/**
* Set {@link #err} to a new PrintStream.
*
* @param err the new PrintStream
* @see #setErr(PrintStream)
*/
private static native void setErr0(PrintStream err);
/**
* Gets the value of an environment variable.
*
* @see #getenv(String)
*/
static native String getenv0(String name);
} // class System