merging latest changes from default canvas
authorAnton Epple <toni.epple@eppleton.de>
Sun, 08 Sep 2013 11:22:51 +0200
branchcanvas
changeset 12687937df26a5a7
parent 1267 0f775bd8d210
parent 1261 50c09cb0a3fb
child 1269 8dce385fd361
merging latest changes from default
pom.xml
rt/emul/compact/src/main/java/java/lang/System.java
     1.1 --- a/ko/archetype-test/src/test/java/org/apidesign/bck2brwsr/ko/archetype/test/ArchetypeVersionTest.java	Sun Sep 08 10:58:10 2013 +0200
     1.2 +++ b/ko/archetype-test/src/test/java/org/apidesign/bck2brwsr/ko/archetype/test/ArchetypeVersionTest.java	Sun Sep 08 11:22:51 2013 +0200
     1.3 @@ -64,7 +64,9 @@
     1.4          String arch = (String) xp2.evaluate(dom, XPathConstants.STRING);
     1.5          
     1.6          int snapshot = arch.indexOf("-SNAPSHOT");
     1.7 -        assertEquals(snapshot, -1, "Don't depend on snapshots: " + arch);
     1.8 +        if (snapshot >= 0) {
     1.9 +            arch = arch.substring(0, snapshot);
    1.10 +        }
    1.11  
    1.12          assertTrue(arch.matches("[0-9\\.]+"), "net.java.html.json version seems valid: " + arch);
    1.13      }
     2.1 --- a/pom.xml	Sun Sep 08 10:58:10 2013 +0200
     2.2 +++ b/pom.xml	Sun Sep 08 11:22:51 2013 +0200
     2.3 @@ -65,7 +65,7 @@
     2.4    </pluginRepositories>
     2.5    <build>
     2.6        <plugins>
     2.7 -         <plugin>
     2.8 +<!--         <plugin>
     2.9                <inherited>false</inherited>
    2.10                <groupId>com.mycila.maven-license-plugin</groupId>
    2.11                <artifactId>maven-license-plugin</artifactId>
    2.12 @@ -96,7 +96,7 @@
    2.13                         <exclude>ko/*/src/main/resources/org/apidesign/*/*/knockout-2.2.1.js</exclude>
    2.14                    </excludes>
    2.15                </configuration>
    2.16 -          </plugin>
    2.17 +          </plugin>-->
    2.18             <plugin>
    2.19              <artifactId>maven-release-plugin</artifactId>
    2.20              <version>2.4</version>
    2.21 @@ -114,6 +114,9 @@
    2.22                  <groupId>org.apache.maven.plugins</groupId>
    2.23                  <artifactId>maven-surefire-plugin</artifactId>
    2.24                  <version>2.13</version>
    2.25 +                <configuration>
    2.26 +                    <skipTests>true</skipTests>
    2.27 +                </configuration>
    2.28                </plugin>
    2.29                <plugin>
    2.30                  <groupId>org.apache.maven.plugins</groupId>
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/rt/emul/compact/src/main/java/java/io/BufferedWriter.java	Sun Sep 08 11:22:51 2013 +0200
     3.3 @@ -0,0 +1,271 @@
     3.4 +/*
     3.5 + * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
     3.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3.7 + *
     3.8 + * This code is free software; you can redistribute it and/or modify it
     3.9 + * under the terms of the GNU General Public License version 2 only, as
    3.10 + * published by the Free Software Foundation.  Oracle designates this
    3.11 + * particular file as subject to the "Classpath" exception as provided
    3.12 + * by Oracle in the LICENSE file that accompanied this code.
    3.13 + *
    3.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
    3.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    3.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    3.17 + * version 2 for more details (a copy is included in the LICENSE file that
    3.18 + * accompanied this code).
    3.19 + *
    3.20 + * You should have received a copy of the GNU General Public License version
    3.21 + * 2 along with this work; if not, write to the Free Software Foundation,
    3.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    3.23 + *
    3.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    3.25 + * or visit www.oracle.com if you need additional information or have any
    3.26 + * questions.
    3.27 + */
    3.28 +
    3.29 +package java.io;
    3.30 +
    3.31 +
    3.32 +/**
    3.33 + * Writes text to a character-output stream, buffering characters so as to
    3.34 + * provide for the efficient writing of single characters, arrays, and strings.
    3.35 + *
    3.36 + * <p> The buffer size may be specified, or the default size may be accepted.
    3.37 + * The default is large enough for most purposes.
    3.38 + *
    3.39 + * <p> A newLine() method is provided, which uses the platform's own notion of
    3.40 + * line separator as defined by the system property <tt>line.separator</tt>.
    3.41 + * Not all platforms use the newline character ('\n') to terminate lines.
    3.42 + * Calling this method to terminate each output line is therefore preferred to
    3.43 + * writing a newline character directly.
    3.44 + *
    3.45 + * <p> In general, a Writer sends its output immediately to the underlying
    3.46 + * character or byte stream.  Unless prompt output is required, it is advisable
    3.47 + * to wrap a BufferedWriter around any Writer whose write() operations may be
    3.48 + * costly, such as FileWriters and OutputStreamWriters.  For example,
    3.49 + *
    3.50 + * <pre>
    3.51 + * PrintWriter out
    3.52 + *   = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
    3.53 + * </pre>
    3.54 + *
    3.55 + * will buffer the PrintWriter's output to the file.  Without buffering, each
    3.56 + * invocation of a print() method would cause characters to be converted into
    3.57 + * bytes that would then be written immediately to the file, which can be very
    3.58 + * inefficient.
    3.59 + *
    3.60 + * @see PrintWriter
    3.61 + * @see FileWriter
    3.62 + * @see OutputStreamWriter
    3.63 + * @see java.nio.file.Files#newBufferedWriter
    3.64 + *
    3.65 + * @author      Mark Reinhold
    3.66 + * @since       JDK1.1
    3.67 + */
    3.68 +
    3.69 +public class BufferedWriter extends Writer {
    3.70 +
    3.71 +    private Writer out;
    3.72 +
    3.73 +    private char cb[];
    3.74 +    private int nChars, nextChar;
    3.75 +
    3.76 +    private static int defaultCharBufferSize = 8192;
    3.77 +
    3.78 +    /**
    3.79 +     * Line separator string.  This is the value of the line.separator
    3.80 +     * property at the moment that the stream was created.
    3.81 +     */
    3.82 +    private String lineSeparator;
    3.83 +
    3.84 +    /**
    3.85 +     * Creates a buffered character-output stream that uses a default-sized
    3.86 +     * output buffer.
    3.87 +     *
    3.88 +     * @param  out  A Writer
    3.89 +     */
    3.90 +    public BufferedWriter(Writer out) {
    3.91 +        this(out, defaultCharBufferSize);
    3.92 +    }
    3.93 +
    3.94 +    /**
    3.95 +     * Creates a new buffered character-output stream that uses an output
    3.96 +     * buffer of the given size.
    3.97 +     *
    3.98 +     * @param  out  A Writer
    3.99 +     * @param  sz   Output-buffer size, a positive integer
   3.100 +     *
   3.101 +     * @exception  IllegalArgumentException  If sz is <= 0
   3.102 +     */
   3.103 +    public BufferedWriter(Writer out, int sz) {
   3.104 +        super(out);
   3.105 +        if (sz <= 0)
   3.106 +            throw new IllegalArgumentException("Buffer size <= 0");
   3.107 +        this.out = out;
   3.108 +        cb = new char[sz];
   3.109 +        nChars = sz;
   3.110 +        nextChar = 0;
   3.111 +
   3.112 +        lineSeparator = "\n";
   3.113 +    }
   3.114 +
   3.115 +    /** Checks to make sure that the stream has not been closed */
   3.116 +    private void ensureOpen() throws IOException {
   3.117 +        if (out == null)
   3.118 +            throw new IOException("Stream closed");
   3.119 +    }
   3.120 +
   3.121 +    /**
   3.122 +     * Flushes the output buffer to the underlying character stream, without
   3.123 +     * flushing the stream itself.  This method is non-private only so that it
   3.124 +     * may be invoked by PrintStream.
   3.125 +     */
   3.126 +    void flushBuffer() throws IOException {
   3.127 +        synchronized (lock) {
   3.128 +            ensureOpen();
   3.129 +            if (nextChar == 0)
   3.130 +                return;
   3.131 +            out.write(cb, 0, nextChar);
   3.132 +            nextChar = 0;
   3.133 +        }
   3.134 +    }
   3.135 +
   3.136 +    /**
   3.137 +     * Writes a single character.
   3.138 +     *
   3.139 +     * @exception  IOException  If an I/O error occurs
   3.140 +     */
   3.141 +    public void write(int c) throws IOException {
   3.142 +        synchronized (lock) {
   3.143 +            ensureOpen();
   3.144 +            if (nextChar >= nChars)
   3.145 +                flushBuffer();
   3.146 +            cb[nextChar++] = (char) c;
   3.147 +        }
   3.148 +    }
   3.149 +
   3.150 +    /**
   3.151 +     * Our own little min method, to avoid loading java.lang.Math if we've run
   3.152 +     * out of file descriptors and we're trying to print a stack trace.
   3.153 +     */
   3.154 +    private int min(int a, int b) {
   3.155 +        if (a < b) return a;
   3.156 +        return b;
   3.157 +    }
   3.158 +
   3.159 +    /**
   3.160 +     * Writes a portion of an array of characters.
   3.161 +     *
   3.162 +     * <p> Ordinarily this method stores characters from the given array into
   3.163 +     * this stream's buffer, flushing the buffer to the underlying stream as
   3.164 +     * needed.  If the requested length is at least as large as the buffer,
   3.165 +     * however, then this method will flush the buffer and write the characters
   3.166 +     * directly to the underlying stream.  Thus redundant
   3.167 +     * <code>BufferedWriter</code>s will not copy data unnecessarily.
   3.168 +     *
   3.169 +     * @param  cbuf  A character array
   3.170 +     * @param  off   Offset from which to start reading characters
   3.171 +     * @param  len   Number of characters to write
   3.172 +     *
   3.173 +     * @exception  IOException  If an I/O error occurs
   3.174 +     */
   3.175 +    public void write(char cbuf[], int off, int len) throws IOException {
   3.176 +        synchronized (lock) {
   3.177 +            ensureOpen();
   3.178 +            if ((off < 0) || (off > cbuf.length) || (len < 0) ||
   3.179 +                ((off + len) > cbuf.length) || ((off + len) < 0)) {
   3.180 +                throw new IndexOutOfBoundsException();
   3.181 +            } else if (len == 0) {
   3.182 +                return;
   3.183 +            }
   3.184 +
   3.185 +            if (len >= nChars) {
   3.186 +                /* If the request length exceeds the size of the output buffer,
   3.187 +                   flush the buffer and then write the data directly.  In this
   3.188 +                   way buffered streams will cascade harmlessly. */
   3.189 +                flushBuffer();
   3.190 +                out.write(cbuf, off, len);
   3.191 +                return;
   3.192 +            }
   3.193 +
   3.194 +            int b = off, t = off + len;
   3.195 +            while (b < t) {
   3.196 +                int d = min(nChars - nextChar, t - b);
   3.197 +                System.arraycopy(cbuf, b, cb, nextChar, d);
   3.198 +                b += d;
   3.199 +                nextChar += d;
   3.200 +                if (nextChar >= nChars)
   3.201 +                    flushBuffer();
   3.202 +            }
   3.203 +        }
   3.204 +    }
   3.205 +
   3.206 +    /**
   3.207 +     * Writes a portion of a String.
   3.208 +     *
   3.209 +     * <p> If the value of the <tt>len</tt> parameter is negative then no
   3.210 +     * characters are written.  This is contrary to the specification of this
   3.211 +     * method in the {@linkplain java.io.Writer#write(java.lang.String,int,int)
   3.212 +     * superclass}, which requires that an {@link IndexOutOfBoundsException} be
   3.213 +     * thrown.
   3.214 +     *
   3.215 +     * @param  s     String to be written
   3.216 +     * @param  off   Offset from which to start reading characters
   3.217 +     * @param  len   Number of characters to be written
   3.218 +     *
   3.219 +     * @exception  IOException  If an I/O error occurs
   3.220 +     */
   3.221 +    public void write(String s, int off, int len) throws IOException {
   3.222 +        synchronized (lock) {
   3.223 +            ensureOpen();
   3.224 +
   3.225 +            int b = off, t = off + len;
   3.226 +            while (b < t) {
   3.227 +                int d = min(nChars - nextChar, t - b);
   3.228 +                s.getChars(b, b + d, cb, nextChar);
   3.229 +                b += d;
   3.230 +                nextChar += d;
   3.231 +                if (nextChar >= nChars)
   3.232 +                    flushBuffer();
   3.233 +            }
   3.234 +        }
   3.235 +    }
   3.236 +
   3.237 +    /**
   3.238 +     * Writes a line separator.  The line separator string is defined by the
   3.239 +     * system property <tt>line.separator</tt>, and is not necessarily a single
   3.240 +     * newline ('\n') character.
   3.241 +     *
   3.242 +     * @exception  IOException  If an I/O error occurs
   3.243 +     */
   3.244 +    public void newLine() throws IOException {
   3.245 +        write(lineSeparator);
   3.246 +    }
   3.247 +
   3.248 +    /**
   3.249 +     * Flushes the stream.
   3.250 +     *
   3.251 +     * @exception  IOException  If an I/O error occurs
   3.252 +     */
   3.253 +    public void flush() throws IOException {
   3.254 +        synchronized (lock) {
   3.255 +            flushBuffer();
   3.256 +            out.flush();
   3.257 +        }
   3.258 +    }
   3.259 +
   3.260 +    public void close() throws IOException {
   3.261 +        synchronized (lock) {
   3.262 +            if (out == null) {
   3.263 +                return;
   3.264 +            }
   3.265 +            try {
   3.266 +                flushBuffer();
   3.267 +            } finally {
   3.268 +                out.close();
   3.269 +                out = null;
   3.270 +                cb = null;
   3.271 +            }
   3.272 +        }
   3.273 +    }
   3.274 +}
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/rt/emul/compact/src/main/java/java/io/File.java	Sun Sep 08 11:22:51 2013 +0200
     4.3 @@ -0,0 +1,1927 @@
     4.4 +/*
     4.5 + * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved.
     4.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4.7 + *
     4.8 + * This code is free software; you can redistribute it and/or modify it
     4.9 + * under the terms of the GNU General Public License version 2 only, as
    4.10 + * published by the Free Software Foundation.  Oracle designates this
    4.11 + * particular file as subject to the "Classpath" exception as provided
    4.12 + * by Oracle in the LICENSE file that accompanied this code.
    4.13 + *
    4.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
    4.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    4.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    4.17 + * version 2 for more details (a copy is included in the LICENSE file that
    4.18 + * accompanied this code).
    4.19 + *
    4.20 + * You should have received a copy of the GNU General Public License version
    4.21 + * 2 along with this work; if not, write to the Free Software Foundation,
    4.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    4.23 + *
    4.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    4.25 + * or visit www.oracle.com if you need additional information or have any
    4.26 + * questions.
    4.27 + */
    4.28 +
    4.29 +package java.io;
    4.30 +
    4.31 +import java.net.URI;
    4.32 +import java.net.URL;
    4.33 +import java.net.MalformedURLException;
    4.34 +import java.net.URISyntaxException;
    4.35 +
    4.36 +/**
    4.37 + * An abstract representation of file and directory pathnames.
    4.38 + *
    4.39 + * <p> User interfaces and operating systems use system-dependent <em>pathname
    4.40 + * strings</em> to name files and directories.  This class presents an
    4.41 + * abstract, system-independent view of hierarchical pathnames.  An
    4.42 + * <em>abstract pathname</em> has two components:
    4.43 + *
    4.44 + * <ol>
    4.45 + * <li> An optional system-dependent <em>prefix</em> string,
    4.46 + *      such as a disk-drive specifier, <code>"/"</code>&nbsp;for the UNIX root
    4.47 + *      directory, or <code>"\\\\"</code>&nbsp;for a Microsoft Windows UNC pathname, and
    4.48 + * <li> A sequence of zero or more string <em>names</em>.
    4.49 + * </ol>
    4.50 + *
    4.51 + * The first name in an abstract pathname may be a directory name or, in the
    4.52 + * case of Microsoft Windows UNC pathnames, a hostname.  Each subsequent name
    4.53 + * in an abstract pathname denotes a directory; the last name may denote
    4.54 + * either a directory or a file.  The <em>empty</em> abstract pathname has no
    4.55 + * prefix and an empty name sequence.
    4.56 + *
    4.57 + * <p> The conversion of a pathname string to or from an abstract pathname is
    4.58 + * inherently system-dependent.  When an abstract pathname is converted into a
    4.59 + * pathname string, each name is separated from the next by a single copy of
    4.60 + * the default <em>separator character</em>.  The default name-separator
    4.61 + * character is defined by the system property <code>file.separator</code>, and
    4.62 + * is made available in the public static fields <code>{@link
    4.63 + * #separator}</code> and <code>{@link #separatorChar}</code> of this class.
    4.64 + * When a pathname string is converted into an abstract pathname, the names
    4.65 + * within it may be separated by the default name-separator character or by any
    4.66 + * other name-separator character that is supported by the underlying system.
    4.67 + *
    4.68 + * <p> A pathname, whether abstract or in string form, may be either
    4.69 + * <em>absolute</em> or <em>relative</em>.  An absolute pathname is complete in
    4.70 + * that no other information is required in order to locate the file that it
    4.71 + * denotes.  A relative pathname, in contrast, must be interpreted in terms of
    4.72 + * information taken from some other pathname.  By default the classes in the
    4.73 + * <code>java.io</code> package always resolve relative pathnames against the
    4.74 + * current user directory.  This directory is named by the system property
    4.75 + * <code>user.dir</code>, and is typically the directory in which the Java
    4.76 + * virtual machine was invoked.
    4.77 + *
    4.78 + * <p> The <em>parent</em> of an abstract pathname may be obtained by invoking
    4.79 + * the {@link #getParent} method of this class and consists of the pathname's
    4.80 + * prefix and each name in the pathname's name sequence except for the last.
    4.81 + * Each directory's absolute pathname is an ancestor of any <tt>File</tt>
    4.82 + * object with an absolute abstract pathname which begins with the directory's
    4.83 + * absolute pathname.  For example, the directory denoted by the abstract
    4.84 + * pathname <tt>"/usr"</tt> is an ancestor of the directory denoted by the
    4.85 + * pathname <tt>"/usr/local/bin"</tt>.
    4.86 + *
    4.87 + * <p> The prefix concept is used to handle root directories on UNIX platforms,
    4.88 + * and drive specifiers, root directories and UNC pathnames on Microsoft Windows platforms,
    4.89 + * as follows:
    4.90 + *
    4.91 + * <ul>
    4.92 + *
    4.93 + * <li> For UNIX platforms, the prefix of an absolute pathname is always
    4.94 + * <code>"/"</code>.  Relative pathnames have no prefix.  The abstract pathname
    4.95 + * denoting the root directory has the prefix <code>"/"</code> and an empty
    4.96 + * name sequence.
    4.97 + *
    4.98 + * <li> For Microsoft Windows platforms, the prefix of a pathname that contains a drive
    4.99 + * specifier consists of the drive letter followed by <code>":"</code> and
   4.100 + * possibly followed by <code>"\\"</code> if the pathname is absolute.  The
   4.101 + * prefix of a UNC pathname is <code>"\\\\"</code>; the hostname and the share
   4.102 + * name are the first two names in the name sequence.  A relative pathname that
   4.103 + * does not specify a drive has no prefix.
   4.104 + *
   4.105 + * </ul>
   4.106 + *
   4.107 + * <p> Instances of this class may or may not denote an actual file-system
   4.108 + * object such as a file or a directory.  If it does denote such an object
   4.109 + * then that object resides in a <i>partition</i>.  A partition is an
   4.110 + * operating system-specific portion of storage for a file system.  A single
   4.111 + * storage device (e.g. a physical disk-drive, flash memory, CD-ROM) may
   4.112 + * contain multiple partitions.  The object, if any, will reside on the
   4.113 + * partition <a name="partName">named</a> by some ancestor of the absolute
   4.114 + * form of this pathname.
   4.115 + *
   4.116 + * <p> A file system may implement restrictions to certain operations on the
   4.117 + * actual file-system object, such as reading, writing, and executing.  These
   4.118 + * restrictions are collectively known as <i>access permissions</i>.  The file
   4.119 + * system may have multiple sets of access permissions on a single object.
   4.120 + * For example, one set may apply to the object's <i>owner</i>, and another
   4.121 + * may apply to all other users.  The access permissions on an object may
   4.122 + * cause some methods in this class to fail.
   4.123 + *
   4.124 + * <p> Instances of the <code>File</code> class are immutable; that is, once
   4.125 + * created, the abstract pathname represented by a <code>File</code> object
   4.126 + * will never change.
   4.127 + *
   4.128 + * <h4>Interoperability with {@code java.nio.file} package</h4>
   4.129 + *
   4.130 + * <p> The <a href="../../java/nio/file/package-summary.html">{@code java.nio.file}</a>
   4.131 + * package defines interfaces and classes for the Java virtual machine to access
   4.132 + * files, file attributes, and file systems. This API may be used to overcome
   4.133 + * many of the limitations of the {@code java.io.File} class.
   4.134 + * The {@link #toPath toPath} method may be used to obtain a {@link
   4.135 + * Path} that uses the abstract path represented by a {@code File} object to
   4.136 + * locate a file. The resulting {@code Path} may be used with the {@link
   4.137 + * java.nio.file.Files} class to provide more efficient and extensive access to
   4.138 + * additional file operations, file attributes, and I/O exceptions to help
   4.139 + * diagnose errors when an operation on a file fails.
   4.140 + *
   4.141 + * @author  unascribed
   4.142 + * @since   JDK1.0
   4.143 + */
   4.144 +
   4.145 +public class File
   4.146 +    implements Serializable, Comparable<File>
   4.147 +{
   4.148 +
   4.149 +    /**
   4.150 +     * The FileSystem object representing the platform's local file system.
   4.151 +     */
   4.152 +    static private FileSystem fs = new FileSystem();
   4.153 +    private static class FileSystem {
   4.154 +
   4.155 +        private char getSeparator() {
   4.156 +            return '/';
   4.157 +        }
   4.158 +
   4.159 +        private String resolve(String path, String child) {
   4.160 +            return path + '/' + child;
   4.161 +        }
   4.162 +
   4.163 +        private String normalize(String pathname) {
   4.164 +            return pathname;
   4.165 +        }
   4.166 +
   4.167 +        private int prefixLength(String path) {
   4.168 +            return 0;
   4.169 +        }
   4.170 +
   4.171 +        private String getDefaultParent() {
   4.172 +            return "/";
   4.173 +        }
   4.174 +
   4.175 +        private String fromURIPath(String p) {
   4.176 +            return p;
   4.177 +        }
   4.178 +
   4.179 +        private boolean isAbsolute(File aThis) {
   4.180 +            return aThis.getPath().startsWith("/");
   4.181 +        }
   4.182 +
   4.183 +        private int compare(File one, File two) {
   4.184 +            return one.getPath().compareTo(two.getPath());
   4.185 +        }
   4.186 +
   4.187 +        private int hashCode(File aThis) {
   4.188 +            return aThis.getPath().hashCode();
   4.189 +        }
   4.190 +
   4.191 +        private char getPathSeparator() {
   4.192 +            return ':';
   4.193 +        }
   4.194 +        
   4.195 +    }
   4.196 +
   4.197 +    /**
   4.198 +     * This abstract pathname's normalized pathname string.  A normalized
   4.199 +     * pathname string uses the default name-separator character and does not
   4.200 +     * contain any duplicate or redundant separators.
   4.201 +     *
   4.202 +     * @serial
   4.203 +     */
   4.204 +    private String path;
   4.205 +
   4.206 +    /**
   4.207 +     * The length of this abstract pathname's prefix, or zero if it has no
   4.208 +     * prefix.
   4.209 +     */
   4.210 +    private transient int prefixLength;
   4.211 +
   4.212 +    /**
   4.213 +     * Returns the length of this abstract pathname's prefix.
   4.214 +     * For use by FileSystem classes.
   4.215 +     */
   4.216 +    int getPrefixLength() {
   4.217 +        return prefixLength;
   4.218 +    }
   4.219 +
   4.220 +    /**
   4.221 +     * The system-dependent default name-separator character.  This field is
   4.222 +     * initialized to contain the first character of the value of the system
   4.223 +     * property <code>file.separator</code>.  On UNIX systems the value of this
   4.224 +     * field is <code>'/'</code>; on Microsoft Windows systems it is <code>'\\'</code>.
   4.225 +     *
   4.226 +     * @see     java.lang.System#getProperty(java.lang.String)
   4.227 +     */
   4.228 +    public static final char separatorChar = fs.getSeparator();
   4.229 +
   4.230 +    /**
   4.231 +     * The system-dependent default name-separator character, represented as a
   4.232 +     * string for convenience.  This string contains a single character, namely
   4.233 +     * <code>{@link #separatorChar}</code>.
   4.234 +     */
   4.235 +    public static final String separator = "" + separatorChar;
   4.236 +
   4.237 +    /**
   4.238 +     * The system-dependent path-separator character.  This field is
   4.239 +     * initialized to contain the first character of the value of the system
   4.240 +     * property <code>path.separator</code>.  This character is used to
   4.241 +     * separate filenames in a sequence of files given as a <em>path list</em>.
   4.242 +     * On UNIX systems, this character is <code>':'</code>; on Microsoft Windows systems it
   4.243 +     * is <code>';'</code>.
   4.244 +     *
   4.245 +     * @see     java.lang.System#getProperty(java.lang.String)
   4.246 +     */
   4.247 +    public static final char pathSeparatorChar = fs.getPathSeparator();
   4.248 +
   4.249 +    /**
   4.250 +     * The system-dependent path-separator character, represented as a string
   4.251 +     * for convenience.  This string contains a single character, namely
   4.252 +     * <code>{@link #pathSeparatorChar}</code>.
   4.253 +     */
   4.254 +    public static final String pathSeparator = "" + pathSeparatorChar;
   4.255 +
   4.256 +
   4.257 +    /* -- Constructors -- */
   4.258 +
   4.259 +    /**
   4.260 +     * Internal constructor for already-normalized pathname strings.
   4.261 +     */
   4.262 +    private File(String pathname, int prefixLength) {
   4.263 +        this.path = pathname;
   4.264 +        this.prefixLength = prefixLength;
   4.265 +    }
   4.266 +
   4.267 +    /**
   4.268 +     * Internal constructor for already-normalized pathname strings.
   4.269 +     * The parameter order is used to disambiguate this method from the
   4.270 +     * public(File, String) constructor.
   4.271 +     */
   4.272 +    private File(String child, File parent) {
   4.273 +        assert parent.path != null;
   4.274 +        assert (!parent.path.equals(""));
   4.275 +        this.path = fs.resolve(parent.path, child);
   4.276 +        this.prefixLength = parent.prefixLength;
   4.277 +    }
   4.278 +
   4.279 +    /**
   4.280 +     * Creates a new <code>File</code> instance by converting the given
   4.281 +     * pathname string into an abstract pathname.  If the given string is
   4.282 +     * the empty string, then the result is the empty abstract pathname.
   4.283 +     *
   4.284 +     * @param   pathname  A pathname string
   4.285 +     * @throws  NullPointerException
   4.286 +     *          If the <code>pathname</code> argument is <code>null</code>
   4.287 +     */
   4.288 +    public File(String pathname) {
   4.289 +        if (pathname == null) {
   4.290 +            throw new NullPointerException();
   4.291 +        }
   4.292 +        this.path = fs.normalize(pathname);
   4.293 +        this.prefixLength = fs.prefixLength(this.path);
   4.294 +    }
   4.295 +
   4.296 +    /* Note: The two-argument File constructors do not interpret an empty
   4.297 +       parent abstract pathname as the current user directory.  An empty parent
   4.298 +       instead causes the child to be resolved against the system-dependent
   4.299 +       directory defined by the FileSystem.getDefaultParent method.  On Unix
   4.300 +       this default is "/", while on Microsoft Windows it is "\\".  This is required for
   4.301 +       compatibility with the original behavior of this class. */
   4.302 +
   4.303 +    /**
   4.304 +     * Creates a new <code>File</code> instance from a parent pathname string
   4.305 +     * and a child pathname string.
   4.306 +     *
   4.307 +     * <p> If <code>parent</code> is <code>null</code> then the new
   4.308 +     * <code>File</code> instance is created as if by invoking the
   4.309 +     * single-argument <code>File</code> constructor on the given
   4.310 +     * <code>child</code> pathname string.
   4.311 +     *
   4.312 +     * <p> Otherwise the <code>parent</code> pathname string is taken to denote
   4.313 +     * a directory, and the <code>child</code> pathname string is taken to
   4.314 +     * denote either a directory or a file.  If the <code>child</code> pathname
   4.315 +     * string is absolute then it is converted into a relative pathname in a
   4.316 +     * system-dependent way.  If <code>parent</code> is the empty string then
   4.317 +     * the new <code>File</code> instance is created by converting
   4.318 +     * <code>child</code> into an abstract pathname and resolving the result
   4.319 +     * against a system-dependent default directory.  Otherwise each pathname
   4.320 +     * string is converted into an abstract pathname and the child abstract
   4.321 +     * pathname is resolved against the parent.
   4.322 +     *
   4.323 +     * @param   parent  The parent pathname string
   4.324 +     * @param   child   The child pathname string
   4.325 +     * @throws  NullPointerException
   4.326 +     *          If <code>child</code> is <code>null</code>
   4.327 +     */
   4.328 +    public File(String parent, String child) {
   4.329 +        if (child == null) {
   4.330 +            throw new NullPointerException();
   4.331 +        }
   4.332 +        if (parent != null) {
   4.333 +            if (parent.equals("")) {
   4.334 +                this.path = fs.resolve(fs.getDefaultParent(),
   4.335 +                                       fs.normalize(child));
   4.336 +            } else {
   4.337 +                this.path = fs.resolve(fs.normalize(parent),
   4.338 +                                       fs.normalize(child));
   4.339 +            }
   4.340 +        } else {
   4.341 +            this.path = fs.normalize(child);
   4.342 +        }
   4.343 +        this.prefixLength = fs.prefixLength(this.path);
   4.344 +    }
   4.345 +
   4.346 +    /**
   4.347 +     * Creates a new <code>File</code> instance from a parent abstract
   4.348 +     * pathname and a child pathname string.
   4.349 +     *
   4.350 +     * <p> If <code>parent</code> is <code>null</code> then the new
   4.351 +     * <code>File</code> instance is created as if by invoking the
   4.352 +     * single-argument <code>File</code> constructor on the given
   4.353 +     * <code>child</code> pathname string.
   4.354 +     *
   4.355 +     * <p> Otherwise the <code>parent</code> abstract pathname is taken to
   4.356 +     * denote a directory, and the <code>child</code> pathname string is taken
   4.357 +     * to denote either a directory or a file.  If the <code>child</code>
   4.358 +     * pathname string is absolute then it is converted into a relative
   4.359 +     * pathname in a system-dependent way.  If <code>parent</code> is the empty
   4.360 +     * abstract pathname then the new <code>File</code> instance is created by
   4.361 +     * converting <code>child</code> into an abstract pathname and resolving
   4.362 +     * the result against a system-dependent default directory.  Otherwise each
   4.363 +     * pathname string is converted into an abstract pathname and the child
   4.364 +     * abstract pathname is resolved against the parent.
   4.365 +     *
   4.366 +     * @param   parent  The parent abstract pathname
   4.367 +     * @param   child   The child pathname string
   4.368 +     * @throws  NullPointerException
   4.369 +     *          If <code>child</code> is <code>null</code>
   4.370 +     */
   4.371 +    public File(File parent, String child) {
   4.372 +        if (child == null) {
   4.373 +            throw new NullPointerException();
   4.374 +        }
   4.375 +        if (parent != null) {
   4.376 +            if (parent.path.equals("")) {
   4.377 +                this.path = fs.resolve(fs.getDefaultParent(),
   4.378 +                                       fs.normalize(child));
   4.379 +            } else {
   4.380 +                this.path = fs.resolve(parent.path,
   4.381 +                                       fs.normalize(child));
   4.382 +            }
   4.383 +        } else {
   4.384 +            this.path = fs.normalize(child);
   4.385 +        }
   4.386 +        this.prefixLength = fs.prefixLength(this.path);
   4.387 +    }
   4.388 +
   4.389 +    /**
   4.390 +     * Creates a new <tt>File</tt> instance by converting the given
   4.391 +     * <tt>file:</tt> URI into an abstract pathname.
   4.392 +     *
   4.393 +     * <p> The exact form of a <tt>file:</tt> URI is system-dependent, hence
   4.394 +     * the transformation performed by this constructor is also
   4.395 +     * system-dependent.
   4.396 +     *
   4.397 +     * <p> For a given abstract pathname <i>f</i> it is guaranteed that
   4.398 +     *
   4.399 +     * <blockquote><tt>
   4.400 +     * new File(</tt><i>&nbsp;f</i><tt>.{@link #toURI() toURI}()).equals(</tt><i>&nbsp;f</i><tt>.{@link #getAbsoluteFile() getAbsoluteFile}())
   4.401 +     * </tt></blockquote>
   4.402 +     *
   4.403 +     * so long as the original abstract pathname, the URI, and the new abstract
   4.404 +     * pathname are all created in (possibly different invocations of) the same
   4.405 +     * Java virtual machine.  This relationship typically does not hold,
   4.406 +     * however, when a <tt>file:</tt> URI that is created in a virtual machine
   4.407 +     * on one operating system is converted into an abstract pathname in a
   4.408 +     * virtual machine on a different operating system.
   4.409 +     *
   4.410 +     * @param  uri
   4.411 +     *         An absolute, hierarchical URI with a scheme equal to
   4.412 +     *         <tt>"file"</tt>, a non-empty path component, and undefined
   4.413 +     *         authority, query, and fragment components
   4.414 +     *
   4.415 +     * @throws  NullPointerException
   4.416 +     *          If <tt>uri</tt> is <tt>null</tt>
   4.417 +     *
   4.418 +     * @throws  IllegalArgumentException
   4.419 +     *          If the preconditions on the parameter do not hold
   4.420 +     *
   4.421 +     * @see #toURI()
   4.422 +     * @see java.net.URI
   4.423 +     * @since 1.4
   4.424 +     */
   4.425 +    public File(URI uri) {
   4.426 +
   4.427 +        // Check our many preconditions
   4.428 +        if (!uri.isAbsolute())
   4.429 +            throw new IllegalArgumentException("URI is not absolute");
   4.430 +        if (uri.isOpaque())
   4.431 +            throw new IllegalArgumentException("URI is not hierarchical");
   4.432 +        String scheme = uri.getScheme();
   4.433 +        if ((scheme == null) || !scheme.equalsIgnoreCase("file"))
   4.434 +            throw new IllegalArgumentException("URI scheme is not \"file\"");
   4.435 +        if (uri.getAuthority() != null)
   4.436 +            throw new IllegalArgumentException("URI has an authority component");
   4.437 +        if (uri.getFragment() != null)
   4.438 +            throw new IllegalArgumentException("URI has a fragment component");
   4.439 +        if (uri.getQuery() != null)
   4.440 +            throw new IllegalArgumentException("URI has a query component");
   4.441 +        String p = uri.getPath();
   4.442 +        if (p.equals(""))
   4.443 +            throw new IllegalArgumentException("URI path component is empty");
   4.444 +
   4.445 +        // Okay, now initialize
   4.446 +        p = fs.fromURIPath(p);
   4.447 +        if (File.separatorChar != '/')
   4.448 +            p = p.replace('/', File.separatorChar);
   4.449 +        this.path = fs.normalize(p);
   4.450 +        this.prefixLength = fs.prefixLength(this.path);
   4.451 +    }
   4.452 +
   4.453 +
   4.454 +    /* -- Path-component accessors -- */
   4.455 +
   4.456 +    /**
   4.457 +     * Returns the name of the file or directory denoted by this abstract
   4.458 +     * pathname.  This is just the last name in the pathname's name
   4.459 +     * sequence.  If the pathname's name sequence is empty, then the empty
   4.460 +     * string is returned.
   4.461 +     *
   4.462 +     * @return  The name of the file or directory denoted by this abstract
   4.463 +     *          pathname, or the empty string if this pathname's name sequence
   4.464 +     *          is empty
   4.465 +     */
   4.466 +    public String getName() {
   4.467 +        int index = path.lastIndexOf(separatorChar);
   4.468 +        if (index < prefixLength) return path.substring(prefixLength);
   4.469 +        return path.substring(index + 1);
   4.470 +    }
   4.471 +
   4.472 +    /**
   4.473 +     * Returns the pathname string of this abstract pathname's parent, or
   4.474 +     * <code>null</code> if this pathname does not name a parent directory.
   4.475 +     *
   4.476 +     * <p> The <em>parent</em> of an abstract pathname consists of the
   4.477 +     * pathname's prefix, if any, and each name in the pathname's name
   4.478 +     * sequence except for the last.  If the name sequence is empty then
   4.479 +     * the pathname does not name a parent directory.
   4.480 +     *
   4.481 +     * @return  The pathname string of the parent directory named by this
   4.482 +     *          abstract pathname, or <code>null</code> if this pathname
   4.483 +     *          does not name a parent
   4.484 +     */
   4.485 +    public String getParent() {
   4.486 +        int index = path.lastIndexOf(separatorChar);
   4.487 +        if (index < prefixLength) {
   4.488 +            if ((prefixLength > 0) && (path.length() > prefixLength))
   4.489 +                return path.substring(0, prefixLength);
   4.490 +            return null;
   4.491 +        }
   4.492 +        return path.substring(0, index);
   4.493 +    }
   4.494 +
   4.495 +    /**
   4.496 +     * Returns the abstract pathname of this abstract pathname's parent,
   4.497 +     * or <code>null</code> if this pathname does not name a parent
   4.498 +     * directory.
   4.499 +     *
   4.500 +     * <p> The <em>parent</em> of an abstract pathname consists of the
   4.501 +     * pathname's prefix, if any, and each name in the pathname's name
   4.502 +     * sequence except for the last.  If the name sequence is empty then
   4.503 +     * the pathname does not name a parent directory.
   4.504 +     *
   4.505 +     * @return  The abstract pathname of the parent directory named by this
   4.506 +     *          abstract pathname, or <code>null</code> if this pathname
   4.507 +     *          does not name a parent
   4.508 +     *
   4.509 +     * @since 1.2
   4.510 +     */
   4.511 +    public File getParentFile() {
   4.512 +        String p = this.getParent();
   4.513 +        if (p == null) return null;
   4.514 +        return new File(p, this.prefixLength);
   4.515 +    }
   4.516 +
   4.517 +    /**
   4.518 +     * Converts this abstract pathname into a pathname string.  The resulting
   4.519 +     * string uses the {@link #separator default name-separator character} to
   4.520 +     * separate the names in the name sequence.
   4.521 +     *
   4.522 +     * @return  The string form of this abstract pathname
   4.523 +     */
   4.524 +    public String getPath() {
   4.525 +        return path;
   4.526 +    }
   4.527 +
   4.528 +
   4.529 +    /* -- Path operations -- */
   4.530 +
   4.531 +    /**
   4.532 +     * Tests whether this abstract pathname is absolute.  The definition of
   4.533 +     * absolute pathname is system dependent.  On UNIX systems, a pathname is
   4.534 +     * absolute if its prefix is <code>"/"</code>.  On Microsoft Windows systems, a
   4.535 +     * pathname is absolute if its prefix is a drive specifier followed by
   4.536 +     * <code>"\\"</code>, or if its prefix is <code>"\\\\"</code>.
   4.537 +     *
   4.538 +     * @return  <code>true</code> if this abstract pathname is absolute,
   4.539 +     *          <code>false</code> otherwise
   4.540 +     */
   4.541 +    public boolean isAbsolute() {
   4.542 +        return fs.isAbsolute(this);
   4.543 +    }
   4.544 +
   4.545 +    /**
   4.546 +     * Returns the absolute pathname string of this abstract pathname.
   4.547 +     *
   4.548 +     * <p> If this abstract pathname is already absolute, then the pathname
   4.549 +     * string is simply returned as if by the <code>{@link #getPath}</code>
   4.550 +     * method.  If this abstract pathname is the empty abstract pathname then
   4.551 +     * the pathname string of the current user directory, which is named by the
   4.552 +     * system property <code>user.dir</code>, is returned.  Otherwise this
   4.553 +     * pathname is resolved in a system-dependent way.  On UNIX systems, a
   4.554 +     * relative pathname is made absolute by resolving it against the current
   4.555 +     * user directory.  On Microsoft Windows systems, a relative pathname is made absolute
   4.556 +     * by resolving it against the current directory of the drive named by the
   4.557 +     * pathname, if any; if not, it is resolved against the current user
   4.558 +     * directory.
   4.559 +     *
   4.560 +     * @return  The absolute pathname string denoting the same file or
   4.561 +     *          directory as this abstract pathname
   4.562 +     *
   4.563 +     * @throws  SecurityException
   4.564 +     *          If a required system property value cannot be accessed.
   4.565 +     *
   4.566 +     * @see     java.io.File#isAbsolute()
   4.567 +     */
   4.568 +    public String getAbsolutePath() {
   4.569 +        throw new SecurityException();
   4.570 +    }
   4.571 +
   4.572 +    /**
   4.573 +     * Returns the absolute form of this abstract pathname.  Equivalent to
   4.574 +     * <code>new&nbsp;File(this.{@link #getAbsolutePath})</code>.
   4.575 +     *
   4.576 +     * @return  The absolute abstract pathname denoting the same file or
   4.577 +     *          directory as this abstract pathname
   4.578 +     *
   4.579 +     * @throws  SecurityException
   4.580 +     *          If a required system property value cannot be accessed.
   4.581 +     *
   4.582 +     * @since 1.2
   4.583 +     */
   4.584 +    public File getAbsoluteFile() {
   4.585 +        String absPath = getAbsolutePath();
   4.586 +        return new File(absPath, fs.prefixLength(absPath));
   4.587 +    }
   4.588 +
   4.589 +    /**
   4.590 +     * Returns the canonical pathname string of this abstract pathname.
   4.591 +     *
   4.592 +     * <p> A canonical pathname is both absolute and unique.  The precise
   4.593 +     * definition of canonical form is system-dependent.  This method first
   4.594 +     * converts this pathname to absolute form if necessary, as if by invoking the
   4.595 +     * {@link #getAbsolutePath} method, and then maps it to its unique form in a
   4.596 +     * system-dependent way.  This typically involves removing redundant names
   4.597 +     * such as <tt>"."</tt> and <tt>".."</tt> from the pathname, resolving
   4.598 +     * symbolic links (on UNIX platforms), and converting drive letters to a
   4.599 +     * standard case (on Microsoft Windows platforms).
   4.600 +     *
   4.601 +     * <p> Every pathname that denotes an existing file or directory has a
   4.602 +     * unique canonical form.  Every pathname that denotes a nonexistent file
   4.603 +     * or directory also has a unique canonical form.  The canonical form of
   4.604 +     * the pathname of a nonexistent file or directory may be different from
   4.605 +     * the canonical form of the same pathname after the file or directory is
   4.606 +     * created.  Similarly, the canonical form of the pathname of an existing
   4.607 +     * file or directory may be different from the canonical form of the same
   4.608 +     * pathname after the file or directory is deleted.
   4.609 +     *
   4.610 +     * @return  The canonical pathname string denoting the same file or
   4.611 +     *          directory as this abstract pathname
   4.612 +     *
   4.613 +     * @throws  IOException
   4.614 +     *          If an I/O error occurs, which is possible because the
   4.615 +     *          construction of the canonical pathname may require
   4.616 +     *          filesystem queries
   4.617 +     *
   4.618 +     * @throws  SecurityException
   4.619 +     *          If a required system property value cannot be accessed, or
   4.620 +     *          if a security manager exists and its <code>{@link
   4.621 +     *          java.lang.SecurityManager#checkRead}</code> method denies
   4.622 +     *          read access to the file
   4.623 +     *
   4.624 +     * @since   JDK1.1
   4.625 +     * @see     Path#toRealPath
   4.626 +     */
   4.627 +    public String getCanonicalPath() throws IOException {
   4.628 +        throw new SecurityException();
   4.629 +    }
   4.630 +
   4.631 +    /**
   4.632 +     * Returns the canonical form of this abstract pathname.  Equivalent to
   4.633 +     * <code>new&nbsp;File(this.{@link #getCanonicalPath})</code>.
   4.634 +     *
   4.635 +     * @return  The canonical pathname string denoting the same file or
   4.636 +     *          directory as this abstract pathname
   4.637 +     *
   4.638 +     * @throws  IOException
   4.639 +     *          If an I/O error occurs, which is possible because the
   4.640 +     *          construction of the canonical pathname may require
   4.641 +     *          filesystem queries
   4.642 +     *
   4.643 +     * @throws  SecurityException
   4.644 +     *          If a required system property value cannot be accessed, or
   4.645 +     *          if a security manager exists and its <code>{@link
   4.646 +     *          java.lang.SecurityManager#checkRead}</code> method denies
   4.647 +     *          read access to the file
   4.648 +     *
   4.649 +     * @since 1.2
   4.650 +     * @see     Path#toRealPath
   4.651 +     */
   4.652 +    public File getCanonicalFile() throws IOException {
   4.653 +        String canonPath = getCanonicalPath();
   4.654 +        return new File(canonPath, fs.prefixLength(canonPath));
   4.655 +    }
   4.656 +
   4.657 +    private static String slashify(String path, boolean isDirectory) {
   4.658 +        String p = path;
   4.659 +        if (File.separatorChar != '/')
   4.660 +            p = p.replace(File.separatorChar, '/');
   4.661 +        if (!p.startsWith("/"))
   4.662 +            p = "/" + p;
   4.663 +        if (!p.endsWith("/") && isDirectory)
   4.664 +            p = p + "/";
   4.665 +        return p;
   4.666 +    }
   4.667 +
   4.668 +    /**
   4.669 +     * Converts this abstract pathname into a <code>file:</code> URL.  The
   4.670 +     * exact form of the URL is system-dependent.  If it can be determined that
   4.671 +     * the file denoted by this abstract pathname is a directory, then the
   4.672 +     * resulting URL will end with a slash.
   4.673 +     *
   4.674 +     * @return  A URL object representing the equivalent file URL
   4.675 +     *
   4.676 +     * @throws  MalformedURLException
   4.677 +     *          If the path cannot be parsed as a URL
   4.678 +     *
   4.679 +     * @see     #toURI()
   4.680 +     * @see     java.net.URI
   4.681 +     * @see     java.net.URI#toURL()
   4.682 +     * @see     java.net.URL
   4.683 +     * @since   1.2
   4.684 +     *
   4.685 +     * @deprecated This method does not automatically escape characters that
   4.686 +     * are illegal in URLs.  It is recommended that new code convert an
   4.687 +     * abstract pathname into a URL by first converting it into a URI, via the
   4.688 +     * {@link #toURI() toURI} method, and then converting the URI into a URL
   4.689 +     * via the {@link java.net.URI#toURL() URI.toURL} method.
   4.690 +     */
   4.691 +    @Deprecated
   4.692 +    public URL toURL() throws MalformedURLException {
   4.693 +        return new URL("file", "", slashify(getAbsolutePath(), isDirectory()));
   4.694 +    }
   4.695 +
   4.696 +    /**
   4.697 +     * Constructs a <tt>file:</tt> URI that represents this abstract pathname.
   4.698 +     *
   4.699 +     * <p> The exact form of the URI is system-dependent.  If it can be
   4.700 +     * determined that the file denoted by this abstract pathname is a
   4.701 +     * directory, then the resulting URI will end with a slash.
   4.702 +     *
   4.703 +     * <p> For a given abstract pathname <i>f</i>, it is guaranteed that
   4.704 +     *
   4.705 +     * <blockquote><tt>
   4.706 +     * new {@link #File(java.net.URI) File}(</tt><i>&nbsp;f</i><tt>.toURI()).equals(</tt><i>&nbsp;f</i><tt>.{@link #getAbsoluteFile() getAbsoluteFile}())
   4.707 +     * </tt></blockquote>
   4.708 +     *
   4.709 +     * so long as the original abstract pathname, the URI, and the new abstract
   4.710 +     * pathname are all created in (possibly different invocations of) the same
   4.711 +     * Java virtual machine.  Due to the system-dependent nature of abstract
   4.712 +     * pathnames, however, this relationship typically does not hold when a
   4.713 +     * <tt>file:</tt> URI that is created in a virtual machine on one operating
   4.714 +     * system is converted into an abstract pathname in a virtual machine on a
   4.715 +     * different operating system.
   4.716 +     *
   4.717 +     * <p> Note that when this abstract pathname represents a UNC pathname then
   4.718 +     * all components of the UNC (including the server name component) are encoded
   4.719 +     * in the {@code URI} path. The authority component is undefined, meaning
   4.720 +     * that it is represented as {@code null}. The {@link Path} class defines the
   4.721 +     * {@link Path#toUri toUri} method to encode the server name in the authority
   4.722 +     * component of the resulting {@code URI}. The {@link #toPath toPath} method
   4.723 +     * may be used to obtain a {@code Path} representing this abstract pathname.
   4.724 +     *
   4.725 +     * @return  An absolute, hierarchical URI with a scheme equal to
   4.726 +     *          <tt>"file"</tt>, a path representing this abstract pathname,
   4.727 +     *          and undefined authority, query, and fragment components
   4.728 +     * @throws SecurityException If a required system property value cannot
   4.729 +     * be accessed.
   4.730 +     *
   4.731 +     * @see #File(java.net.URI)
   4.732 +     * @see java.net.URI
   4.733 +     * @see java.net.URI#toURL()
   4.734 +     * @since 1.4
   4.735 +     */
   4.736 +    public URI toURI() {
   4.737 +        try {
   4.738 +            File f = getAbsoluteFile();
   4.739 +            String sp = slashify(f.getPath(), f.isDirectory());
   4.740 +            if (sp.startsWith("//"))
   4.741 +                sp = "//" + sp;
   4.742 +            return new URI("file", null, sp, null);
   4.743 +        } catch (URISyntaxException x) {
   4.744 +            throw new Error(x);         // Can't happen
   4.745 +        }
   4.746 +    }
   4.747 +
   4.748 +
   4.749 +    /* -- Attribute accessors -- */
   4.750 +
   4.751 +    /**
   4.752 +     * Tests whether the application can read the file denoted by this
   4.753 +     * abstract pathname.
   4.754 +     *
   4.755 +     * @return  <code>true</code> if and only if the file specified by this
   4.756 +     *          abstract pathname exists <em>and</em> can be read by the
   4.757 +     *          application; <code>false</code> otherwise
   4.758 +     *
   4.759 +     * @throws  SecurityException
   4.760 +     *          If a security manager exists and its <code>{@link
   4.761 +     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
   4.762 +     *          method denies read access to the file
   4.763 +     */
   4.764 +    public boolean canRead() {
   4.765 +        throw new SecurityException();
   4.766 +    }
   4.767 +
   4.768 +    /**
   4.769 +     * Tests whether the application can modify the file denoted by this
   4.770 +     * abstract pathname.
   4.771 +     *
   4.772 +     * @return  <code>true</code> if and only if the file system actually
   4.773 +     *          contains a file denoted by this abstract pathname <em>and</em>
   4.774 +     *          the application is allowed to write to the file;
   4.775 +     *          <code>false</code> otherwise.
   4.776 +     *
   4.777 +     * @throws  SecurityException
   4.778 +     *          If a security manager exists and its <code>{@link
   4.779 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
   4.780 +     *          method denies write access to the file
   4.781 +     */
   4.782 +    public boolean canWrite() {
   4.783 +        throw new SecurityException();
   4.784 +    }
   4.785 +
   4.786 +    /**
   4.787 +     * Tests whether the file or directory denoted by this abstract pathname
   4.788 +     * exists.
   4.789 +     *
   4.790 +     * @return  <code>true</code> if and only if the file or directory denoted
   4.791 +     *          by this abstract pathname exists; <code>false</code> otherwise
   4.792 +     *
   4.793 +     * @throws  SecurityException
   4.794 +     *          If a security manager exists and its <code>{@link
   4.795 +     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
   4.796 +     *          method denies read access to the file or directory
   4.797 +     */
   4.798 +    public boolean exists() {
   4.799 +        throw new SecurityException();
   4.800 +    }
   4.801 +
   4.802 +    /**
   4.803 +     * Tests whether the file denoted by this abstract pathname is a
   4.804 +     * directory.
   4.805 +     *
   4.806 +     * <p> Where it is required to distinguish an I/O exception from the case
   4.807 +     * that the file is not a directory, or where several attributes of the
   4.808 +     * same file are required at the same time, then the {@link
   4.809 +     * java.nio.file.Files#readAttributes(Path,Class,LinkOption[])
   4.810 +     * Files.readAttributes} method may be used.
   4.811 +     *
   4.812 +     * @return <code>true</code> if and only if the file denoted by this
   4.813 +     *          abstract pathname exists <em>and</em> is a directory;
   4.814 +     *          <code>false</code> otherwise
   4.815 +     *
   4.816 +     * @throws  SecurityException
   4.817 +     *          If a security manager exists and its <code>{@link
   4.818 +     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
   4.819 +     *          method denies read access to the file
   4.820 +     */
   4.821 +    public boolean isDirectory() {
   4.822 +        throw new SecurityException();
   4.823 +    }
   4.824 +
   4.825 +    /**
   4.826 +     * Tests whether the file denoted by this abstract pathname is a normal
   4.827 +     * file.  A file is <em>normal</em> if it is not a directory and, in
   4.828 +     * addition, satisfies other system-dependent criteria.  Any non-directory
   4.829 +     * file created by a Java application is guaranteed to be a normal file.
   4.830 +     *
   4.831 +     * <p> Where it is required to distinguish an I/O exception from the case
   4.832 +     * that the file is not a normal file, or where several attributes of the
   4.833 +     * same file are required at the same time, then the {@link
   4.834 +     * java.nio.file.Files#readAttributes(Path,Class,LinkOption[])
   4.835 +     * Files.readAttributes} method may be used.
   4.836 +     *
   4.837 +     * @return  <code>true</code> if and only if the file denoted by this
   4.838 +     *          abstract pathname exists <em>and</em> is a normal file;
   4.839 +     *          <code>false</code> otherwise
   4.840 +     *
   4.841 +     * @throws  SecurityException
   4.842 +     *          If a security manager exists and its <code>{@link
   4.843 +     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
   4.844 +     *          method denies read access to the file
   4.845 +     */
   4.846 +    public boolean isFile() {
   4.847 +        throw new SecurityException();
   4.848 +    }
   4.849 +
   4.850 +    /**
   4.851 +     * Tests whether the file named by this abstract pathname is a hidden
   4.852 +     * file.  The exact definition of <em>hidden</em> is system-dependent.  On
   4.853 +     * UNIX systems, a file is considered to be hidden if its name begins with
   4.854 +     * a period character (<code>'.'</code>).  On Microsoft Windows systems, a file is
   4.855 +     * considered to be hidden if it has been marked as such in the filesystem.
   4.856 +     *
   4.857 +     * @return  <code>true</code> if and only if the file denoted by this
   4.858 +     *          abstract pathname is hidden according to the conventions of the
   4.859 +     *          underlying platform
   4.860 +     *
   4.861 +     * @throws  SecurityException
   4.862 +     *          If a security manager exists and its <code>{@link
   4.863 +     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
   4.864 +     *          method denies read access to the file
   4.865 +     *
   4.866 +     * @since 1.2
   4.867 +     */
   4.868 +    public boolean isHidden() {
   4.869 +        throw new SecurityException();
   4.870 +    }
   4.871 +
   4.872 +    /**
   4.873 +     * Returns the time that the file denoted by this abstract pathname was
   4.874 +     * last modified.
   4.875 +     *
   4.876 +     * <p> Where it is required to distinguish an I/O exception from the case
   4.877 +     * where {@code 0L} is returned, or where several attributes of the
   4.878 +     * same file are required at the same time, or where the time of last
   4.879 +     * access or the creation time are required, then the {@link
   4.880 +     * java.nio.file.Files#readAttributes(Path,Class,LinkOption[])
   4.881 +     * Files.readAttributes} method may be used.
   4.882 +     *
   4.883 +     * @return  A <code>long</code> value representing the time the file was
   4.884 +     *          last modified, measured in milliseconds since the epoch
   4.885 +     *          (00:00:00 GMT, January 1, 1970), or <code>0L</code> if the
   4.886 +     *          file does not exist or if an I/O error occurs
   4.887 +     *
   4.888 +     * @throws  SecurityException
   4.889 +     *          If a security manager exists and its <code>{@link
   4.890 +     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
   4.891 +     *          method denies read access to the file
   4.892 +     */
   4.893 +    public long lastModified() {
   4.894 +        throw new SecurityException();
   4.895 +    }
   4.896 +
   4.897 +    /**
   4.898 +     * Returns the length of the file denoted by this abstract pathname.
   4.899 +     * The return value is unspecified if this pathname denotes a directory.
   4.900 +     *
   4.901 +     * <p> Where it is required to distinguish an I/O exception from the case
   4.902 +     * that {@code 0L} is returned, or where several attributes of the same file
   4.903 +     * are required at the same time, then the {@link
   4.904 +     * java.nio.file.Files#readAttributes(Path,Class,LinkOption[])
   4.905 +     * Files.readAttributes} method may be used.
   4.906 +     *
   4.907 +     * @return  The length, in bytes, of the file denoted by this abstract
   4.908 +     *          pathname, or <code>0L</code> if the file does not exist.  Some
   4.909 +     *          operating systems may return <code>0L</code> for pathnames
   4.910 +     *          denoting system-dependent entities such as devices or pipes.
   4.911 +     *
   4.912 +     * @throws  SecurityException
   4.913 +     *          If a security manager exists and its <code>{@link
   4.914 +     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
   4.915 +     *          method denies read access to the file
   4.916 +     */
   4.917 +    public long length() {
   4.918 +        throw new SecurityException();
   4.919 +    }
   4.920 +
   4.921 +
   4.922 +    /* -- File operations -- */
   4.923 +
   4.924 +    /**
   4.925 +     * Atomically creates a new, empty file named by this abstract pathname if
   4.926 +     * and only if a file with this name does not yet exist.  The check for the
   4.927 +     * existence of the file and the creation of the file if it does not exist
   4.928 +     * are a single operation that is atomic with respect to all other
   4.929 +     * filesystem activities that might affect the file.
   4.930 +     * <P>
   4.931 +     * Note: this method should <i>not</i> be used for file-locking, as
   4.932 +     * the resulting protocol cannot be made to work reliably. The
   4.933 +     * {@link java.nio.channels.FileLock FileLock}
   4.934 +     * facility should be used instead.
   4.935 +     *
   4.936 +     * @return  <code>true</code> if the named file does not exist and was
   4.937 +     *          successfully created; <code>false</code> if the named file
   4.938 +     *          already exists
   4.939 +     *
   4.940 +     * @throws  IOException
   4.941 +     *          If an I/O error occurred
   4.942 +     *
   4.943 +     * @throws  SecurityException
   4.944 +     *          If a security manager exists and its <code>{@link
   4.945 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
   4.946 +     *          method denies write access to the file
   4.947 +     *
   4.948 +     * @since 1.2
   4.949 +     */
   4.950 +    public boolean createNewFile() throws IOException {
   4.951 +        throw new SecurityException();
   4.952 +    }
   4.953 +
   4.954 +    /**
   4.955 +     * Deletes the file or directory denoted by this abstract pathname.  If
   4.956 +     * this pathname denotes a directory, then the directory must be empty in
   4.957 +     * order to be deleted.
   4.958 +     *
   4.959 +     * <p> Note that the {@link java.nio.file.Files} class defines the {@link
   4.960 +     * java.nio.file.Files#delete(Path) delete} method to throw an {@link IOException}
   4.961 +     * when a file cannot be deleted. This is useful for error reporting and to
   4.962 +     * diagnose why a file cannot be deleted.
   4.963 +     *
   4.964 +     * @return  <code>true</code> if and only if the file or directory is
   4.965 +     *          successfully deleted; <code>false</code> otherwise
   4.966 +     *
   4.967 +     * @throws  SecurityException
   4.968 +     *          If a security manager exists and its <code>{@link
   4.969 +     *          java.lang.SecurityManager#checkDelete}</code> method denies
   4.970 +     *          delete access to the file
   4.971 +     */
   4.972 +    public boolean delete() {
   4.973 +        throw new SecurityException();
   4.974 +    }
   4.975 +
   4.976 +    /**
   4.977 +     * Requests that the file or directory denoted by this abstract
   4.978 +     * pathname be deleted when the virtual machine terminates.
   4.979 +     * Files (or directories) are deleted in the reverse order that
   4.980 +     * they are registered. Invoking this method to delete a file or
   4.981 +     * directory that is already registered for deletion has no effect.
   4.982 +     * Deletion will be attempted only for normal termination of the
   4.983 +     * virtual machine, as defined by the Java Language Specification.
   4.984 +     *
   4.985 +     * <p> Once deletion has been requested, it is not possible to cancel the
   4.986 +     * request.  This method should therefore be used with care.
   4.987 +     *
   4.988 +     * <P>
   4.989 +     * Note: this method should <i>not</i> be used for file-locking, as
   4.990 +     * the resulting protocol cannot be made to work reliably. The
   4.991 +     * {@link java.nio.channels.FileLock FileLock}
   4.992 +     * facility should be used instead.
   4.993 +     *
   4.994 +     * @throws  SecurityException
   4.995 +     *          If a security manager exists and its <code>{@link
   4.996 +     *          java.lang.SecurityManager#checkDelete}</code> method denies
   4.997 +     *          delete access to the file
   4.998 +     *
   4.999 +     * @see #delete
  4.1000 +     *
  4.1001 +     * @since 1.2
  4.1002 +     */
  4.1003 +    public void deleteOnExit() {
  4.1004 +        throw new SecurityException();
  4.1005 +    }
  4.1006 +
  4.1007 +    /**
  4.1008 +     * Returns an array of strings naming the files and directories in the
  4.1009 +     * directory denoted by this abstract pathname.
  4.1010 +     *
  4.1011 +     * <p> If this abstract pathname does not denote a directory, then this
  4.1012 +     * method returns {@code null}.  Otherwise an array of strings is
  4.1013 +     * returned, one for each file or directory in the directory.  Names
  4.1014 +     * denoting the directory itself and the directory's parent directory are
  4.1015 +     * not included in the result.  Each string is a file name rather than a
  4.1016 +     * complete path.
  4.1017 +     *
  4.1018 +     * <p> There is no guarantee that the name strings in the resulting array
  4.1019 +     * will appear in any specific order; they are not, in particular,
  4.1020 +     * guaranteed to appear in alphabetical order.
  4.1021 +     *
  4.1022 +     * <p> Note that the {@link java.nio.file.Files} class defines the {@link
  4.1023 +     * java.nio.file.Files#newDirectoryStream(Path) newDirectoryStream} method to
  4.1024 +     * open a directory and iterate over the names of the files in the directory.
  4.1025 +     * This may use less resources when working with very large directories, and
  4.1026 +     * may be more responsive when working with remote directories.
  4.1027 +     *
  4.1028 +     * @return  An array of strings naming the files and directories in the
  4.1029 +     *          directory denoted by this abstract pathname.  The array will be
  4.1030 +     *          empty if the directory is empty.  Returns {@code null} if
  4.1031 +     *          this abstract pathname does not denote a directory, or if an
  4.1032 +     *          I/O error occurs.
  4.1033 +     *
  4.1034 +     * @throws  SecurityException
  4.1035 +     *          If a security manager exists and its {@link
  4.1036 +     *          SecurityManager#checkRead(String)} method denies read access to
  4.1037 +     *          the directory
  4.1038 +     */
  4.1039 +    public String[] list() {
  4.1040 +        throw new SecurityException();
  4.1041 +    }
  4.1042 +
  4.1043 +    /**
  4.1044 +     * Returns an array of strings naming the files and directories in the
  4.1045 +     * directory denoted by this abstract pathname that satisfy the specified
  4.1046 +     * filter.  The behavior of this method is the same as that of the
  4.1047 +     * {@link #list()} method, except that the strings in the returned array
  4.1048 +     * must satisfy the filter.  If the given {@code filter} is {@code null}
  4.1049 +     * then all names are accepted.  Otherwise, a name satisfies the filter if
  4.1050 +     * and only if the value {@code true} results when the {@link
  4.1051 +     * FilenameFilter#accept FilenameFilter.accept(File,&nbsp;String)} method
  4.1052 +     * of the filter is invoked on this abstract pathname and the name of a
  4.1053 +     * file or directory in the directory that it denotes.
  4.1054 +     *
  4.1055 +     * @param  filter
  4.1056 +     *         A filename filter
  4.1057 +     *
  4.1058 +     * @return  An array of strings naming the files and directories in the
  4.1059 +     *          directory denoted by this abstract pathname that were accepted
  4.1060 +     *          by the given {@code filter}.  The array will be empty if the
  4.1061 +     *          directory is empty or if no names were accepted by the filter.
  4.1062 +     *          Returns {@code null} if this abstract pathname does not denote
  4.1063 +     *          a directory, or if an I/O error occurs.
  4.1064 +     *
  4.1065 +     * @throws  SecurityException
  4.1066 +     *          If a security manager exists and its {@link
  4.1067 +     *          SecurityManager#checkRead(String)} method denies read access to
  4.1068 +     *          the directory
  4.1069 +     *
  4.1070 +     * @see java.nio.file.Files#newDirectoryStream(Path,String)
  4.1071 +     */
  4.1072 +    public String[] list(FilenameFilter filter) {
  4.1073 +        throw new SecurityException();
  4.1074 +    }
  4.1075 +
  4.1076 +    /**
  4.1077 +     * Returns an array of abstract pathnames denoting the files in the
  4.1078 +     * directory denoted by this abstract pathname.
  4.1079 +     *
  4.1080 +     * <p> If this abstract pathname does not denote a directory, then this
  4.1081 +     * method returns {@code null}.  Otherwise an array of {@code File} objects
  4.1082 +     * is returned, one for each file or directory in the directory.  Pathnames
  4.1083 +     * denoting the directory itself and the directory's parent directory are
  4.1084 +     * not included in the result.  Each resulting abstract pathname is
  4.1085 +     * constructed from this abstract pathname using the {@link #File(File,
  4.1086 +     * String) File(File,&nbsp;String)} constructor.  Therefore if this
  4.1087 +     * pathname is absolute then each resulting pathname is absolute; if this
  4.1088 +     * pathname is relative then each resulting pathname will be relative to
  4.1089 +     * the same directory.
  4.1090 +     *
  4.1091 +     * <p> There is no guarantee that the name strings in the resulting array
  4.1092 +     * will appear in any specific order; they are not, in particular,
  4.1093 +     * guaranteed to appear in alphabetical order.
  4.1094 +     *
  4.1095 +     * <p> Note that the {@link java.nio.file.Files} class defines the {@link
  4.1096 +     * java.nio.file.Files#newDirectoryStream(Path) newDirectoryStream} method
  4.1097 +     * to open a directory and iterate over the names of the files in the
  4.1098 +     * directory. This may use less resources when working with very large
  4.1099 +     * directories.
  4.1100 +     *
  4.1101 +     * @return  An array of abstract pathnames denoting the files and
  4.1102 +     *          directories in the directory denoted by this abstract pathname.
  4.1103 +     *          The array will be empty if the directory is empty.  Returns
  4.1104 +     *          {@code null} if this abstract pathname does not denote a
  4.1105 +     *          directory, or if an I/O error occurs.
  4.1106 +     *
  4.1107 +     * @throws  SecurityException
  4.1108 +     *          If a security manager exists and its {@link
  4.1109 +     *          SecurityManager#checkRead(String)} method denies read access to
  4.1110 +     *          the directory
  4.1111 +     *
  4.1112 +     * @since  1.2
  4.1113 +     */
  4.1114 +    public File[] listFiles() {
  4.1115 +        throw new SecurityException();
  4.1116 +    }
  4.1117 +
  4.1118 +    /**
  4.1119 +     * Returns an array of abstract pathnames denoting the files and
  4.1120 +     * directories in the directory denoted by this abstract pathname that
  4.1121 +     * satisfy the specified filter.  The behavior of this method is the same
  4.1122 +     * as that of the {@link #listFiles()} method, except that the pathnames in
  4.1123 +     * the returned array must satisfy the filter.  If the given {@code filter}
  4.1124 +     * is {@code null} then all pathnames are accepted.  Otherwise, a pathname
  4.1125 +     * satisfies the filter if and only if the value {@code true} results when
  4.1126 +     * the {@link FilenameFilter#accept
  4.1127 +     * FilenameFilter.accept(File,&nbsp;String)} method of the filter is
  4.1128 +     * invoked on this abstract pathname and the name of a file or directory in
  4.1129 +     * the directory that it denotes.
  4.1130 +     *
  4.1131 +     * @param  filter
  4.1132 +     *         A filename filter
  4.1133 +     *
  4.1134 +     * @return  An array of abstract pathnames denoting the files and
  4.1135 +     *          directories in the directory denoted by this abstract pathname.
  4.1136 +     *          The array will be empty if the directory is empty.  Returns
  4.1137 +     *          {@code null} if this abstract pathname does not denote a
  4.1138 +     *          directory, or if an I/O error occurs.
  4.1139 +     *
  4.1140 +     * @throws  SecurityException
  4.1141 +     *          If a security manager exists and its {@link
  4.1142 +     *          SecurityManager#checkRead(String)} method denies read access to
  4.1143 +     *          the directory
  4.1144 +     *
  4.1145 +     * @since  1.2
  4.1146 +     * @see java.nio.file.Files#newDirectoryStream(Path,String)
  4.1147 +     */
  4.1148 +    public File[] listFiles(FilenameFilter filter) {
  4.1149 +        throw new SecurityException();
  4.1150 +    }
  4.1151 +
  4.1152 +    /**
  4.1153 +     * Returns an array of abstract pathnames denoting the files and
  4.1154 +     * directories in the directory denoted by this abstract pathname that
  4.1155 +     * satisfy the specified filter.  The behavior of this method is the same
  4.1156 +     * as that of the {@link #listFiles()} method, except that the pathnames in
  4.1157 +     * the returned array must satisfy the filter.  If the given {@code filter}
  4.1158 +     * is {@code null} then all pathnames are accepted.  Otherwise, a pathname
  4.1159 +     * satisfies the filter if and only if the value {@code true} results when
  4.1160 +     * the {@link FileFilter#accept FileFilter.accept(File)} method of the
  4.1161 +     * filter is invoked on the pathname.
  4.1162 +     *
  4.1163 +     * @param  filter
  4.1164 +     *         A file filter
  4.1165 +     *
  4.1166 +     * @return  An array of abstract pathnames denoting the files and
  4.1167 +     *          directories in the directory denoted by this abstract pathname.
  4.1168 +     *          The array will be empty if the directory is empty.  Returns
  4.1169 +     *          {@code null} if this abstract pathname does not denote a
  4.1170 +     *          directory, or if an I/O error occurs.
  4.1171 +     *
  4.1172 +     * @throws  SecurityException
  4.1173 +     *          If a security manager exists and its {@link
  4.1174 +     *          SecurityManager#checkRead(String)} method denies read access to
  4.1175 +     *          the directory
  4.1176 +     *
  4.1177 +     * @since  1.2
  4.1178 +     * @see java.nio.file.Files#newDirectoryStream(Path,java.nio.file.DirectoryStream.Filter)
  4.1179 +     */
  4.1180 +    public File[] listFiles(FileFilter filter) {
  4.1181 +        throw new SecurityException();
  4.1182 +    }
  4.1183 +
  4.1184 +    /**
  4.1185 +     * Creates the directory named by this abstract pathname.
  4.1186 +     *
  4.1187 +     * @return  <code>true</code> if and only if the directory was
  4.1188 +     *          created; <code>false</code> otherwise
  4.1189 +     *
  4.1190 +     * @throws  SecurityException
  4.1191 +     *          If a security manager exists and its <code>{@link
  4.1192 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1193 +     *          method does not permit the named directory to be created
  4.1194 +     */
  4.1195 +    public boolean mkdir() {
  4.1196 +        throw new SecurityException();
  4.1197 +    }
  4.1198 +
  4.1199 +    /**
  4.1200 +     * Creates the directory named by this abstract pathname, including any
  4.1201 +     * necessary but nonexistent parent directories.  Note that if this
  4.1202 +     * operation fails it may have succeeded in creating some of the necessary
  4.1203 +     * parent directories.
  4.1204 +     *
  4.1205 +     * @return  <code>true</code> if and only if the directory was created,
  4.1206 +     *          along with all necessary parent directories; <code>false</code>
  4.1207 +     *          otherwise
  4.1208 +     *
  4.1209 +     * @throws  SecurityException
  4.1210 +     *          If a security manager exists and its <code>{@link
  4.1211 +     *          java.lang.SecurityManager#checkRead(java.lang.String)}</code>
  4.1212 +     *          method does not permit verification of the existence of the
  4.1213 +     *          named directory and all necessary parent directories; or if
  4.1214 +     *          the <code>{@link
  4.1215 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1216 +     *          method does not permit the named directory and all necessary
  4.1217 +     *          parent directories to be created
  4.1218 +     */
  4.1219 +    public boolean mkdirs() {
  4.1220 +        throw new SecurityException();
  4.1221 +    }
  4.1222 +
  4.1223 +    /**
  4.1224 +     * Renames the file denoted by this abstract pathname.
  4.1225 +     *
  4.1226 +     * <p> Many aspects of the behavior of this method are inherently
  4.1227 +     * platform-dependent: The rename operation might not be able to move a
  4.1228 +     * file from one filesystem to another, it might not be atomic, and it
  4.1229 +     * might not succeed if a file with the destination abstract pathname
  4.1230 +     * already exists.  The return value should always be checked to make sure
  4.1231 +     * that the rename operation was successful.
  4.1232 +     *
  4.1233 +     * <p> Note that the {@link java.nio.file.Files} class defines the {@link
  4.1234 +     * java.nio.file.Files#move move} method to move or rename a file in a
  4.1235 +     * platform independent manner.
  4.1236 +     *
  4.1237 +     * @param  dest  The new abstract pathname for the named file
  4.1238 +     *
  4.1239 +     * @return  <code>true</code> if and only if the renaming succeeded;
  4.1240 +     *          <code>false</code> otherwise
  4.1241 +     *
  4.1242 +     * @throws  SecurityException
  4.1243 +     *          If a security manager exists and its <code>{@link
  4.1244 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1245 +     *          method denies write access to either the old or new pathnames
  4.1246 +     *
  4.1247 +     * @throws  NullPointerException
  4.1248 +     *          If parameter <code>dest</code> is <code>null</code>
  4.1249 +     */
  4.1250 +    public boolean renameTo(File dest) {
  4.1251 +        throw new SecurityException();
  4.1252 +    }
  4.1253 +
  4.1254 +    /**
  4.1255 +     * Sets the last-modified time of the file or directory named by this
  4.1256 +     * abstract pathname.
  4.1257 +     *
  4.1258 +     * <p> All platforms support file-modification times to the nearest second,
  4.1259 +     * but some provide more precision.  The argument will be truncated to fit
  4.1260 +     * the supported precision.  If the operation succeeds and no intervening
  4.1261 +     * operations on the file take place, then the next invocation of the
  4.1262 +     * <code>{@link #lastModified}</code> method will return the (possibly
  4.1263 +     * truncated) <code>time</code> argument that was passed to this method.
  4.1264 +     *
  4.1265 +     * @param  time  The new last-modified time, measured in milliseconds since
  4.1266 +     *               the epoch (00:00:00 GMT, January 1, 1970)
  4.1267 +     *
  4.1268 +     * @return <code>true</code> if and only if the operation succeeded;
  4.1269 +     *          <code>false</code> otherwise
  4.1270 +     *
  4.1271 +     * @throws  IllegalArgumentException  If the argument is negative
  4.1272 +     *
  4.1273 +     * @throws  SecurityException
  4.1274 +     *          If a security manager exists and its <code>{@link
  4.1275 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1276 +     *          method denies write access to the named file
  4.1277 +     *
  4.1278 +     * @since 1.2
  4.1279 +     */
  4.1280 +    public boolean setLastModified(long time) {
  4.1281 +        throw new SecurityException();
  4.1282 +    }
  4.1283 +
  4.1284 +    /**
  4.1285 +     * Marks the file or directory named by this abstract pathname so that
  4.1286 +     * only read operations are allowed.  After invoking this method the file
  4.1287 +     * or directory is guaranteed not to change until it is either deleted or
  4.1288 +     * marked to allow write access.  Whether or not a read-only file or
  4.1289 +     * directory may be deleted depends upon the underlying system.
  4.1290 +     *
  4.1291 +     * @return <code>true</code> if and only if the operation succeeded;
  4.1292 +     *          <code>false</code> otherwise
  4.1293 +     *
  4.1294 +     * @throws  SecurityException
  4.1295 +     *          If a security manager exists and its <code>{@link
  4.1296 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1297 +     *          method denies write access to the named file
  4.1298 +     *
  4.1299 +     * @since 1.2
  4.1300 +     */
  4.1301 +    public boolean setReadOnly() {
  4.1302 +        throw new SecurityException();
  4.1303 +    }
  4.1304 +
  4.1305 +    /**
  4.1306 +     * Sets the owner's or everybody's write permission for this abstract
  4.1307 +     * pathname.
  4.1308 +     *
  4.1309 +     * <p> The {@link java.nio.file.Files} class defines methods that operate on
  4.1310 +     * file attributes including file permissions. This may be used when finer
  4.1311 +     * manipulation of file permissions is required.
  4.1312 +     *
  4.1313 +     * @param   writable
  4.1314 +     *          If <code>true</code>, sets the access permission to allow write
  4.1315 +     *          operations; if <code>false</code> to disallow write operations
  4.1316 +     *
  4.1317 +     * @param   ownerOnly
  4.1318 +     *          If <code>true</code>, the write permission applies only to the
  4.1319 +     *          owner's write permission; otherwise, it applies to everybody.  If
  4.1320 +     *          the underlying file system can not distinguish the owner's write
  4.1321 +     *          permission from that of others, then the permission will apply to
  4.1322 +     *          everybody, regardless of this value.
  4.1323 +     *
  4.1324 +     * @return  <code>true</code> if and only if the operation succeeded. The
  4.1325 +     *          operation will fail if the user does not have permission to change
  4.1326 +     *          the access permissions of this abstract pathname.
  4.1327 +     *
  4.1328 +     * @throws  SecurityException
  4.1329 +     *          If a security manager exists and its <code>{@link
  4.1330 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1331 +     *          method denies write access to the named file
  4.1332 +     *
  4.1333 +     * @since 1.6
  4.1334 +     */
  4.1335 +    public boolean setWritable(boolean writable, boolean ownerOnly) {
  4.1336 +        throw new SecurityException();
  4.1337 +    }
  4.1338 +
  4.1339 +    /**
  4.1340 +     * A convenience method to set the owner's write permission for this abstract
  4.1341 +     * pathname.
  4.1342 +     *
  4.1343 +     * <p> An invocation of this method of the form <tt>file.setWritable(arg)</tt>
  4.1344 +     * behaves in exactly the same way as the invocation
  4.1345 +     *
  4.1346 +     * <pre>
  4.1347 +     *     file.setWritable(arg, true) </pre>
  4.1348 +     *
  4.1349 +     * @param   writable
  4.1350 +     *          If <code>true</code>, sets the access permission to allow write
  4.1351 +     *          operations; if <code>false</code> to disallow write operations
  4.1352 +     *
  4.1353 +     * @return  <code>true</code> if and only if the operation succeeded.  The
  4.1354 +     *          operation will fail if the user does not have permission to
  4.1355 +     *          change the access permissions of this abstract pathname.
  4.1356 +     *
  4.1357 +     * @throws  SecurityException
  4.1358 +     *          If a security manager exists and its <code>{@link
  4.1359 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1360 +     *          method denies write access to the file
  4.1361 +     *
  4.1362 +     * @since 1.6
  4.1363 +     */
  4.1364 +    public boolean setWritable(boolean writable) {
  4.1365 +        return setWritable(writable, true);
  4.1366 +    }
  4.1367 +
  4.1368 +    /**
  4.1369 +     * Sets the owner's or everybody's read permission for this abstract
  4.1370 +     * pathname.
  4.1371 +     *
  4.1372 +     * <p> The {@link java.nio.file.Files} class defines methods that operate on
  4.1373 +     * file attributes including file permissions. This may be used when finer
  4.1374 +     * manipulation of file permissions is required.
  4.1375 +     *
  4.1376 +     * @param   readable
  4.1377 +     *          If <code>true</code>, sets the access permission to allow read
  4.1378 +     *          operations; if <code>false</code> to disallow read operations
  4.1379 +     *
  4.1380 +     * @param   ownerOnly
  4.1381 +     *          If <code>true</code>, the read permission applies only to the
  4.1382 +     *          owner's read permission; otherwise, it applies to everybody.  If
  4.1383 +     *          the underlying file system can not distinguish the owner's read
  4.1384 +     *          permission from that of others, then the permission will apply to
  4.1385 +     *          everybody, regardless of this value.
  4.1386 +     *
  4.1387 +     * @return  <code>true</code> if and only if the operation succeeded.  The
  4.1388 +     *          operation will fail if the user does not have permission to
  4.1389 +     *          change the access permissions of this abstract pathname.  If
  4.1390 +     *          <code>readable</code> is <code>false</code> and the underlying
  4.1391 +     *          file system does not implement a read permission, then the
  4.1392 +     *          operation will fail.
  4.1393 +     *
  4.1394 +     * @throws  SecurityException
  4.1395 +     *          If a security manager exists and its <code>{@link
  4.1396 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1397 +     *          method denies write access to the file
  4.1398 +     *
  4.1399 +     * @since 1.6
  4.1400 +     */
  4.1401 +    public boolean setReadable(boolean readable, boolean ownerOnly) {
  4.1402 +        throw new SecurityException();
  4.1403 +    }
  4.1404 +
  4.1405 +    /**
  4.1406 +     * A convenience method to set the owner's read permission for this abstract
  4.1407 +     * pathname.
  4.1408 +     *
  4.1409 +     * <p>An invocation of this method of the form <tt>file.setReadable(arg)</tt>
  4.1410 +     * behaves in exactly the same way as the invocation
  4.1411 +     *
  4.1412 +     * <pre>
  4.1413 +     *     file.setReadable(arg, true) </pre>
  4.1414 +     *
  4.1415 +     * @param  readable
  4.1416 +     *          If <code>true</code>, sets the access permission to allow read
  4.1417 +     *          operations; if <code>false</code> to disallow read operations
  4.1418 +     *
  4.1419 +     * @return  <code>true</code> if and only if the operation succeeded.  The
  4.1420 +     *          operation will fail if the user does not have permission to
  4.1421 +     *          change the access permissions of this abstract pathname.  If
  4.1422 +     *          <code>readable</code> is <code>false</code> and the underlying
  4.1423 +     *          file system does not implement a read permission, then the
  4.1424 +     *          operation will fail.
  4.1425 +     *
  4.1426 +     * @throws  SecurityException
  4.1427 +     *          If a security manager exists and its <code>{@link
  4.1428 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1429 +     *          method denies write access to the file
  4.1430 +     *
  4.1431 +     * @since 1.6
  4.1432 +     */
  4.1433 +    public boolean setReadable(boolean readable) {
  4.1434 +        return setReadable(readable, true);
  4.1435 +    }
  4.1436 +
  4.1437 +    /**
  4.1438 +     * Sets the owner's or everybody's execute permission for this abstract
  4.1439 +     * pathname.
  4.1440 +     *
  4.1441 +     * <p> The {@link java.nio.file.Files} class defines methods that operate on
  4.1442 +     * file attributes including file permissions. This may be used when finer
  4.1443 +     * manipulation of file permissions is required.
  4.1444 +     *
  4.1445 +     * @param   executable
  4.1446 +     *          If <code>true</code>, sets the access permission to allow execute
  4.1447 +     *          operations; if <code>false</code> to disallow execute operations
  4.1448 +     *
  4.1449 +     * @param   ownerOnly
  4.1450 +     *          If <code>true</code>, the execute permission applies only to the
  4.1451 +     *          owner's execute permission; otherwise, it applies to everybody.
  4.1452 +     *          If the underlying file system can not distinguish the owner's
  4.1453 +     *          execute permission from that of others, then the permission will
  4.1454 +     *          apply to everybody, regardless of this value.
  4.1455 +     *
  4.1456 +     * @return  <code>true</code> if and only if the operation succeeded.  The
  4.1457 +     *          operation will fail if the user does not have permission to
  4.1458 +     *          change the access permissions of this abstract pathname.  If
  4.1459 +     *          <code>executable</code> is <code>false</code> and the underlying
  4.1460 +     *          file system does not implement an execute permission, then the
  4.1461 +     *          operation will fail.
  4.1462 +     *
  4.1463 +     * @throws  SecurityException
  4.1464 +     *          If a security manager exists and its <code>{@link
  4.1465 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1466 +     *          method denies write access to the file
  4.1467 +     *
  4.1468 +     * @since 1.6
  4.1469 +     */
  4.1470 +    public boolean setExecutable(boolean executable, boolean ownerOnly) {
  4.1471 +        throw new SecurityException();
  4.1472 +    }
  4.1473 +
  4.1474 +    /**
  4.1475 +     * A convenience method to set the owner's execute permission for this abstract
  4.1476 +     * pathname.
  4.1477 +     *
  4.1478 +     * <p>An invocation of this method of the form <tt>file.setExcutable(arg)</tt>
  4.1479 +     * behaves in exactly the same way as the invocation
  4.1480 +     *
  4.1481 +     * <pre>
  4.1482 +     *     file.setExecutable(arg, true) </pre>
  4.1483 +     *
  4.1484 +     * @param   executable
  4.1485 +     *          If <code>true</code>, sets the access permission to allow execute
  4.1486 +     *          operations; if <code>false</code> to disallow execute operations
  4.1487 +     *
  4.1488 +     * @return   <code>true</code> if and only if the operation succeeded.  The
  4.1489 +     *           operation will fail if the user does not have permission to
  4.1490 +     *           change the access permissions of this abstract pathname.  If
  4.1491 +     *           <code>executable</code> is <code>false</code> and the underlying
  4.1492 +     *           file system does not implement an excute permission, then the
  4.1493 +     *           operation will fail.
  4.1494 +     *
  4.1495 +     * @throws  SecurityException
  4.1496 +     *          If a security manager exists and its <code>{@link
  4.1497 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1498 +     *          method denies write access to the file
  4.1499 +     *
  4.1500 +     * @since 1.6
  4.1501 +     */
  4.1502 +    public boolean setExecutable(boolean executable) {
  4.1503 +        return setExecutable(executable, true);
  4.1504 +    }
  4.1505 +
  4.1506 +    /**
  4.1507 +     * Tests whether the application can execute the file denoted by this
  4.1508 +     * abstract pathname.
  4.1509 +     *
  4.1510 +     * @return  <code>true</code> if and only if the abstract pathname exists
  4.1511 +     *          <em>and</em> the application is allowed to execute the file
  4.1512 +     *
  4.1513 +     * @throws  SecurityException
  4.1514 +     *          If a security manager exists and its <code>{@link
  4.1515 +     *          java.lang.SecurityManager#checkExec(java.lang.String)}</code>
  4.1516 +     *          method denies execute access to the file
  4.1517 +     *
  4.1518 +     * @since 1.6
  4.1519 +     */
  4.1520 +    public boolean canExecute() {
  4.1521 +        throw new SecurityException();
  4.1522 +    }
  4.1523 +
  4.1524 +
  4.1525 +    /* -- Filesystem interface -- */
  4.1526 +
  4.1527 +    /**
  4.1528 +     * List the available filesystem roots.
  4.1529 +     *
  4.1530 +     * <p> A particular Java platform may support zero or more
  4.1531 +     * hierarchically-organized file systems.  Each file system has a
  4.1532 +     * {@code root} directory from which all other files in that file system
  4.1533 +     * can be reached.  Windows platforms, for example, have a root directory
  4.1534 +     * for each active drive; UNIX platforms have a single root directory,
  4.1535 +     * namely {@code "/"}.  The set of available filesystem roots is affected
  4.1536 +     * by various system-level operations such as the insertion or ejection of
  4.1537 +     * removable media and the disconnecting or unmounting of physical or
  4.1538 +     * virtual disk drives.
  4.1539 +     *
  4.1540 +     * <p> This method returns an array of {@code File} objects that denote the
  4.1541 +     * root directories of the available filesystem roots.  It is guaranteed
  4.1542 +     * that the canonical pathname of any file physically present on the local
  4.1543 +     * machine will begin with one of the roots returned by this method.
  4.1544 +     *
  4.1545 +     * <p> The canonical pathname of a file that resides on some other machine
  4.1546 +     * and is accessed via a remote-filesystem protocol such as SMB or NFS may
  4.1547 +     * or may not begin with one of the roots returned by this method.  If the
  4.1548 +     * pathname of a remote file is syntactically indistinguishable from the
  4.1549 +     * pathname of a local file then it will begin with one of the roots
  4.1550 +     * returned by this method.  Thus, for example, {@code File} objects
  4.1551 +     * denoting the root directories of the mapped network drives of a Windows
  4.1552 +     * platform will be returned by this method, while {@code File} objects
  4.1553 +     * containing UNC pathnames will not be returned by this method.
  4.1554 +     *
  4.1555 +     * <p> Unlike most methods in this class, this method does not throw
  4.1556 +     * security exceptions.  If a security manager exists and its {@link
  4.1557 +     * SecurityManager#checkRead(String)} method denies read access to a
  4.1558 +     * particular root directory, then that directory will not appear in the
  4.1559 +     * result.
  4.1560 +     *
  4.1561 +     * @return  An array of {@code File} objects denoting the available
  4.1562 +     *          filesystem roots, or {@code null} if the set of roots could not
  4.1563 +     *          be determined.  The array will be empty if there are no
  4.1564 +     *          filesystem roots.
  4.1565 +     *
  4.1566 +     * @since  1.2
  4.1567 +     * @see java.nio.file.FileStore
  4.1568 +     */
  4.1569 +    public static File[] listRoots() {
  4.1570 +        throw new SecurityException();
  4.1571 +    }
  4.1572 +
  4.1573 +
  4.1574 +    /* -- Disk usage -- */
  4.1575 +
  4.1576 +    /**
  4.1577 +     * Returns the size of the partition <a href="#partName">named</a> by this
  4.1578 +     * abstract pathname.
  4.1579 +     *
  4.1580 +     * @return  The size, in bytes, of the partition or <tt>0L</tt> if this
  4.1581 +     *          abstract pathname does not name a partition
  4.1582 +     *
  4.1583 +     * @throws  SecurityException
  4.1584 +     *          If a security manager has been installed and it denies
  4.1585 +     *          {@link RuntimePermission}<tt>("getFileSystemAttributes")</tt>
  4.1586 +     *          or its {@link SecurityManager#checkRead(String)} method denies
  4.1587 +     *          read access to the file named by this abstract pathname
  4.1588 +     *
  4.1589 +     * @since  1.6
  4.1590 +     */
  4.1591 +    public long getTotalSpace() {
  4.1592 +        throw new SecurityException();
  4.1593 +    }
  4.1594 +
  4.1595 +    /**
  4.1596 +     * Returns the number of unallocated bytes in the partition <a
  4.1597 +     * href="#partName">named</a> by this abstract path name.
  4.1598 +     *
  4.1599 +     * <p> The returned number of unallocated bytes is a hint, but not
  4.1600 +     * a guarantee, that it is possible to use most or any of these
  4.1601 +     * bytes.  The number of unallocated bytes is most likely to be
  4.1602 +     * accurate immediately after this call.  It is likely to be made
  4.1603 +     * inaccurate by any external I/O operations including those made
  4.1604 +     * on the system outside of this virtual machine.  This method
  4.1605 +     * makes no guarantee that write operations to this file system
  4.1606 +     * will succeed.
  4.1607 +     *
  4.1608 +     * @return  The number of unallocated bytes on the partition <tt>0L</tt>
  4.1609 +     *          if the abstract pathname does not name a partition.  This
  4.1610 +     *          value will be less than or equal to the total file system size
  4.1611 +     *          returned by {@link #getTotalSpace}.
  4.1612 +     *
  4.1613 +     * @throws  SecurityException
  4.1614 +     *          If a security manager has been installed and it denies
  4.1615 +     *          {@link RuntimePermission}<tt>("getFileSystemAttributes")</tt>
  4.1616 +     *          or its {@link SecurityManager#checkRead(String)} method denies
  4.1617 +     *          read access to the file named by this abstract pathname
  4.1618 +     *
  4.1619 +     * @since  1.6
  4.1620 +     */
  4.1621 +    public long getFreeSpace() {
  4.1622 +        throw new SecurityException();
  4.1623 +    }
  4.1624 +
  4.1625 +    /**
  4.1626 +     * Returns the number of bytes available to this virtual machine on the
  4.1627 +     * partition <a href="#partName">named</a> by this abstract pathname.  When
  4.1628 +     * possible, this method checks for write permissions and other operating
  4.1629 +     * system restrictions and will therefore usually provide a more accurate
  4.1630 +     * estimate of how much new data can actually be written than {@link
  4.1631 +     * #getFreeSpace}.
  4.1632 +     *
  4.1633 +     * <p> The returned number of available bytes is a hint, but not a
  4.1634 +     * guarantee, that it is possible to use most or any of these bytes.  The
  4.1635 +     * number of unallocated bytes is most likely to be accurate immediately
  4.1636 +     * after this call.  It is likely to be made inaccurate by any external
  4.1637 +     * I/O operations including those made on the system outside of this
  4.1638 +     * virtual machine.  This method makes no guarantee that write operations
  4.1639 +     * to this file system will succeed.
  4.1640 +     *
  4.1641 +     * @return  The number of available bytes on the partition or <tt>0L</tt>
  4.1642 +     *          if the abstract pathname does not name a partition.  On
  4.1643 +     *          systems where this information is not available, this method
  4.1644 +     *          will be equivalent to a call to {@link #getFreeSpace}.
  4.1645 +     *
  4.1646 +     * @throws  SecurityException
  4.1647 +     *          If a security manager has been installed and it denies
  4.1648 +     *          {@link RuntimePermission}<tt>("getFileSystemAttributes")</tt>
  4.1649 +     *          or its {@link SecurityManager#checkRead(String)} method denies
  4.1650 +     *          read access to the file named by this abstract pathname
  4.1651 +     *
  4.1652 +     * @since  1.6
  4.1653 +     */
  4.1654 +    public long getUsableSpace() {
  4.1655 +        throw new SecurityException();
  4.1656 +    }
  4.1657 +
  4.1658 +    /* -- Temporary files -- */
  4.1659 +
  4.1660 +
  4.1661 +    /**
  4.1662 +     * <p> Creates a new empty file in the specified directory, using the
  4.1663 +     * given prefix and suffix strings to generate its name.  If this method
  4.1664 +     * returns successfully then it is guaranteed that:
  4.1665 +     *
  4.1666 +     * <ol>
  4.1667 +     * <li> The file denoted by the returned abstract pathname did not exist
  4.1668 +     *      before this method was invoked, and
  4.1669 +     * <li> Neither this method nor any of its variants will return the same
  4.1670 +     *      abstract pathname again in the current invocation of the virtual
  4.1671 +     *      machine.
  4.1672 +     * </ol>
  4.1673 +     *
  4.1674 +     * This method provides only part of a temporary-file facility.  To arrange
  4.1675 +     * for a file created by this method to be deleted automatically, use the
  4.1676 +     * <code>{@link #deleteOnExit}</code> method.
  4.1677 +     *
  4.1678 +     * <p> The <code>prefix</code> argument must be at least three characters
  4.1679 +     * long.  It is recommended that the prefix be a short, meaningful string
  4.1680 +     * such as <code>"hjb"</code> or <code>"mail"</code>.  The
  4.1681 +     * <code>suffix</code> argument may be <code>null</code>, in which case the
  4.1682 +     * suffix <code>".tmp"</code> will be used.
  4.1683 +     *
  4.1684 +     * <p> To create the new file, the prefix and the suffix may first be
  4.1685 +     * adjusted to fit the limitations of the underlying platform.  If the
  4.1686 +     * prefix is too long then it will be truncated, but its first three
  4.1687 +     * characters will always be preserved.  If the suffix is too long then it
  4.1688 +     * too will be truncated, but if it begins with a period character
  4.1689 +     * (<code>'.'</code>) then the period and the first three characters
  4.1690 +     * following it will always be preserved.  Once these adjustments have been
  4.1691 +     * made the name of the new file will be generated by concatenating the
  4.1692 +     * prefix, five or more internally-generated characters, and the suffix.
  4.1693 +     *
  4.1694 +     * <p> If the <code>directory</code> argument is <code>null</code> then the
  4.1695 +     * system-dependent default temporary-file directory will be used.  The
  4.1696 +     * default temporary-file directory is specified by the system property
  4.1697 +     * <code>java.io.tmpdir</code>.  On UNIX systems the default value of this
  4.1698 +     * property is typically <code>"/tmp"</code> or <code>"/var/tmp"</code>; on
  4.1699 +     * Microsoft Windows systems it is typically <code>"C:\\WINNT\\TEMP"</code>.  A different
  4.1700 +     * value may be given to this system property when the Java virtual machine
  4.1701 +     * is invoked, but programmatic changes to this property are not guaranteed
  4.1702 +     * to have any effect upon the temporary directory used by this method.
  4.1703 +     *
  4.1704 +     * @param  prefix     The prefix string to be used in generating the file's
  4.1705 +     *                    name; must be at least three characters long
  4.1706 +     *
  4.1707 +     * @param  suffix     The suffix string to be used in generating the file's
  4.1708 +     *                    name; may be <code>null</code>, in which case the
  4.1709 +     *                    suffix <code>".tmp"</code> will be used
  4.1710 +     *
  4.1711 +     * @param  directory  The directory in which the file is to be created, or
  4.1712 +     *                    <code>null</code> if the default temporary-file
  4.1713 +     *                    directory is to be used
  4.1714 +     *
  4.1715 +     * @return  An abstract pathname denoting a newly-created empty file
  4.1716 +     *
  4.1717 +     * @throws  IllegalArgumentException
  4.1718 +     *          If the <code>prefix</code> argument contains fewer than three
  4.1719 +     *          characters
  4.1720 +     *
  4.1721 +     * @throws  IOException  If a file could not be created
  4.1722 +     *
  4.1723 +     * @throws  SecurityException
  4.1724 +     *          If a security manager exists and its <code>{@link
  4.1725 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1726 +     *          method does not allow a file to be created
  4.1727 +     *
  4.1728 +     * @since 1.2
  4.1729 +     */
  4.1730 +    public static File createTempFile(String prefix, String suffix,
  4.1731 +                                      File directory)
  4.1732 +        throws IOException
  4.1733 +    {
  4.1734 +        throw new SecurityException();
  4.1735 +    }
  4.1736 +
  4.1737 +    /**
  4.1738 +     * Creates an empty file in the default temporary-file directory, using
  4.1739 +     * the given prefix and suffix to generate its name. Invoking this method
  4.1740 +     * is equivalent to invoking <code>{@link #createTempFile(java.lang.String,
  4.1741 +     * java.lang.String, java.io.File)
  4.1742 +     * createTempFile(prefix,&nbsp;suffix,&nbsp;null)}</code>.
  4.1743 +     *
  4.1744 +     * <p> The {@link
  4.1745 +     * java.nio.file.Files#createTempFile(String,String,java.nio.file.attribute.FileAttribute[])
  4.1746 +     * Files.createTempFile} method provides an alternative method to create an
  4.1747 +     * empty file in the temporary-file directory. Files created by that method
  4.1748 +     * may have more restrictive access permissions to files created by this
  4.1749 +     * method and so may be more suited to security-sensitive applications.
  4.1750 +     *
  4.1751 +     * @param  prefix     The prefix string to be used in generating the file's
  4.1752 +     *                    name; must be at least three characters long
  4.1753 +     *
  4.1754 +     * @param  suffix     The suffix string to be used in generating the file's
  4.1755 +     *                    name; may be <code>null</code>, in which case the
  4.1756 +     *                    suffix <code>".tmp"</code> will be used
  4.1757 +     *
  4.1758 +     * @return  An abstract pathname denoting a newly-created empty file
  4.1759 +     *
  4.1760 +     * @throws  IllegalArgumentException
  4.1761 +     *          If the <code>prefix</code> argument contains fewer than three
  4.1762 +     *          characters
  4.1763 +     *
  4.1764 +     * @throws  IOException  If a file could not be created
  4.1765 +     *
  4.1766 +     * @throws  SecurityException
  4.1767 +     *          If a security manager exists and its <code>{@link
  4.1768 +     *          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
  4.1769 +     *          method does not allow a file to be created
  4.1770 +     *
  4.1771 +     * @since 1.2
  4.1772 +     * @see java.nio.file.Files#createTempDirectory(String,FileAttribute[])
  4.1773 +     */
  4.1774 +    public static File createTempFile(String prefix, String suffix)
  4.1775 +        throws IOException
  4.1776 +    {
  4.1777 +        return createTempFile(prefix, suffix, null);
  4.1778 +    }
  4.1779 +
  4.1780 +    /* -- Basic infrastructure -- */
  4.1781 +
  4.1782 +    /**
  4.1783 +     * Compares two abstract pathnames lexicographically.  The ordering
  4.1784 +     * defined by this method depends upon the underlying system.  On UNIX
  4.1785 +     * systems, alphabetic case is significant in comparing pathnames; on Microsoft Windows
  4.1786 +     * systems it is not.
  4.1787 +     *
  4.1788 +     * @param   pathname  The abstract pathname to be compared to this abstract
  4.1789 +     *                    pathname
  4.1790 +     *
  4.1791 +     * @return  Zero if the argument is equal to this abstract pathname, a
  4.1792 +     *          value less than zero if this abstract pathname is
  4.1793 +     *          lexicographically less than the argument, or a value greater
  4.1794 +     *          than zero if this abstract pathname is lexicographically
  4.1795 +     *          greater than the argument
  4.1796 +     *
  4.1797 +     * @since   1.2
  4.1798 +     */
  4.1799 +    public int compareTo(File pathname) {
  4.1800 +        return fs.compare(this, pathname);
  4.1801 +    }
  4.1802 +
  4.1803 +    /**
  4.1804 +     * Tests this abstract pathname for equality with the given object.
  4.1805 +     * Returns <code>true</code> if and only if the argument is not
  4.1806 +     * <code>null</code> and is an abstract pathname that denotes the same file
  4.1807 +     * or directory as this abstract pathname.  Whether or not two abstract
  4.1808 +     * pathnames are equal depends upon the underlying system.  On UNIX
  4.1809 +     * systems, alphabetic case is significant in comparing pathnames; on Microsoft Windows
  4.1810 +     * systems it is not.
  4.1811 +     *
  4.1812 +     * @param   obj   The object to be compared with this abstract pathname
  4.1813 +     *
  4.1814 +     * @return  <code>true</code> if and only if the objects are the same;
  4.1815 +     *          <code>false</code> otherwise
  4.1816 +     */
  4.1817 +    public boolean equals(Object obj) {
  4.1818 +        if ((obj != null) && (obj instanceof File)) {
  4.1819 +            return compareTo((File)obj) == 0;
  4.1820 +        }
  4.1821 +        return false;
  4.1822 +    }
  4.1823 +
  4.1824 +    /**
  4.1825 +     * Computes a hash code for this abstract pathname.  Because equality of
  4.1826 +     * abstract pathnames is inherently system-dependent, so is the computation
  4.1827 +     * of their hash codes.  On UNIX systems, the hash code of an abstract
  4.1828 +     * pathname is equal to the exclusive <em>or</em> of the hash code
  4.1829 +     * of its pathname string and the decimal value
  4.1830 +     * <code>1234321</code>.  On Microsoft Windows systems, the hash
  4.1831 +     * code is equal to the exclusive <em>or</em> of the hash code of
  4.1832 +     * its pathname string converted to lower case and the decimal
  4.1833 +     * value <code>1234321</code>.  Locale is not taken into account on
  4.1834 +     * lowercasing the pathname string.
  4.1835 +     *
  4.1836 +     * @return  A hash code for this abstract pathname
  4.1837 +     */
  4.1838 +    public int hashCode() {
  4.1839 +        return fs.hashCode(this);
  4.1840 +    }
  4.1841 +
  4.1842 +    /**
  4.1843 +     * Returns the pathname string of this abstract pathname.  This is just the
  4.1844 +     * string returned by the <code>{@link #getPath}</code> method.
  4.1845 +     *
  4.1846 +     * @return  The string form of this abstract pathname
  4.1847 +     */
  4.1848 +    public String toString() {
  4.1849 +        return getPath();
  4.1850 +    }
  4.1851 +
  4.1852 +    /**
  4.1853 +     * WriteObject is called to save this filename.
  4.1854 +     * The separator character is saved also so it can be replaced
  4.1855 +     * in case the path is reconstituted on a different host type.
  4.1856 +     * <p>
  4.1857 +     * @serialData  Default fields followed by separator character.
  4.1858 +     */
  4.1859 +    private synchronized void writeObject(java.io.ObjectOutputStream s)
  4.1860 +        throws IOException
  4.1861 +    {
  4.1862 +        s.defaultWriteObject();
  4.1863 +        s.writeChar(this.separatorChar); // Add the separator character
  4.1864 +    }
  4.1865 +
  4.1866 +    /**
  4.1867 +     * readObject is called to restore this filename.
  4.1868 +     * The original separator character is read.  If it is different
  4.1869 +     * than the separator character on this system, then the old separator
  4.1870 +     * is replaced by the local separator.
  4.1871 +     */
  4.1872 +    private synchronized void readObject(java.io.ObjectInputStream s)
  4.1873 +         throws IOException, ClassNotFoundException
  4.1874 +    {
  4.1875 +        ObjectInputStream.GetField fields = s.readFields();
  4.1876 +        String pathField = (String)fields.get("path", null);
  4.1877 +        char sep = s.readChar(); // read the previous separator char
  4.1878 +        if (sep != separatorChar)
  4.1879 +            pathField = pathField.replace(sep, separatorChar);
  4.1880 +        this.path = fs.normalize(pathField);
  4.1881 +        this.prefixLength = fs.prefixLength(this.path);
  4.1882 +    }
  4.1883 +
  4.1884 +    /** use serialVersionUID from JDK 1.0.2 for interoperability */
  4.1885 +    private static final long serialVersionUID = 301077366599181567L;
  4.1886 +
  4.1887 +    // -- Integration with java.nio.file --
  4.1888 +/*
  4.1889 +    private volatile transient Path filePath;
  4.1890 +
  4.1891 +    /**
  4.1892 +     * Returns a {@link Path java.nio.file.Path} object constructed from the
  4.1893 +     * this abstract path. The resulting {@code Path} is associated with the
  4.1894 +     * {@link java.nio.file.FileSystems#getDefault default-filesystem}.
  4.1895 +     *
  4.1896 +     * <p> The first invocation of this method works as if invoking it were
  4.1897 +     * equivalent to evaluating the expression:
  4.1898 +     * <blockquote><pre>
  4.1899 +     * {@link java.nio.file.FileSystems#getDefault FileSystems.getDefault}().{@link
  4.1900 +     * java.nio.file.FileSystem#getPath getPath}(this.{@link #getPath getPath}());
  4.1901 +     * </pre></blockquote>
  4.1902 +     * Subsequent invocations of this method return the same {@code Path}.
  4.1903 +     *
  4.1904 +     * <p> If this abstract pathname is the empty abstract pathname then this
  4.1905 +     * method returns a {@code Path} that may be used to access the current
  4.1906 +     * user directory.
  4.1907 +     *
  4.1908 +     * @return  a {@code Path} constructed from this abstract path
  4.1909 +     *
  4.1910 +     * @throws  java.nio.file.InvalidPathException
  4.1911 +     *          if a {@code Path} object cannot be constructed from the abstract
  4.1912 +     *          path (see {@link java.nio.file.FileSystem#getPath FileSystem.getPath})
  4.1913 +     *
  4.1914 +     * @since   1.7
  4.1915 +     * @see Path#toFile
  4.1916 +     */
  4.1917 +//    public Path toPath() {
  4.1918 +//        Path result = filePath;
  4.1919 +//        if (result == null) {
  4.1920 +//            synchronized (this) {
  4.1921 +//                result = filePath;
  4.1922 +//                if (result == null) {
  4.1923 +//                    result = FileSystems.getDefault().getPath(path);
  4.1924 +//                    filePath = result;
  4.1925 +//                }
  4.1926 +//            }
  4.1927 +//        }
  4.1928 +//        return result;
  4.1929 +//    }
  4.1930 +}
     5.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2 +++ b/rt/emul/compact/src/main/java/java/io/FileFilter.java	Sun Sep 08 11:22:51 2013 +0200
     5.3 @@ -0,0 +1,50 @@
     5.4 +/*
     5.5 + * Copyright (c) 1998, 2002, Oracle and/or its affiliates. All rights reserved.
     5.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     5.7 + *
     5.8 + * This code is free software; you can redistribute it and/or modify it
     5.9 + * under the terms of the GNU General Public License version 2 only, as
    5.10 + * published by the Free Software Foundation.  Oracle designates this
    5.11 + * particular file as subject to the "Classpath" exception as provided
    5.12 + * by Oracle in the LICENSE file that accompanied this code.
    5.13 + *
    5.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
    5.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    5.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    5.17 + * version 2 for more details (a copy is included in the LICENSE file that
    5.18 + * accompanied this code).
    5.19 + *
    5.20 + * You should have received a copy of the GNU General Public License version
    5.21 + * 2 along with this work; if not, write to the Free Software Foundation,
    5.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    5.23 + *
    5.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    5.25 + * or visit www.oracle.com if you need additional information or have any
    5.26 + * questions.
    5.27 + */
    5.28 +
    5.29 +package java.io;
    5.30 +
    5.31 +
    5.32 +/**
    5.33 + * A filter for abstract pathnames.
    5.34 + *
    5.35 + * <p> Instances of this interface may be passed to the <code>{@link
    5.36 + * File#listFiles(java.io.FileFilter) listFiles(FileFilter)}</code> method
    5.37 + * of the <code>{@link java.io.File}</code> class.
    5.38 + *
    5.39 + * @since 1.2
    5.40 + */
    5.41 +public interface FileFilter {
    5.42 +
    5.43 +    /**
    5.44 +     * Tests whether or not the specified abstract pathname should be
    5.45 +     * included in a pathname list.
    5.46 +     *
    5.47 +     * @param  pathname  The abstract pathname to be tested
    5.48 +     * @return  <code>true</code> if and only if <code>pathname</code>
    5.49 +     *          should be included
    5.50 +     */
    5.51 +    boolean accept(File pathname);
    5.52 +
    5.53 +}
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/rt/emul/compact/src/main/java/java/io/FileNotFoundException.java	Sun Sep 08 11:22:51 2013 +0200
     6.3 @@ -0,0 +1,82 @@
     6.4 +/*
     6.5 + * Copyright (c) 1994, 2008, Oracle and/or its affiliates. All rights reserved.
     6.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     6.7 + *
     6.8 + * This code is free software; you can redistribute it and/or modify it
     6.9 + * under the terms of the GNU General Public License version 2 only, as
    6.10 + * published by the Free Software Foundation.  Oracle designates this
    6.11 + * particular file as subject to the "Classpath" exception as provided
    6.12 + * by Oracle in the LICENSE file that accompanied this code.
    6.13 + *
    6.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
    6.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    6.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    6.17 + * version 2 for more details (a copy is included in the LICENSE file that
    6.18 + * accompanied this code).
    6.19 + *
    6.20 + * You should have received a copy of the GNU General Public License version
    6.21 + * 2 along with this work; if not, write to the Free Software Foundation,
    6.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    6.23 + *
    6.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    6.25 + * or visit www.oracle.com if you need additional information or have any
    6.26 + * questions.
    6.27 + */
    6.28 +
    6.29 +package java.io;
    6.30 +
    6.31 +
    6.32 +/**
    6.33 + * Signals that an attempt to open the file denoted by a specified pathname
    6.34 + * has failed.
    6.35 + *
    6.36 + * <p> This exception will be thrown by the {@link FileInputStream}, {@link
    6.37 + * FileOutputStream}, and {@link RandomAccessFile} constructors when a file
    6.38 + * with the specified pathname does not exist.  It will also be thrown by these
    6.39 + * constructors if the file does exist but for some reason is inaccessible, for
    6.40 + * example when an attempt is made to open a read-only file for writing.
    6.41 + *
    6.42 + * @author  unascribed
    6.43 + * @since   JDK1.0
    6.44 + */
    6.45 +
    6.46 +public class FileNotFoundException extends IOException {
    6.47 +    private static final long serialVersionUID = -897856973823710492L;
    6.48 +
    6.49 +    /**
    6.50 +     * Constructs a <code>FileNotFoundException</code> with
    6.51 +     * <code>null</code> as its error detail message.
    6.52 +     */
    6.53 +    public FileNotFoundException() {
    6.54 +        super();
    6.55 +    }
    6.56 +
    6.57 +    /**
    6.58 +     * Constructs a <code>FileNotFoundException</code> with the
    6.59 +     * specified detail message. The string <code>s</code> can be
    6.60 +     * retrieved later by the
    6.61 +     * <code>{@link java.lang.Throwable#getMessage}</code>
    6.62 +     * method of class <code>java.lang.Throwable</code>.
    6.63 +     *
    6.64 +     * @param   s   the detail message.
    6.65 +     */
    6.66 +    public FileNotFoundException(String s) {
    6.67 +        super(s);
    6.68 +    }
    6.69 +
    6.70 +    /**
    6.71 +     * Constructs a <code>FileNotFoundException</code> with a detail message
    6.72 +     * consisting of the given pathname string followed by the given reason
    6.73 +     * string.  If the <code>reason</code> argument is <code>null</code> then
    6.74 +     * it will be omitted.  This private constructor is invoked only by native
    6.75 +     * I/O methods.
    6.76 +     *
    6.77 +     * @since 1.2
    6.78 +     */
    6.79 +    private FileNotFoundException(String path, String reason) {
    6.80 +        super(path + ((reason == null)
    6.81 +                      ? ""
    6.82 +                      : " (" + reason + ")"));
    6.83 +    }
    6.84 +
    6.85 +}
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/rt/emul/compact/src/main/java/java/io/FilenameFilter.java	Sun Sep 08 11:22:51 2013 +0200
     7.3 @@ -0,0 +1,53 @@
     7.4 +/*
     7.5 + * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
     7.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     7.7 + *
     7.8 + * This code is free software; you can redistribute it and/or modify it
     7.9 + * under the terms of the GNU General Public License version 2 only, as
    7.10 + * published by the Free Software Foundation.  Oracle designates this
    7.11 + * particular file as subject to the "Classpath" exception as provided
    7.12 + * by Oracle in the LICENSE file that accompanied this code.
    7.13 + *
    7.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
    7.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    7.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    7.17 + * version 2 for more details (a copy is included in the LICENSE file that
    7.18 + * accompanied this code).
    7.19 + *
    7.20 + * You should have received a copy of the GNU General Public License version
    7.21 + * 2 along with this work; if not, write to the Free Software Foundation,
    7.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    7.23 + *
    7.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    7.25 + * or visit www.oracle.com if you need additional information or have any
    7.26 + * questions.
    7.27 + */
    7.28 +
    7.29 +package java.io;
    7.30 +
    7.31 +/**
    7.32 + * Instances of classes that implement this interface are used to
    7.33 + * filter filenames. These instances are used to filter directory
    7.34 + * listings in the <code>list</code> method of class
    7.35 + * <code>File</code>, and by the Abstract Window Toolkit's file
    7.36 + * dialog component.
    7.37 + *
    7.38 + * @author  Arthur van Hoff
    7.39 + * @author  Jonathan Payne
    7.40 + * @see     java.awt.FileDialog#setFilenameFilter(java.io.FilenameFilter)
    7.41 + * @see     java.io.File
    7.42 + * @see     java.io.File#list(java.io.FilenameFilter)
    7.43 + * @since   JDK1.0
    7.44 + */
    7.45 +public
    7.46 +interface FilenameFilter {
    7.47 +    /**
    7.48 +     * Tests if a specified file should be included in a file list.
    7.49 +     *
    7.50 +     * @param   dir    the directory in which the file was found.
    7.51 +     * @param   name   the name of the file.
    7.52 +     * @return  <code>true</code> if and only if the name should be
    7.53 +     * included in the file list; <code>false</code> otherwise.
    7.54 +     */
    7.55 +    boolean accept(File dir, String name);
    7.56 +}
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/rt/emul/compact/src/main/java/java/io/InterruptedIOException.java	Sun Sep 08 11:22:51 2013 +0200
     8.3 @@ -0,0 +1,74 @@
     8.4 +/*
     8.5 + * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
     8.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     8.7 + *
     8.8 + * This code is free software; you can redistribute it and/or modify it
     8.9 + * under the terms of the GNU General Public License version 2 only, as
    8.10 + * published by the Free Software Foundation.  Oracle designates this
    8.11 + * particular file as subject to the "Classpath" exception as provided
    8.12 + * by Oracle in the LICENSE file that accompanied this code.
    8.13 + *
    8.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
    8.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    8.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    8.17 + * version 2 for more details (a copy is included in the LICENSE file that
    8.18 + * accompanied this code).
    8.19 + *
    8.20 + * You should have received a copy of the GNU General Public License version
    8.21 + * 2 along with this work; if not, write to the Free Software Foundation,
    8.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    8.23 + *
    8.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    8.25 + * or visit www.oracle.com if you need additional information or have any
    8.26 + * questions.
    8.27 + */
    8.28 +
    8.29 +package java.io;
    8.30 +
    8.31 +/**
    8.32 + * Signals that an I/O operation has been interrupted. An
    8.33 + * <code>InterruptedIOException</code> is thrown to indicate that an
    8.34 + * input or output transfer has been terminated because the thread
    8.35 + * performing it was interrupted. The field {@link #bytesTransferred}
    8.36 + * indicates how many bytes were successfully transferred before
    8.37 + * the interruption occurred.
    8.38 + *
    8.39 + * @author  unascribed
    8.40 + * @see     java.io.InputStream
    8.41 + * @see     java.io.OutputStream
    8.42 + * @see     java.lang.Thread#interrupt()
    8.43 + * @since   JDK1.0
    8.44 + */
    8.45 +public
    8.46 +class InterruptedIOException extends IOException {
    8.47 +    private static final long serialVersionUID = 4020568460727500567L;
    8.48 +
    8.49 +    /**
    8.50 +     * Constructs an <code>InterruptedIOException</code> with
    8.51 +     * <code>null</code> as its error detail message.
    8.52 +     */
    8.53 +    public InterruptedIOException() {
    8.54 +        super();
    8.55 +    }
    8.56 +
    8.57 +    /**
    8.58 +     * Constructs an <code>InterruptedIOException</code> with the
    8.59 +     * specified detail message. The string <code>s</code> can be
    8.60 +     * retrieved later by the
    8.61 +     * <code>{@link java.lang.Throwable#getMessage}</code>
    8.62 +     * method of class <code>java.lang.Throwable</code>.
    8.63 +     *
    8.64 +     * @param   s   the detail message.
    8.65 +     */
    8.66 +    public InterruptedIOException(String s) {
    8.67 +        super(s);
    8.68 +    }
    8.69 +
    8.70 +    /**
    8.71 +     * Reports how many bytes had been transferred as part of the I/O
    8.72 +     * operation before it was interrupted.
    8.73 +     *
    8.74 +     * @serial
    8.75 +     */
    8.76 +    public int bytesTransferred = 0;
    8.77 +}
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/rt/emul/compact/src/main/java/java/io/OutputStreamWriter.java	Sun Sep 08 11:22:51 2013 +0200
     9.3 @@ -0,0 +1,242 @@
     9.4 +/*
     9.5 + * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
     9.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     9.7 + *
     9.8 + * This code is free software; you can redistribute it and/or modify it
     9.9 + * under the terms of the GNU General Public License version 2 only, as
    9.10 + * published by the Free Software Foundation.  Oracle designates this
    9.11 + * particular file as subject to the "Classpath" exception as provided
    9.12 + * by Oracle in the LICENSE file that accompanied this code.
    9.13 + *
    9.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
    9.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    9.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    9.17 + * version 2 for more details (a copy is included in the LICENSE file that
    9.18 + * accompanied this code).
    9.19 + *
    9.20 + * You should have received a copy of the GNU General Public License version
    9.21 + * 2 along with this work; if not, write to the Free Software Foundation,
    9.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    9.23 + *
    9.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    9.25 + * or visit www.oracle.com if you need additional information or have any
    9.26 + * questions.
    9.27 + */
    9.28 +
    9.29 +package java.io;
    9.30 +
    9.31 +/**
    9.32 + * An OutputStreamWriter is a bridge from character streams to byte streams:
    9.33 + * Characters written to it are encoded into bytes using a specified {@link
    9.34 + * java.nio.charset.Charset <code>charset</code>}.  The charset that it uses
    9.35 + * may be specified by name or may be given explicitly, or the platform's
    9.36 + * default charset may be accepted.
    9.37 + *
    9.38 + * <p> Each invocation of a write() method causes the encoding converter to be
    9.39 + * invoked on the given character(s).  The resulting bytes are accumulated in a
    9.40 + * buffer before being written to the underlying output stream.  The size of
    9.41 + * this buffer may be specified, but by default it is large enough for most
    9.42 + * purposes.  Note that the characters passed to the write() methods are not
    9.43 + * buffered.
    9.44 + *
    9.45 + * <p> For top efficiency, consider wrapping an OutputStreamWriter within a
    9.46 + * BufferedWriter so as to avoid frequent converter invocations.  For example:
    9.47 + *
    9.48 + * <pre>
    9.49 + * Writer out
    9.50 + *   = new BufferedWriter(new OutputStreamWriter(System.out));
    9.51 + * </pre>
    9.52 + *
    9.53 + * <p> A <i>surrogate pair</i> is a character represented by a sequence of two
    9.54 + * <tt>char</tt> values: A <i>high</i> surrogate in the range '&#92;uD800' to
    9.55 + * '&#92;uDBFF' followed by a <i>low</i> surrogate in the range '&#92;uDC00' to
    9.56 + * '&#92;uDFFF'.
    9.57 + *
    9.58 + * <p> A <i>malformed surrogate element</i> is a high surrogate that is not
    9.59 + * followed by a low surrogate or a low surrogate that is not preceded by a
    9.60 + * high surrogate.
    9.61 + *
    9.62 + * <p> This class always replaces malformed surrogate elements and unmappable
    9.63 + * character sequences with the charset's default <i>substitution sequence</i>.
    9.64 + * The {@linkplain java.nio.charset.CharsetEncoder} class should be used when more
    9.65 + * control over the encoding process is required.
    9.66 + *
    9.67 + * @see BufferedWriter
    9.68 + * @see OutputStream
    9.69 + * @see java.nio.charset.Charset
    9.70 + *
    9.71 + * @author      Mark Reinhold
    9.72 + * @since       JDK1.1
    9.73 + */
    9.74 +
    9.75 +public class OutputStreamWriter extends Writer {
    9.76 +    
    9.77 +    /**
    9.78 +     * Creates an OutputStreamWriter that uses the named charset.
    9.79 +     *
    9.80 +     * @param  out
    9.81 +     *         An OutputStream
    9.82 +     *
    9.83 +     * @param  charsetName
    9.84 +     *         The name of a supported
    9.85 +     *         {@link java.nio.charset.Charset </code>charset<code>}
    9.86 +     *
    9.87 +     * @exception  UnsupportedEncodingException
    9.88 +     *             If the named encoding is not supported
    9.89 +     */
    9.90 +    public OutputStreamWriter(OutputStream out, String charsetName)
    9.91 +        throws UnsupportedEncodingException
    9.92 +    {
    9.93 +        super(out);
    9.94 +        if (charsetName == null)
    9.95 +            throw new NullPointerException("charsetName");
    9.96 +        if (!charsetName.toUpperCase().equals("UTF-8")) {
    9.97 +            throw new UnsupportedEncodingException(charsetName);
    9.98 +        }
    9.99 +    }
   9.100 +
   9.101 +    /**
   9.102 +     * Creates an OutputStreamWriter that uses the default character encoding.
   9.103 +     *
   9.104 +     * @param  out  An OutputStream
   9.105 +     */
   9.106 +    public OutputStreamWriter(OutputStream out) {
   9.107 +        super(out);
   9.108 +    }
   9.109 +
   9.110 +    /**
   9.111 +     * Creates an OutputStreamWriter that uses the given charset. </p>
   9.112 +     *
   9.113 +     * @param  out
   9.114 +     *         An OutputStream
   9.115 +     *
   9.116 +     * @param  cs
   9.117 +     *         A charset
   9.118 +     *
   9.119 +     * @since 1.4
   9.120 +     * @spec JSR-51
   9.121 +     */
   9.122 +//    public OutputStreamWriter(OutputStream out, Charset cs) {
   9.123 +//        super(out);
   9.124 +//        if (cs == null)
   9.125 +//            throw new NullPointerException("charset");
   9.126 +//        se = StreamEncoder.forOutputStreamWriter(out, this, cs);
   9.127 +//    }
   9.128 +
   9.129 +    /**
   9.130 +     * Creates an OutputStreamWriter that uses the given charset encoder.  </p>
   9.131 +     *
   9.132 +     * @param  out
   9.133 +     *         An OutputStream
   9.134 +     *
   9.135 +     * @param  enc
   9.136 +     *         A charset encoder
   9.137 +     *
   9.138 +     * @since 1.4
   9.139 +     * @spec JSR-51
   9.140 +     */
   9.141 +//    public OutputStreamWriter(OutputStream out, CharsetEncoder enc) {
   9.142 +//        super(out);
   9.143 +//        if (enc == null)
   9.144 +//            throw new NullPointerException("charset encoder");
   9.145 +//        se = StreamEncoder.forOutputStreamWriter(out, this, enc);
   9.146 +//    }
   9.147 +
   9.148 +    /**
   9.149 +     * Returns the name of the character encoding being used by this stream.
   9.150 +     *
   9.151 +     * <p> If the encoding has an historical name then that name is returned;
   9.152 +     * otherwise the encoding's canonical name is returned.
   9.153 +     *
   9.154 +     * <p> If this instance was created with the {@link
   9.155 +     * #OutputStreamWriter(OutputStream, String)} constructor then the returned
   9.156 +     * name, being unique for the encoding, may differ from the name passed to
   9.157 +     * the constructor.  This method may return <tt>null</tt> if the stream has
   9.158 +     * been closed. </p>
   9.159 +     *
   9.160 +     * @return The historical name of this encoding, or possibly
   9.161 +     *         <code>null</code> if the stream has been closed
   9.162 +     *
   9.163 +     * @see java.nio.charset.Charset
   9.164 +     *
   9.165 +     * @revised 1.4
   9.166 +     * @spec JSR-51
   9.167 +     */
   9.168 +    public String getEncoding() {
   9.169 +        return "UTF-8";
   9.170 +    }
   9.171 +
   9.172 +    /**
   9.173 +     * Flushes the output buffer to the underlying byte stream, without flushing
   9.174 +     * the byte stream itself.  This method is non-private only so that it may
   9.175 +     * be invoked by PrintStream.
   9.176 +     */
   9.177 +    void flushBuffer() throws IOException {
   9.178 +        out().flush();
   9.179 +    }
   9.180 +
   9.181 +    /**
   9.182 +     * Writes a single character.
   9.183 +     *
   9.184 +     * @exception  IOException  If an I/O error occurs
   9.185 +     */
   9.186 +    public void write(int c) throws IOException {
   9.187 +        if (c <= 0x7F) {
   9.188 +            out().write(c);
   9.189 +        } else if (c <= 0x7FF) {
   9.190 +            out().write(0xC0 | (c >> 6));
   9.191 +            out().write(0x80 | (c & 0x3F));
   9.192 +        } else {
   9.193 +            out().write(0xE0 | (c >> 12));
   9.194 +            out().write(0x80 | ((c >> 6) & 0x3F));
   9.195 +            out().write(0x80 | (c & 0x3F));
   9.196 +        }
   9.197 +    }
   9.198 +
   9.199 +    /**
   9.200 +     * Writes a portion of an array of characters.
   9.201 +     *
   9.202 +     * @param  cbuf  Buffer of characters
   9.203 +     * @param  off   Offset from which to start writing characters
   9.204 +     * @param  len   Number of characters to write
   9.205 +     *
   9.206 +     * @exception  IOException  If an I/O error occurs
   9.207 +     */
   9.208 +    public void write(char cbuf[], int off, int len) throws IOException {
   9.209 +        while (len-- > 0) {
   9.210 +            write(cbuf[off++]);
   9.211 +        }
   9.212 +    }
   9.213 +
   9.214 +    /**
   9.215 +     * Writes a portion of a string.
   9.216 +     *
   9.217 +     * @param  str  A String
   9.218 +     * @param  off  Offset from which to start writing characters
   9.219 +     * @param  len  Number of characters to write
   9.220 +     *
   9.221 +     * @exception  IOException  If an I/O error occurs
   9.222 +     */
   9.223 +    public void write(String str, int off, int len) throws IOException {
   9.224 +        while (len-- > 0) {
   9.225 +            write(str.charAt(off++));
   9.226 +        }
   9.227 +    }
   9.228 +
   9.229 +    /**
   9.230 +     * Flushes the stream.
   9.231 +     *
   9.232 +     * @exception  IOException  If an I/O error occurs
   9.233 +     */
   9.234 +    public void flush() throws IOException {
   9.235 +        out().flush();
   9.236 +    }
   9.237 +
   9.238 +    public void close() throws IOException {
   9.239 +        out().close();
   9.240 +    }
   9.241 +    
   9.242 +    private OutputStream out() {
   9.243 +        return (OutputStream) lock;
   9.244 +    }
   9.245 +}
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/rt/emul/compact/src/main/java/java/io/PrintStream.java	Sun Sep 08 11:22:51 2013 +0200
    10.3 @@ -0,0 +1,1125 @@
    10.4 +/*
    10.5 + * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
    10.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    10.7 + *
    10.8 + * This code is free software; you can redistribute it and/or modify it
    10.9 + * under the terms of the GNU General Public License version 2 only, as
   10.10 + * published by the Free Software Foundation.  Oracle designates this
   10.11 + * particular file as subject to the "Classpath" exception as provided
   10.12 + * by Oracle in the LICENSE file that accompanied this code.
   10.13 + *
   10.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   10.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   10.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   10.17 + * version 2 for more details (a copy is included in the LICENSE file that
   10.18 + * accompanied this code).
   10.19 + *
   10.20 + * You should have received a copy of the GNU General Public License version
   10.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   10.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   10.23 + *
   10.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   10.25 + * or visit www.oracle.com if you need additional information or have any
   10.26 + * questions.
   10.27 + */
   10.28 +
   10.29 +package java.io;
   10.30 +
   10.31 +import java.util.Arrays;
   10.32 +
   10.33 +
   10.34 +/**
   10.35 + * A <code>PrintStream</code> adds functionality to another output stream,
   10.36 + * namely the ability to print representations of various data values
   10.37 + * conveniently.  Two other features are provided as well.  Unlike other output
   10.38 + * streams, a <code>PrintStream</code> never throws an
   10.39 + * <code>IOException</code>; instead, exceptional situations merely set an
   10.40 + * internal flag that can be tested via the <code>checkError</code> method.
   10.41 + * Optionally, a <code>PrintStream</code> can be created so as to flush
   10.42 + * automatically; this means that the <code>flush</code> method is
   10.43 + * automatically invoked after a byte array is written, one of the
   10.44 + * <code>println</code> methods is invoked, or a newline character or byte
   10.45 + * (<code>'\n'</code>) is written.
   10.46 + *
   10.47 + * <p> All characters printed by a <code>PrintStream</code> are converted into
   10.48 + * bytes using the platform's default character encoding.  The <code>{@link
   10.49 + * PrintWriter}</code> class should be used in situations that require writing
   10.50 + * characters rather than bytes.
   10.51 + *
   10.52 + * @author     Frank Yellin
   10.53 + * @author     Mark Reinhold
   10.54 + * @since      JDK1.0
   10.55 + */
   10.56 +
   10.57 +public class PrintStream extends FilterOutputStream
   10.58 +    implements Appendable, Closeable
   10.59 +{
   10.60 +
   10.61 +    private final boolean autoFlush;
   10.62 +    private boolean trouble = false;
   10.63 +    private Formatter formatter;
   10.64 +
   10.65 +    /**
   10.66 +     * Track both the text- and character-output streams, so that their buffers
   10.67 +     * can be flushed without flushing the entire stream.
   10.68 +     */
   10.69 +    private BufferedWriter textOut;
   10.70 +    private OutputStreamWriter charOut;
   10.71 +
   10.72 +    /**
   10.73 +     * requireNonNull is explicitly declared here so as not to create an extra
   10.74 +     * dependency on java.util.Objects.requireNonNull. PrintStream is loaded
   10.75 +     * early during system initialization.
   10.76 +     */
   10.77 +    private static <T> T requireNonNull(T obj, String message) {
   10.78 +        if (obj == null)
   10.79 +            throw new NullPointerException(message);
   10.80 +        return obj;
   10.81 +    }
   10.82 +
   10.83 +    /* Private constructors */
   10.84 +    private PrintStream(boolean autoFlush, OutputStream out) {
   10.85 +        super(out);
   10.86 +        this.autoFlush = autoFlush;
   10.87 +        this.charOut = new OutputStreamWriter(this);
   10.88 +        this.textOut = new BufferedWriter(charOut);
   10.89 +    }
   10.90 +    
   10.91 +    static final class Formatter {
   10.92 +    }
   10.93 +    
   10.94 +    static final class Charset {
   10.95 +    }
   10.96 +    
   10.97 +    static Charset toCharset(String ch) throws UnsupportedEncodingException {
   10.98 +        if (!"UTF-8".equals(ch)) {
   10.99 +            throw new UnsupportedEncodingException();
  10.100 +        }
  10.101 +        return null;
  10.102 +    }
  10.103 +
  10.104 +    private PrintStream(boolean autoFlush, OutputStream out, Charset charset) {
  10.105 +        super(out);
  10.106 +        this.autoFlush = autoFlush;
  10.107 +        this.charOut = new OutputStreamWriter(this);
  10.108 +        this.textOut = new BufferedWriter(charOut);
  10.109 +    }
  10.110 +
  10.111 +    /* Variant of the private constructor so that the given charset name
  10.112 +     * can be verified before evaluating the OutputStream argument. Used
  10.113 +     * by constructors creating a FileOutputStream that also take a
  10.114 +     * charset name.
  10.115 +     */
  10.116 +    private PrintStream(boolean autoFlush, Charset charset, OutputStream out)
  10.117 +        throws UnsupportedEncodingException
  10.118 +    {
  10.119 +        this(autoFlush, out, charset);
  10.120 +    }
  10.121 +
  10.122 +    /**
  10.123 +     * Creates a new print stream.  This stream will not flush automatically.
  10.124 +     *
  10.125 +     * @param  out        The output stream to which values and objects will be
  10.126 +     *                    printed
  10.127 +     *
  10.128 +     * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream)
  10.129 +     */
  10.130 +    public PrintStream(OutputStream out) {
  10.131 +        this(out, false);
  10.132 +    }
  10.133 +
  10.134 +    /**
  10.135 +     * Creates a new print stream.
  10.136 +     *
  10.137 +     * @param  out        The output stream to which values and objects will be
  10.138 +     *                    printed
  10.139 +     * @param  autoFlush  A boolean; if true, the output buffer will be flushed
  10.140 +     *                    whenever a byte array is written, one of the
  10.141 +     *                    <code>println</code> methods is invoked, or a newline
  10.142 +     *                    character or byte (<code>'\n'</code>) is written
  10.143 +     *
  10.144 +     * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream, boolean)
  10.145 +     */
  10.146 +    public PrintStream(OutputStream out, boolean autoFlush) {
  10.147 +        this(autoFlush, requireNonNull(out, "Null output stream"));
  10.148 +    }
  10.149 +
  10.150 +    /**
  10.151 +     * Creates a new print stream.
  10.152 +     *
  10.153 +     * @param  out        The output stream to which values and objects will be
  10.154 +     *                    printed
  10.155 +     * @param  autoFlush  A boolean; if true, the output buffer will be flushed
  10.156 +     *                    whenever a byte array is written, one of the
  10.157 +     *                    <code>println</code> methods is invoked, or a newline
  10.158 +     *                    character or byte (<code>'\n'</code>) is written
  10.159 +     * @param  encoding   The name of a supported
  10.160 +     *                    <a href="../lang/package-summary.html#charenc">
  10.161 +     *                    character encoding</a>
  10.162 +     *
  10.163 +     * @throws  UnsupportedEncodingException
  10.164 +     *          If the named encoding is not supported
  10.165 +     *
  10.166 +     * @since  1.4
  10.167 +     */
  10.168 +    public PrintStream(OutputStream out, boolean autoFlush, String encoding)
  10.169 +        throws UnsupportedEncodingException
  10.170 +    {
  10.171 +        this(autoFlush,
  10.172 +             requireNonNull(out, "Null output stream"),
  10.173 +             toCharset(encoding));
  10.174 +    }
  10.175 +
  10.176 +    /**
  10.177 +     * Creates a new print stream, without automatic line flushing, with the
  10.178 +     * specified file name.  This convenience constructor creates
  10.179 +     * the necessary intermediate {@link java.io.OutputStreamWriter
  10.180 +     * OutputStreamWriter}, which will encode characters using the
  10.181 +     * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}
  10.182 +     * for this instance of the Java virtual machine.
  10.183 +     *
  10.184 +     * @param  fileName
  10.185 +     *         The name of the file to use as the destination of this print
  10.186 +     *         stream.  If the file exists, then it will be truncated to
  10.187 +     *         zero size; otherwise, a new file will be created.  The output
  10.188 +     *         will be written to the file and is buffered.
  10.189 +     *
  10.190 +     * @throws  FileNotFoundException
  10.191 +     *          If the given file object does not denote an existing, writable
  10.192 +     *          regular file and a new regular file of that name cannot be
  10.193 +     *          created, or if some other error occurs while opening or
  10.194 +     *          creating the file
  10.195 +     *
  10.196 +     * @throws  SecurityException
  10.197 +     *          If a security manager is present and {@link
  10.198 +     *          SecurityManager#checkWrite checkWrite(fileName)} denies write
  10.199 +     *          access to the file
  10.200 +     *
  10.201 +     * @since  1.5
  10.202 +     */
  10.203 +    public PrintStream(String fileName) throws FileNotFoundException {
  10.204 +        super(null);
  10.205 +        throw new FileNotFoundException();
  10.206 +    }
  10.207 +
  10.208 +    /**
  10.209 +     * Creates a new print stream, without automatic line flushing, with the
  10.210 +     * specified file name and charset.  This convenience constructor creates
  10.211 +     * the necessary intermediate {@link java.io.OutputStreamWriter
  10.212 +     * OutputStreamWriter}, which will encode characters using the provided
  10.213 +     * charset.
  10.214 +     *
  10.215 +     * @param  fileName
  10.216 +     *         The name of the file to use as the destination of this print
  10.217 +     *         stream.  If the file exists, then it will be truncated to
  10.218 +     *         zero size; otherwise, a new file will be created.  The output
  10.219 +     *         will be written to the file and is buffered.
  10.220 +     *
  10.221 +     * @param  csn
  10.222 +     *         The name of a supported {@linkplain java.nio.charset.Charset
  10.223 +     *         charset}
  10.224 +     *
  10.225 +     * @throws  FileNotFoundException
  10.226 +     *          If the given file object does not denote an existing, writable
  10.227 +     *          regular file and a new regular file of that name cannot be
  10.228 +     *          created, or if some other error occurs while opening or
  10.229 +     *          creating the file
  10.230 +     *
  10.231 +     * @throws  SecurityException
  10.232 +     *          If a security manager is present and {@link
  10.233 +     *          SecurityManager#checkWrite checkWrite(fileName)} denies write
  10.234 +     *          access to the file
  10.235 +     *
  10.236 +     * @throws  UnsupportedEncodingException
  10.237 +     *          If the named charset is not supported
  10.238 +     *
  10.239 +     * @since  1.5
  10.240 +     */
  10.241 +    public PrintStream(String fileName, String csn)
  10.242 +        throws FileNotFoundException, UnsupportedEncodingException
  10.243 +    {
  10.244 +        super(null);
  10.245 +        throw new FileNotFoundException();
  10.246 +    }
  10.247 +
  10.248 +    /**
  10.249 +     * Creates a new print stream, without automatic line flushing, with the
  10.250 +     * specified file.  This convenience constructor creates the necessary
  10.251 +     * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
  10.252 +     * which will encode characters using the {@linkplain
  10.253 +     * java.nio.charset.Charset#defaultCharset() default charset} for this
  10.254 +     * instance of the Java virtual machine.
  10.255 +     *
  10.256 +     * @param  file
  10.257 +     *         The file to use as the destination of this print stream.  If the
  10.258 +     *         file exists, then it will be truncated to zero size; otherwise,
  10.259 +     *         a new file will be created.  The output will be written to the
  10.260 +     *         file and is buffered.
  10.261 +     *
  10.262 +     * @throws  FileNotFoundException
  10.263 +     *          If the given file object does not denote an existing, writable
  10.264 +     *          regular file and a new regular file of that name cannot be
  10.265 +     *          created, or if some other error occurs while opening or
  10.266 +     *          creating the file
  10.267 +     *
  10.268 +     * @throws  SecurityException
  10.269 +     *          If a security manager is present and {@link
  10.270 +     *          SecurityManager#checkWrite checkWrite(file.getPath())}
  10.271 +     *          denies write access to the file
  10.272 +     *
  10.273 +     * @since  1.5
  10.274 +     */
  10.275 +    public PrintStream(File file) throws FileNotFoundException {
  10.276 +        super(null);
  10.277 +        throw new FileNotFoundException();
  10.278 +    }
  10.279 +
  10.280 +    /**
  10.281 +     * Creates a new print stream, without automatic line flushing, with the
  10.282 +     * specified file and charset.  This convenience constructor creates
  10.283 +     * the necessary intermediate {@link java.io.OutputStreamWriter
  10.284 +     * OutputStreamWriter}, which will encode characters using the provided
  10.285 +     * charset.
  10.286 +     *
  10.287 +     * @param  file
  10.288 +     *         The file to use as the destination of this print stream.  If the
  10.289 +     *         file exists, then it will be truncated to zero size; otherwise,
  10.290 +     *         a new file will be created.  The output will be written to the
  10.291 +     *         file and is buffered.
  10.292 +     *
  10.293 +     * @param  csn
  10.294 +     *         The name of a supported {@linkplain java.nio.charset.Charset
  10.295 +     *         charset}
  10.296 +     *
  10.297 +     * @throws  FileNotFoundException
  10.298 +     *          If the given file object does not denote an existing, writable
  10.299 +     *          regular file and a new regular file of that name cannot be
  10.300 +     *          created, or if some other error occurs while opening or
  10.301 +     *          creating the file
  10.302 +     *
  10.303 +     * @throws  SecurityException
  10.304 +     *          If a security manager is presentand {@link
  10.305 +     *          SecurityManager#checkWrite checkWrite(file.getPath())}
  10.306 +     *          denies write access to the file
  10.307 +     *
  10.308 +     * @throws  UnsupportedEncodingException
  10.309 +     *          If the named charset is not supported
  10.310 +     *
  10.311 +     * @since  1.5
  10.312 +     */
  10.313 +    public PrintStream(File file, String csn)
  10.314 +        throws FileNotFoundException, UnsupportedEncodingException
  10.315 +    {
  10.316 +        super(null);
  10.317 +        throw new FileNotFoundException();
  10.318 +    }
  10.319 +
  10.320 +    /** Check to make sure that the stream has not been closed */
  10.321 +    private void ensureOpen() throws IOException {
  10.322 +        if (out == null)
  10.323 +            throw new IOException("Stream closed");
  10.324 +    }
  10.325 +
  10.326 +    /**
  10.327 +     * Flushes the stream.  This is done by writing any buffered output bytes to
  10.328 +     * the underlying output stream and then flushing that stream.
  10.329 +     *
  10.330 +     * @see        java.io.OutputStream#flush()
  10.331 +     */
  10.332 +    public void flush() {
  10.333 +        synchronized (this) {
  10.334 +            try {
  10.335 +                ensureOpen();
  10.336 +                out.flush();
  10.337 +            }
  10.338 +            catch (IOException x) {
  10.339 +                trouble = true;
  10.340 +            }
  10.341 +        }
  10.342 +    }
  10.343 +
  10.344 +    private boolean closing = false; /* To avoid recursive closing */
  10.345 +
  10.346 +    /**
  10.347 +     * Closes the stream.  This is done by flushing the stream and then closing
  10.348 +     * the underlying output stream.
  10.349 +     *
  10.350 +     * @see        java.io.OutputStream#close()
  10.351 +     */
  10.352 +    public void close() {
  10.353 +        synchronized (this) {
  10.354 +            if (! closing) {
  10.355 +                closing = true;
  10.356 +                try {
  10.357 +                    textOut.close();
  10.358 +                    out.close();
  10.359 +                }
  10.360 +                catch (IOException x) {
  10.361 +                    trouble = true;
  10.362 +                }
  10.363 +                textOut = null;
  10.364 +                charOut = null;
  10.365 +                out = null;
  10.366 +            }
  10.367 +        }
  10.368 +    }
  10.369 +
  10.370 +    /**
  10.371 +     * Flushes the stream and checks its error state. The internal error state
  10.372 +     * is set to <code>true</code> when the underlying output stream throws an
  10.373 +     * <code>IOException</code> other than <code>InterruptedIOException</code>,
  10.374 +     * and when the <code>setError</code> method is invoked.  If an operation
  10.375 +     * on the underlying output stream throws an
  10.376 +     * <code>InterruptedIOException</code>, then the <code>PrintStream</code>
  10.377 +     * converts the exception back into an interrupt by doing:
  10.378 +     * <pre>
  10.379 +     *     Thread.currentThread().interrupt();
  10.380 +     * </pre>
  10.381 +     * or the equivalent.
  10.382 +     *
  10.383 +     * @return <code>true</code> if and only if this stream has encountered an
  10.384 +     *         <code>IOException</code> other than
  10.385 +     *         <code>InterruptedIOException</code>, or the
  10.386 +     *         <code>setError</code> method has been invoked
  10.387 +     */
  10.388 +    public boolean checkError() {
  10.389 +        if (out != null)
  10.390 +            flush();
  10.391 +        if (out instanceof java.io.PrintStream) {
  10.392 +            PrintStream ps = (PrintStream) out;
  10.393 +            return ps.checkError();
  10.394 +        }
  10.395 +        return trouble;
  10.396 +    }
  10.397 +
  10.398 +    /**
  10.399 +     * Sets the error state of the stream to <code>true</code>.
  10.400 +     *
  10.401 +     * <p> This method will cause subsequent invocations of {@link
  10.402 +     * #checkError()} to return <tt>true</tt> until {@link
  10.403 +     * #clearError()} is invoked.
  10.404 +     *
  10.405 +     * @since JDK1.1
  10.406 +     */
  10.407 +    protected void setError() {
  10.408 +        trouble = true;
  10.409 +    }
  10.410 +
  10.411 +    /**
  10.412 +     * Clears the internal error state of this stream.
  10.413 +     *
  10.414 +     * <p> This method will cause subsequent invocations of {@link
  10.415 +     * #checkError()} to return <tt>false</tt> until another write
  10.416 +     * operation fails and invokes {@link #setError()}.
  10.417 +     *
  10.418 +     * @since 1.6
  10.419 +     */
  10.420 +    protected void clearError() {
  10.421 +        trouble = false;
  10.422 +    }
  10.423 +
  10.424 +    /*
  10.425 +     * Exception-catching, synchronized output operations,
  10.426 +     * which also implement the write() methods of OutputStream
  10.427 +     */
  10.428 +
  10.429 +    /**
  10.430 +     * Writes the specified byte to this stream.  If the byte is a newline and
  10.431 +     * automatic flushing is enabled then the <code>flush</code> method will be
  10.432 +     * invoked.
  10.433 +     *
  10.434 +     * <p> Note that the byte is written as given; to write a character that
  10.435 +     * will be translated according to the platform's default character
  10.436 +     * encoding, use the <code>print(char)</code> or <code>println(char)</code>
  10.437 +     * methods.
  10.438 +     *
  10.439 +     * @param  b  The byte to be written
  10.440 +     * @see #print(char)
  10.441 +     * @see #println(char)
  10.442 +     */
  10.443 +    public void write(int b) {
  10.444 +        try {
  10.445 +            synchronized (this) {
  10.446 +                ensureOpen();
  10.447 +                out.write(b);
  10.448 +                if ((b == '\n') && autoFlush)
  10.449 +                    out.flush();
  10.450 +            }
  10.451 +        }
  10.452 +        catch (InterruptedIOException x) {
  10.453 +            Thread.currentThread().interrupt();
  10.454 +        }
  10.455 +        catch (IOException x) {
  10.456 +            trouble = true;
  10.457 +        }
  10.458 +    }
  10.459 +
  10.460 +    /**
  10.461 +     * Writes <code>len</code> bytes from the specified byte array starting at
  10.462 +     * offset <code>off</code> to this stream.  If automatic flushing is
  10.463 +     * enabled then the <code>flush</code> method will be invoked.
  10.464 +     *
  10.465 +     * <p> Note that the bytes will be written as given; to write characters
  10.466 +     * that will be translated according to the platform's default character
  10.467 +     * encoding, use the <code>print(char)</code> or <code>println(char)</code>
  10.468 +     * methods.
  10.469 +     *
  10.470 +     * @param  buf   A byte array
  10.471 +     * @param  off   Offset from which to start taking bytes
  10.472 +     * @param  len   Number of bytes to write
  10.473 +     */
  10.474 +    public void write(byte buf[], int off, int len) {
  10.475 +        try {
  10.476 +            synchronized (this) {
  10.477 +                ensureOpen();
  10.478 +                out.write(buf, off, len);
  10.479 +                if (autoFlush)
  10.480 +                    out.flush();
  10.481 +            }
  10.482 +        }
  10.483 +        catch (InterruptedIOException x) {
  10.484 +            Thread.currentThread().interrupt();
  10.485 +        }
  10.486 +        catch (IOException x) {
  10.487 +            trouble = true;
  10.488 +        }
  10.489 +    }
  10.490 +
  10.491 +    /*
  10.492 +     * The following private methods on the text- and character-output streams
  10.493 +     * always flush the stream buffers, so that writes to the underlying byte
  10.494 +     * stream occur as promptly as with the original PrintStream.
  10.495 +     */
  10.496 +
  10.497 +    private void write(char buf[]) {
  10.498 +        try {
  10.499 +            synchronized (this) {
  10.500 +                ensureOpen();
  10.501 +                textOut.write(buf);
  10.502 +                textOut.flushBuffer();
  10.503 +                charOut.flushBuffer();
  10.504 +                if (autoFlush) {
  10.505 +                    for (int i = 0; i < buf.length; i++)
  10.506 +                        if (buf[i] == '\n')
  10.507 +                            out.flush();
  10.508 +                }
  10.509 +            }
  10.510 +        }
  10.511 +        catch (InterruptedIOException x) {
  10.512 +            Thread.currentThread().interrupt();
  10.513 +        }
  10.514 +        catch (IOException x) {
  10.515 +            trouble = true;
  10.516 +        }
  10.517 +    }
  10.518 +
  10.519 +    private void write(String s) {
  10.520 +        try {
  10.521 +            synchronized (this) {
  10.522 +                ensureOpen();
  10.523 +                textOut.write(s);
  10.524 +                textOut.flushBuffer();
  10.525 +                charOut.flushBuffer();
  10.526 +                if (autoFlush && (s.indexOf('\n') >= 0))
  10.527 +                    out.flush();
  10.528 +            }
  10.529 +        }
  10.530 +        catch (InterruptedIOException x) {
  10.531 +            Thread.currentThread().interrupt();
  10.532 +        }
  10.533 +        catch (IOException x) {
  10.534 +            trouble = true;
  10.535 +        }
  10.536 +    }
  10.537 +
  10.538 +    private void newLine() {
  10.539 +        try {
  10.540 +            synchronized (this) {
  10.541 +                ensureOpen();
  10.542 +                textOut.newLine();
  10.543 +                textOut.flushBuffer();
  10.544 +                charOut.flushBuffer();
  10.545 +                if (autoFlush)
  10.546 +                    out.flush();
  10.547 +            }
  10.548 +        }
  10.549 +        catch (InterruptedIOException x) {
  10.550 +            Thread.currentThread().interrupt();
  10.551 +        }
  10.552 +        catch (IOException x) {
  10.553 +            trouble = true;
  10.554 +        }
  10.555 +    }
  10.556 +
  10.557 +    /* Methods that do not terminate lines */
  10.558 +
  10.559 +    /**
  10.560 +     * Prints a boolean value.  The string produced by <code>{@link
  10.561 +     * java.lang.String#valueOf(boolean)}</code> is translated into bytes
  10.562 +     * according to the platform's default character encoding, and these bytes
  10.563 +     * are written in exactly the manner of the
  10.564 +     * <code>{@link #write(int)}</code> method.
  10.565 +     *
  10.566 +     * @param      b   The <code>boolean</code> to be printed
  10.567 +     */
  10.568 +    public void print(boolean b) {
  10.569 +        write(b ? "true" : "false");
  10.570 +    }
  10.571 +
  10.572 +    /**
  10.573 +     * Prints a character.  The character is translated into one or more bytes
  10.574 +     * according to the platform's default character encoding, and these bytes
  10.575 +     * are written in exactly the manner of the
  10.576 +     * <code>{@link #write(int)}</code> method.
  10.577 +     *
  10.578 +     * @param      c   The <code>char</code> to be printed
  10.579 +     */
  10.580 +    public void print(char c) {
  10.581 +        write(String.valueOf(c));
  10.582 +    }
  10.583 +
  10.584 +    /**
  10.585 +     * Prints an integer.  The string produced by <code>{@link
  10.586 +     * java.lang.String#valueOf(int)}</code> is translated into bytes
  10.587 +     * according to the platform's default character encoding, and these bytes
  10.588 +     * are written in exactly the manner of the
  10.589 +     * <code>{@link #write(int)}</code> method.
  10.590 +     *
  10.591 +     * @param      i   The <code>int</code> to be printed
  10.592 +     * @see        java.lang.Integer#toString(int)
  10.593 +     */
  10.594 +    public void print(int i) {
  10.595 +        write(String.valueOf(i));
  10.596 +    }
  10.597 +
  10.598 +    /**
  10.599 +     * Prints a long integer.  The string produced by <code>{@link
  10.600 +     * java.lang.String#valueOf(long)}</code> is translated into bytes
  10.601 +     * according to the platform's default character encoding, and these bytes
  10.602 +     * are written in exactly the manner of the
  10.603 +     * <code>{@link #write(int)}</code> method.
  10.604 +     *
  10.605 +     * @param      l   The <code>long</code> to be printed
  10.606 +     * @see        java.lang.Long#toString(long)
  10.607 +     */
  10.608 +    public void print(long l) {
  10.609 +        write(String.valueOf(l));
  10.610 +    }
  10.611 +
  10.612 +    /**
  10.613 +     * Prints a floating-point number.  The string produced by <code>{@link
  10.614 +     * java.lang.String#valueOf(float)}</code> is translated into bytes
  10.615 +     * according to the platform's default character encoding, and these bytes
  10.616 +     * are written in exactly the manner of the
  10.617 +     * <code>{@link #write(int)}</code> method.
  10.618 +     *
  10.619 +     * @param      f   The <code>float</code> to be printed
  10.620 +     * @see        java.lang.Float#toString(float)
  10.621 +     */
  10.622 +    public void print(float f) {
  10.623 +        write(String.valueOf(f));
  10.624 +    }
  10.625 +
  10.626 +    /**
  10.627 +     * Prints a double-precision floating-point number.  The string produced by
  10.628 +     * <code>{@link java.lang.String#valueOf(double)}</code> is translated into
  10.629 +     * bytes according to the platform's default character encoding, and these
  10.630 +     * bytes are written in exactly the manner of the <code>{@link
  10.631 +     * #write(int)}</code> method.
  10.632 +     *
  10.633 +     * @param      d   The <code>double</code> to be printed
  10.634 +     * @see        java.lang.Double#toString(double)
  10.635 +     */
  10.636 +    public void print(double d) {
  10.637 +        write(String.valueOf(d));
  10.638 +    }
  10.639 +
  10.640 +    /**
  10.641 +     * Prints an array of characters.  The characters are converted into bytes
  10.642 +     * according to the platform's default character encoding, and these bytes
  10.643 +     * are written in exactly the manner of the
  10.644 +     * <code>{@link #write(int)}</code> method.
  10.645 +     *
  10.646 +     * @param      s   The array of chars to be printed
  10.647 +     *
  10.648 +     * @throws  NullPointerException  If <code>s</code> is <code>null</code>
  10.649 +     */
  10.650 +    public void print(char s[]) {
  10.651 +        write(s);
  10.652 +    }
  10.653 +
  10.654 +    /**
  10.655 +     * Prints a string.  If the argument is <code>null</code> then the string
  10.656 +     * <code>"null"</code> is printed.  Otherwise, the string's characters are
  10.657 +     * converted into bytes according to the platform's default character
  10.658 +     * encoding, and these bytes are written in exactly the manner of the
  10.659 +     * <code>{@link #write(int)}</code> method.
  10.660 +     *
  10.661 +     * @param      s   The <code>String</code> to be printed
  10.662 +     */
  10.663 +    public void print(String s) {
  10.664 +        if (s == null) {
  10.665 +            s = "null";
  10.666 +        }
  10.667 +        write(s);
  10.668 +    }
  10.669 +
  10.670 +    /**
  10.671 +     * Prints an object.  The string produced by the <code>{@link
  10.672 +     * java.lang.String#valueOf(Object)}</code> method is translated into bytes
  10.673 +     * according to the platform's default character encoding, and these bytes
  10.674 +     * are written in exactly the manner of the
  10.675 +     * <code>{@link #write(int)}</code> method.
  10.676 +     *
  10.677 +     * @param      obj   The <code>Object</code> to be printed
  10.678 +     * @see        java.lang.Object#toString()
  10.679 +     */
  10.680 +    public void print(Object obj) {
  10.681 +        write(String.valueOf(obj));
  10.682 +    }
  10.683 +
  10.684 +
  10.685 +    /* Methods that do terminate lines */
  10.686 +
  10.687 +    /**
  10.688 +     * Terminates the current line by writing the line separator string.  The
  10.689 +     * line separator string is defined by the system property
  10.690 +     * <code>line.separator</code>, and is not necessarily a single newline
  10.691 +     * character (<code>'\n'</code>).
  10.692 +     */
  10.693 +    public void println() {
  10.694 +        newLine();
  10.695 +    }
  10.696 +
  10.697 +    /**
  10.698 +     * Prints a boolean and then terminate the line.  This method behaves as
  10.699 +     * though it invokes <code>{@link #print(boolean)}</code> and then
  10.700 +     * <code>{@link #println()}</code>.
  10.701 +     *
  10.702 +     * @param x  The <code>boolean</code> to be printed
  10.703 +     */
  10.704 +    public void println(boolean x) {
  10.705 +        synchronized (this) {
  10.706 +            print(x);
  10.707 +            newLine();
  10.708 +        }
  10.709 +    }
  10.710 +
  10.711 +    /**
  10.712 +     * Prints a character and then terminate the line.  This method behaves as
  10.713 +     * though it invokes <code>{@link #print(char)}</code> and then
  10.714 +     * <code>{@link #println()}</code>.
  10.715 +     *
  10.716 +     * @param x  The <code>char</code> to be printed.
  10.717 +     */
  10.718 +    public void println(char x) {
  10.719 +        synchronized (this) {
  10.720 +            print(x);
  10.721 +            newLine();
  10.722 +        }
  10.723 +    }
  10.724 +
  10.725 +    /**
  10.726 +     * Prints an integer and then terminate the line.  This method behaves as
  10.727 +     * though it invokes <code>{@link #print(int)}</code> and then
  10.728 +     * <code>{@link #println()}</code>.
  10.729 +     *
  10.730 +     * @param x  The <code>int</code> to be printed.
  10.731 +     */
  10.732 +    public void println(int x) {
  10.733 +        synchronized (this) {
  10.734 +            print(x);
  10.735 +            newLine();
  10.736 +        }
  10.737 +    }
  10.738 +
  10.739 +    /**
  10.740 +     * Prints a long and then terminate the line.  This method behaves as
  10.741 +     * though it invokes <code>{@link #print(long)}</code> and then
  10.742 +     * <code>{@link #println()}</code>.
  10.743 +     *
  10.744 +     * @param x  a The <code>long</code> to be printed.
  10.745 +     */
  10.746 +    public void println(long x) {
  10.747 +        synchronized (this) {
  10.748 +            print(x);
  10.749 +            newLine();
  10.750 +        }
  10.751 +    }
  10.752 +
  10.753 +    /**
  10.754 +     * Prints a float and then terminate the line.  This method behaves as
  10.755 +     * though it invokes <code>{@link #print(float)}</code> and then
  10.756 +     * <code>{@link #println()}</code>.
  10.757 +     *
  10.758 +     * @param x  The <code>float</code> to be printed.
  10.759 +     */
  10.760 +    public void println(float x) {
  10.761 +        synchronized (this) {
  10.762 +            print(x);
  10.763 +            newLine();
  10.764 +        }
  10.765 +    }
  10.766 +
  10.767 +    /**
  10.768 +     * Prints a double and then terminate the line.  This method behaves as
  10.769 +     * though it invokes <code>{@link #print(double)}</code> and then
  10.770 +     * <code>{@link #println()}</code>.
  10.771 +     *
  10.772 +     * @param x  The <code>double</code> to be printed.
  10.773 +     */
  10.774 +    public void println(double x) {
  10.775 +        synchronized (this) {
  10.776 +            print(x);
  10.777 +            newLine();
  10.778 +        }
  10.779 +    }
  10.780 +
  10.781 +    /**
  10.782 +     * Prints an array of characters and then terminate the line.  This method
  10.783 +     * behaves as though it invokes <code>{@link #print(char[])}</code> and
  10.784 +     * then <code>{@link #println()}</code>.
  10.785 +     *
  10.786 +     * @param x  an array of chars to print.
  10.787 +     */
  10.788 +    public void println(char x[]) {
  10.789 +        synchronized (this) {
  10.790 +            print(x);
  10.791 +            newLine();
  10.792 +        }
  10.793 +    }
  10.794 +
  10.795 +    /**
  10.796 +     * Prints a String and then terminate the line.  This method behaves as
  10.797 +     * though it invokes <code>{@link #print(String)}</code> and then
  10.798 +     * <code>{@link #println()}</code>.
  10.799 +     *
  10.800 +     * @param x  The <code>String</code> to be printed.
  10.801 +     */
  10.802 +    public void println(String x) {
  10.803 +        synchronized (this) {
  10.804 +            print(x);
  10.805 +            newLine();
  10.806 +        }
  10.807 +    }
  10.808 +
  10.809 +    /**
  10.810 +     * Prints an Object and then terminate the line.  This method calls
  10.811 +     * at first String.valueOf(x) to get the printed object's string value,
  10.812 +     * then behaves as
  10.813 +     * though it invokes <code>{@link #print(String)}</code> and then
  10.814 +     * <code>{@link #println()}</code>.
  10.815 +     *
  10.816 +     * @param x  The <code>Object</code> to be printed.
  10.817 +     */
  10.818 +    public void println(Object x) {
  10.819 +        String s = String.valueOf(x);
  10.820 +        synchronized (this) {
  10.821 +            print(s);
  10.822 +            newLine();
  10.823 +        }
  10.824 +    }
  10.825 +
  10.826 +
  10.827 +    /**
  10.828 +     * A convenience method to write a formatted string to this output stream
  10.829 +     * using the specified format string and arguments.
  10.830 +     *
  10.831 +     * <p> An invocation of this method of the form <tt>out.printf(format,
  10.832 +     * args)</tt> behaves in exactly the same way as the invocation
  10.833 +     *
  10.834 +     * <pre>
  10.835 +     *     out.format(format, args) </pre>
  10.836 +     *
  10.837 +     * @param  format
  10.838 +     *         A format string as described in <a
  10.839 +     *         href="../util/Formatter.html#syntax">Format string syntax</a>
  10.840 +     *
  10.841 +     * @param  args
  10.842 +     *         Arguments referenced by the format specifiers in the format
  10.843 +     *         string.  If there are more arguments than format specifiers, the
  10.844 +     *         extra arguments are ignored.  The number of arguments is
  10.845 +     *         variable and may be zero.  The maximum number of arguments is
  10.846 +     *         limited by the maximum dimension of a Java array as defined by
  10.847 +     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
  10.848 +     *         The behaviour on a
  10.849 +     *         <tt>null</tt> argument depends on the <a
  10.850 +     *         href="../util/Formatter.html#syntax">conversion</a>.
  10.851 +     *
  10.852 +     * @throws  IllegalFormatException
  10.853 +     *          If a format string contains an illegal syntax, a format
  10.854 +     *          specifier that is incompatible with the given arguments,
  10.855 +     *          insufficient arguments given the format string, or other
  10.856 +     *          illegal conditions.  For specification of all possible
  10.857 +     *          formatting errors, see the <a
  10.858 +     *          href="../util/Formatter.html#detail">Details</a> section of the
  10.859 +     *          formatter class specification.
  10.860 +     *
  10.861 +     * @throws  NullPointerException
  10.862 +     *          If the <tt>format</tt> is <tt>null</tt>
  10.863 +     *
  10.864 +     * @return  This output stream
  10.865 +     *
  10.866 +     * @since  1.5
  10.867 +     */
  10.868 +    public PrintStream printf(String format, Object ... args) {
  10.869 +        append(format).append(Arrays.toString(args));
  10.870 +        return this;
  10.871 +    }
  10.872 +
  10.873 +    /**
  10.874 +     * A convenience method to write a formatted string to this output stream
  10.875 +     * using the specified format string and arguments.
  10.876 +     *
  10.877 +     * <p> An invocation of this method of the form <tt>out.printf(l, format,
  10.878 +     * args)</tt> behaves in exactly the same way as the invocation
  10.879 +     *
  10.880 +     * <pre>
  10.881 +     *     out.format(l, format, args) </pre>
  10.882 +     *
  10.883 +     * @param  l
  10.884 +     *         The {@linkplain java.util.Locale locale} to apply during
  10.885 +     *         formatting.  If <tt>l</tt> is <tt>null</tt> then no localization
  10.886 +     *         is applied.
  10.887 +     *
  10.888 +     * @param  format
  10.889 +     *         A format string as described in <a
  10.890 +     *         href="../util/Formatter.html#syntax">Format string syntax</a>
  10.891 +     *
  10.892 +     * @param  args
  10.893 +     *         Arguments referenced by the format specifiers in the format
  10.894 +     *         string.  If there are more arguments than format specifiers, the
  10.895 +     *         extra arguments are ignored.  The number of arguments is
  10.896 +     *         variable and may be zero.  The maximum number of arguments is
  10.897 +     *         limited by the maximum dimension of a Java array as defined by
  10.898 +     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
  10.899 +     *         The behaviour on a
  10.900 +     *         <tt>null</tt> argument depends on the <a
  10.901 +     *         href="../util/Formatter.html#syntax">conversion</a>.
  10.902 +     *
  10.903 +     * @throws  IllegalFormatException
  10.904 +     *          If a format string contains an illegal syntax, a format
  10.905 +     *          specifier that is incompatible with the given arguments,
  10.906 +     *          insufficient arguments given the format string, or other
  10.907 +     *          illegal conditions.  For specification of all possible
  10.908 +     *          formatting errors, see the <a
  10.909 +     *          href="../util/Formatter.html#detail">Details</a> section of the
  10.910 +     *          formatter class specification.
  10.911 +     *
  10.912 +     * @throws  NullPointerException
  10.913 +     *          If the <tt>format</tt> is <tt>null</tt>
  10.914 +     *
  10.915 +     * @return  This output stream
  10.916 +     *
  10.917 +     * @since  1.5
  10.918 +     */
  10.919 +//    public PrintStream printf(Locale l, String format, Object ... args) {
  10.920 +//        return format(l, format, args);
  10.921 +//    }
  10.922 +
  10.923 +    /**
  10.924 +     * Writes a formatted string to this output stream using the specified
  10.925 +     * format string and arguments.
  10.926 +     *
  10.927 +     * <p> The locale always used is the one returned by {@link
  10.928 +     * java.util.Locale#getDefault() Locale.getDefault()}, regardless of any
  10.929 +     * previous invocations of other formatting methods on this object.
  10.930 +     *
  10.931 +     * @param  format
  10.932 +     *         A format string as described in <a
  10.933 +     *         href="../util/Formatter.html#syntax">Format string syntax</a>
  10.934 +     *
  10.935 +     * @param  args
  10.936 +     *         Arguments referenced by the format specifiers in the format
  10.937 +     *         string.  If there are more arguments than format specifiers, the
  10.938 +     *         extra arguments are ignored.  The number of arguments is
  10.939 +     *         variable and may be zero.  The maximum number of arguments is
  10.940 +     *         limited by the maximum dimension of a Java array as defined by
  10.941 +     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
  10.942 +     *         The behaviour on a
  10.943 +     *         <tt>null</tt> argument depends on the <a
  10.944 +     *         href="../util/Formatter.html#syntax">conversion</a>.
  10.945 +     *
  10.946 +     * @throws  IllegalFormatException
  10.947 +     *          If a format string contains an illegal syntax, a format
  10.948 +     *          specifier that is incompatible with the given arguments,
  10.949 +     *          insufficient arguments given the format string, or other
  10.950 +     *          illegal conditions.  For specification of all possible
  10.951 +     *          formatting errors, see the <a
  10.952 +     *          href="../util/Formatter.html#detail">Details</a> section of the
  10.953 +     *          formatter class specification.
  10.954 +     *
  10.955 +     * @throws  NullPointerException
  10.956 +     *          If the <tt>format</tt> is <tt>null</tt>
  10.957 +     *
  10.958 +     * @return  This output stream
  10.959 +     *
  10.960 +     * @since  1.5
  10.961 +     */
  10.962 +//    public PrintStream format(String format, Object ... args) {
  10.963 +//        try {
  10.964 +//            synchronized (this) {
  10.965 +//                ensureOpen();
  10.966 +//                if ((formatter == null)
  10.967 +//                    || (formatter.locale() != Locale.getDefault()))
  10.968 +//                    formatter = new Formatter((Appendable) this);
  10.969 +//                formatter.format(Locale.getDefault(), format, args);
  10.970 +//            }
  10.971 +//        } catch (InterruptedIOException x) {
  10.972 +//            Thread.currentThread().interrupt();
  10.973 +//        } catch (IOException x) {
  10.974 +//            trouble = true;
  10.975 +//        }
  10.976 +//        return this;
  10.977 +//    }
  10.978 +
  10.979 +    /**
  10.980 +     * Writes a formatted string to this output stream using the specified
  10.981 +     * format string and arguments.
  10.982 +     *
  10.983 +     * @param  l
  10.984 +     *         The {@linkplain java.util.Locale locale} to apply during
  10.985 +     *         formatting.  If <tt>l</tt> is <tt>null</tt> then no localization
  10.986 +     *         is applied.
  10.987 +     *
  10.988 +     * @param  format
  10.989 +     *         A format string as described in <a
  10.990 +     *         href="../util/Formatter.html#syntax">Format string syntax</a>
  10.991 +     *
  10.992 +     * @param  args
  10.993 +     *         Arguments referenced by the format specifiers in the format
  10.994 +     *         string.  If there are more arguments than format specifiers, the
  10.995 +     *         extra arguments are ignored.  The number of arguments is
  10.996 +     *         variable and may be zero.  The maximum number of arguments is
  10.997 +     *         limited by the maximum dimension of a Java array as defined by
  10.998 +     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
  10.999 +     *         The behaviour on a
 10.1000 +     *         <tt>null</tt> argument depends on the <a
 10.1001 +     *         href="../util/Formatter.html#syntax">conversion</a>.
 10.1002 +     *
 10.1003 +     * @throws  IllegalFormatException
 10.1004 +     *          If a format string contains an illegal syntax, a format
 10.1005 +     *          specifier that is incompatible with the given arguments,
 10.1006 +     *          insufficient arguments given the format string, or other
 10.1007 +     *          illegal conditions.  For specification of all possible
 10.1008 +     *          formatting errors, see the <a
 10.1009 +     *          href="../util/Formatter.html#detail">Details</a> section of the
 10.1010 +     *          formatter class specification.
 10.1011 +     *
 10.1012 +     * @throws  NullPointerException
 10.1013 +     *          If the <tt>format</tt> is <tt>null</tt>
 10.1014 +     *
 10.1015 +     * @return  This output stream
 10.1016 +     *
 10.1017 +     * @since  1.5
 10.1018 +     */
 10.1019 +////    public PrintStream format(Locale l, String format, Object ... args) {
 10.1020 +////        try {
 10.1021 +////            synchronized (this) {
 10.1022 +////                ensureOpen();
 10.1023 +////                if ((formatter == null)
 10.1024 +////                    || (formatter.locale() != l))
 10.1025 +////                    formatter = new Formatter(this, l);
 10.1026 +////                formatter.format(l, format, args);
 10.1027 +////            }
 10.1028 +////        } catch (InterruptedIOException x) {
 10.1029 +////            Thread.currentThread().interrupt();
 10.1030 +////        } catch (IOException x) {
 10.1031 +////            trouble = true;
 10.1032 +////        }
 10.1033 +////        return this;
 10.1034 +////    }
 10.1035 +
 10.1036 +    /**
 10.1037 +     * Appends the specified character sequence to this output stream.
 10.1038 +     *
 10.1039 +     * <p> An invocation of this method of the form <tt>out.append(csq)</tt>
 10.1040 +     * behaves in exactly the same way as the invocation
 10.1041 +     *
 10.1042 +     * <pre>
 10.1043 +     *     out.print(csq.toString()) </pre>
 10.1044 +     *
 10.1045 +     * <p> Depending on the specification of <tt>toString</tt> for the
 10.1046 +     * character sequence <tt>csq</tt>, the entire sequence may not be
 10.1047 +     * appended.  For instance, invoking then <tt>toString</tt> method of a
 10.1048 +     * character buffer will return a subsequence whose content depends upon
 10.1049 +     * the buffer's position and limit.
 10.1050 +     *
 10.1051 +     * @param  csq
 10.1052 +     *         The character sequence to append.  If <tt>csq</tt> is
 10.1053 +     *         <tt>null</tt>, then the four characters <tt>"null"</tt> are
 10.1054 +     *         appended to this output stream.
 10.1055 +     *
 10.1056 +     * @return  This output stream
 10.1057 +     *
 10.1058 +     * @since  1.5
 10.1059 +     */
 10.1060 +    public PrintStream append(CharSequence csq) {
 10.1061 +        if (csq == null)
 10.1062 +            print("null");
 10.1063 +        else
 10.1064 +            print(csq.toString());
 10.1065 +        return this;
 10.1066 +    }
 10.1067 +
 10.1068 +    /**
 10.1069 +     * Appends a subsequence of the specified character sequence to this output
 10.1070 +     * stream.
 10.1071 +     *
 10.1072 +     * <p> An invocation of this method of the form <tt>out.append(csq, start,
 10.1073 +     * end)</tt> when <tt>csq</tt> is not <tt>null</tt>, behaves in
 10.1074 +     * exactly the same way as the invocation
 10.1075 +     *
 10.1076 +     * <pre>
 10.1077 +     *     out.print(csq.subSequence(start, end).toString()) </pre>
 10.1078 +     *
 10.1079 +     * @param  csq
 10.1080 +     *         The character sequence from which a subsequence will be
 10.1081 +     *         appended.  If <tt>csq</tt> is <tt>null</tt>, then characters
 10.1082 +     *         will be appended as if <tt>csq</tt> contained the four
 10.1083 +     *         characters <tt>"null"</tt>.
 10.1084 +     *
 10.1085 +     * @param  start
 10.1086 +     *         The index of the first character in the subsequence
 10.1087 +     *
 10.1088 +     * @param  end
 10.1089 +     *         The index of the character following the last character in the
 10.1090 +     *         subsequence
 10.1091 +     *
 10.1092 +     * @return  This output stream
 10.1093 +     *
 10.1094 +     * @throws  IndexOutOfBoundsException
 10.1095 +     *          If <tt>start</tt> or <tt>end</tt> are negative, <tt>start</tt>
 10.1096 +     *          is greater than <tt>end</tt>, or <tt>end</tt> is greater than
 10.1097 +     *          <tt>csq.length()</tt>
 10.1098 +     *
 10.1099 +     * @since  1.5
 10.1100 +     */
 10.1101 +    public PrintStream append(CharSequence csq, int start, int end) {
 10.1102 +        CharSequence cs = (csq == null ? "null" : csq);
 10.1103 +        write(cs.subSequence(start, end).toString());
 10.1104 +        return this;
 10.1105 +    }
 10.1106 +
 10.1107 +    /**
 10.1108 +     * Appends the specified character to this output stream.
 10.1109 +     *
 10.1110 +     * <p> An invocation of this method of the form <tt>out.append(c)</tt>
 10.1111 +     * behaves in exactly the same way as the invocation
 10.1112 +     *
 10.1113 +     * <pre>
 10.1114 +     *     out.print(c) </pre>
 10.1115 +     *
 10.1116 +     * @param  c
 10.1117 +     *         The 16-bit character to append
 10.1118 +     *
 10.1119 +     * @return  This output stream
 10.1120 +     *
 10.1121 +     * @since  1.5
 10.1122 +     */
 10.1123 +    public PrintStream append(char c) {
 10.1124 +        print(c);
 10.1125 +        return this;
 10.1126 +    }
 10.1127 +
 10.1128 +}
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/rt/emul/compact/src/main/java/java/io/PrintWriter.java	Sun Sep 08 11:22:51 2013 +0200
    11.3 @@ -0,0 +1,1030 @@
    11.4 +/*
    11.5 + * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
    11.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    11.7 + *
    11.8 + * This code is free software; you can redistribute it and/or modify it
    11.9 + * under the terms of the GNU General Public License version 2 only, as
   11.10 + * published by the Free Software Foundation.  Oracle designates this
   11.11 + * particular file as subject to the "Classpath" exception as provided
   11.12 + * by Oracle in the LICENSE file that accompanied this code.
   11.13 + *
   11.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   11.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   11.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   11.17 + * version 2 for more details (a copy is included in the LICENSE file that
   11.18 + * accompanied this code).
   11.19 + *
   11.20 + * You should have received a copy of the GNU General Public License version
   11.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   11.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   11.23 + *
   11.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   11.25 + * or visit www.oracle.com if you need additional information or have any
   11.26 + * questions.
   11.27 + */
   11.28 +
   11.29 +package java.io;
   11.30 +
   11.31 +import java.io.PrintStream.Charset;
   11.32 +import java.io.PrintStream.Formatter;
   11.33 +import java.util.Arrays;
   11.34 +import java.util.Objects;
   11.35 +
   11.36 +/**
   11.37 + * Prints formatted representations of objects to a text-output stream.  This
   11.38 + * class implements all of the <tt>print</tt> methods found in {@link
   11.39 + * PrintStream}.  It does not contain methods for writing raw bytes, for which
   11.40 + * a program should use unencoded byte streams.
   11.41 + *
   11.42 + * <p> Unlike the {@link PrintStream} class, if automatic flushing is enabled
   11.43 + * it will be done only when one of the <tt>println</tt>, <tt>printf</tt>, or
   11.44 + * <tt>format</tt> methods is invoked, rather than whenever a newline character
   11.45 + * happens to be output.  These methods use the platform's own notion of line
   11.46 + * separator rather than the newline character.
   11.47 + *
   11.48 + * <p> Methods in this class never throw I/O exceptions, although some of its
   11.49 + * constructors may.  The client may inquire as to whether any errors have
   11.50 + * occurred by invoking {@link #checkError checkError()}.
   11.51 + *
   11.52 + * @author      Frank Yellin
   11.53 + * @author      Mark Reinhold
   11.54 + * @since       JDK1.1
   11.55 + */
   11.56 +
   11.57 +public class PrintWriter extends Writer {
   11.58 +
   11.59 +    /**
   11.60 +     * The underlying character-output stream of this
   11.61 +     * <code>PrintWriter</code>.
   11.62 +     *
   11.63 +     * @since 1.2
   11.64 +     */
   11.65 +    protected Writer out;
   11.66 +
   11.67 +    private final boolean autoFlush;
   11.68 +    private boolean trouble = false;
   11.69 +    private Formatter formatter;
   11.70 +//    private PrintStream psOut = null;
   11.71 +
   11.72 +    /**
   11.73 +     * Line separator string.  This is the value of the line.separator
   11.74 +     * property at the moment that the stream was created.
   11.75 +     */
   11.76 +    private final String lineSeparator;
   11.77 +
   11.78 +    /**
   11.79 +     * Returns a charset object for the given charset name.
   11.80 +     * @throws NullPointerException          is csn is null
   11.81 +     * @throws UnsupportedEncodingException  if the charset is not supported
   11.82 +     */
   11.83 +    private static Charset toCharset(String csn)
   11.84 +        throws UnsupportedEncodingException
   11.85 +    {
   11.86 +        return PrintStream.toCharset(csn);
   11.87 +    }
   11.88 +
   11.89 +    /**
   11.90 +     * Creates a new PrintWriter, without automatic line flushing.
   11.91 +     *
   11.92 +     * @param  out        A character-output stream
   11.93 +     */
   11.94 +    public PrintWriter (Writer out) {
   11.95 +        this(out, false);
   11.96 +    }
   11.97 +
   11.98 +    /**
   11.99 +     * Creates a new PrintWriter.
  11.100 +     *
  11.101 +     * @param  out        A character-output stream
  11.102 +     * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
  11.103 +     *                    <tt>printf</tt>, or <tt>format</tt> methods will
  11.104 +     *                    flush the output buffer
  11.105 +     */
  11.106 +    public PrintWriter(Writer out,
  11.107 +                       boolean autoFlush) {
  11.108 +        super(out);
  11.109 +        this.out = out;
  11.110 +        this.autoFlush = autoFlush;
  11.111 +        lineSeparator = "\n";
  11.112 +    }
  11.113 +
  11.114 +    /**
  11.115 +     * Creates a new PrintWriter, without automatic line flushing, from an
  11.116 +     * existing OutputStream.  This convenience constructor creates the
  11.117 +     * necessary intermediate OutputStreamWriter, which will convert characters
  11.118 +     * into bytes using the default character encoding.
  11.119 +     *
  11.120 +     * @param  out        An output stream
  11.121 +     *
  11.122 +     * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
  11.123 +     */
  11.124 +    public PrintWriter(OutputStream out) {
  11.125 +        this(out, false);
  11.126 +    }
  11.127 +
  11.128 +    /**
  11.129 +     * Creates a new PrintWriter from an existing OutputStream.  This
  11.130 +     * convenience constructor creates the necessary intermediate
  11.131 +     * OutputStreamWriter, which will convert characters into bytes using the
  11.132 +     * default character encoding.
  11.133 +     *
  11.134 +     * @param  out        An output stream
  11.135 +     * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
  11.136 +     *                    <tt>printf</tt>, or <tt>format</tt> methods will
  11.137 +     *                    flush the output buffer
  11.138 +     *
  11.139 +     * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
  11.140 +     */
  11.141 +    public PrintWriter(OutputStream out, boolean autoFlush) {
  11.142 +        this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);
  11.143 +
  11.144 +        // save print stream for error propagation
  11.145 +//        if (out instanceof java.io.PrintStream) {
  11.146 +//            psOut = (PrintStream) out;
  11.147 +//        }
  11.148 +    }
  11.149 +
  11.150 +    /**
  11.151 +     * Creates a new PrintWriter, without automatic line flushing, with the
  11.152 +     * specified file name.  This convenience constructor creates the necessary
  11.153 +     * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
  11.154 +     * which will encode characters using the {@linkplain
  11.155 +     * java.nio.charset.Charset#defaultCharset() default charset} for this
  11.156 +     * instance of the Java virtual machine.
  11.157 +     *
  11.158 +     * @param  fileName
  11.159 +     *         The name of the file to use as the destination of this writer.
  11.160 +     *         If the file exists then it will be truncated to zero size;
  11.161 +     *         otherwise, a new file will be created.  The output will be
  11.162 +     *         written to the file and is buffered.
  11.163 +     *
  11.164 +     * @throws  FileNotFoundException
  11.165 +     *          If the given string does not denote an existing, writable
  11.166 +     *          regular file and a new regular file of that name cannot be
  11.167 +     *          created, or if some other error occurs while opening or
  11.168 +     *          creating the file
  11.169 +     *
  11.170 +     * @throws  SecurityException
  11.171 +     *          If a security manager is present and {@link
  11.172 +     *          SecurityManager#checkWrite checkWrite(fileName)} denies write
  11.173 +     *          access to the file
  11.174 +     *
  11.175 +     * @since  1.5
  11.176 +     */
  11.177 +    public PrintWriter(String fileName) throws FileNotFoundException {
  11.178 +        super();
  11.179 +        throw new FileNotFoundException();
  11.180 +    }
  11.181 +
  11.182 +    /* Private constructor */
  11.183 +    private PrintWriter(Charset charset, File file)
  11.184 +        throws FileNotFoundException
  11.185 +    {
  11.186 +        super();
  11.187 +        throw new FileNotFoundException();
  11.188 +    }
  11.189 +
  11.190 +    /**
  11.191 +     * Creates a new PrintWriter, without automatic line flushing, with the
  11.192 +     * specified file name and charset.  This convenience constructor creates
  11.193 +     * the necessary intermediate {@link java.io.OutputStreamWriter
  11.194 +     * OutputStreamWriter}, which will encode characters using the provided
  11.195 +     * charset.
  11.196 +     *
  11.197 +     * @param  fileName
  11.198 +     *         The name of the file to use as the destination of this writer.
  11.199 +     *         If the file exists then it will be truncated to zero size;
  11.200 +     *         otherwise, a new file will be created.  The output will be
  11.201 +     *         written to the file and is buffered.
  11.202 +     *
  11.203 +     * @param  csn
  11.204 +     *         The name of a supported {@linkplain java.nio.charset.Charset
  11.205 +     *         charset}
  11.206 +     *
  11.207 +     * @throws  FileNotFoundException
  11.208 +     *          If the given string does not denote an existing, writable
  11.209 +     *          regular file and a new regular file of that name cannot be
  11.210 +     *          created, or if some other error occurs while opening or
  11.211 +     *          creating the file
  11.212 +     *
  11.213 +     * @throws  SecurityException
  11.214 +     *          If a security manager is present and {@link
  11.215 +     *          SecurityManager#checkWrite checkWrite(fileName)} denies write
  11.216 +     *          access to the file
  11.217 +     *
  11.218 +     * @throws  UnsupportedEncodingException
  11.219 +     *          If the named charset is not supported
  11.220 +     *
  11.221 +     * @since  1.5
  11.222 +     */
  11.223 +    public PrintWriter(String fileName, String csn)
  11.224 +        throws FileNotFoundException, UnsupportedEncodingException
  11.225 +    {
  11.226 +        this(toCharset(csn), new File(fileName));
  11.227 +    }
  11.228 +
  11.229 +    /**
  11.230 +     * Creates a new PrintWriter, without automatic line flushing, with the
  11.231 +     * specified file.  This convenience constructor creates the necessary
  11.232 +     * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter},
  11.233 +     * which will encode characters using the {@linkplain
  11.234 +     * java.nio.charset.Charset#defaultCharset() default charset} for this
  11.235 +     * instance of the Java virtual machine.
  11.236 +     *
  11.237 +     * @param  file
  11.238 +     *         The file to use as the destination of this writer.  If the file
  11.239 +     *         exists then it will be truncated to zero size; otherwise, a new
  11.240 +     *         file will be created.  The output will be written to the file
  11.241 +     *         and is buffered.
  11.242 +     *
  11.243 +     * @throws  FileNotFoundException
  11.244 +     *          If the given file object does not denote an existing, writable
  11.245 +     *          regular file and a new regular file of that name cannot be
  11.246 +     *          created, or if some other error occurs while opening or
  11.247 +     *          creating the file
  11.248 +     *
  11.249 +     * @throws  SecurityException
  11.250 +     *          If a security manager is present and {@link
  11.251 +     *          SecurityManager#checkWrite checkWrite(file.getPath())}
  11.252 +     *          denies write access to the file
  11.253 +     *
  11.254 +     * @since  1.5
  11.255 +     */
  11.256 +    public PrintWriter(File file) throws FileNotFoundException {
  11.257 +        super();
  11.258 +        throw new FileNotFoundException();
  11.259 +    }
  11.260 +
  11.261 +    /**
  11.262 +     * Creates a new PrintWriter, without automatic line flushing, with the
  11.263 +     * specified file and charset.  This convenience constructor creates the
  11.264 +     * necessary intermediate {@link java.io.OutputStreamWriter
  11.265 +     * OutputStreamWriter}, which will encode characters using the provided
  11.266 +     * charset.
  11.267 +     *
  11.268 +     * @param  file
  11.269 +     *         The file to use as the destination of this writer.  If the file
  11.270 +     *         exists then it will be truncated to zero size; otherwise, a new
  11.271 +     *         file will be created.  The output will be written to the file
  11.272 +     *         and is buffered.
  11.273 +     *
  11.274 +     * @param  csn
  11.275 +     *         The name of a supported {@linkplain java.nio.charset.Charset
  11.276 +     *         charset}
  11.277 +     *
  11.278 +     * @throws  FileNotFoundException
  11.279 +     *          If the given file object does not denote an existing, writable
  11.280 +     *          regular file and a new regular file of that name cannot be
  11.281 +     *          created, or if some other error occurs while opening or
  11.282 +     *          creating the file
  11.283 +     *
  11.284 +     * @throws  SecurityException
  11.285 +     *          If a security manager is present and {@link
  11.286 +     *          SecurityManager#checkWrite checkWrite(file.getPath())}
  11.287 +     *          denies write access to the file
  11.288 +     *
  11.289 +     * @throws  UnsupportedEncodingException
  11.290 +     *          If the named charset is not supported
  11.291 +     *
  11.292 +     * @since  1.5
  11.293 +     */
  11.294 +    public PrintWriter(File file, String csn)
  11.295 +        throws FileNotFoundException, UnsupportedEncodingException
  11.296 +    {
  11.297 +        this(toCharset(csn), file);
  11.298 +    }
  11.299 +
  11.300 +    /** Checks to make sure that the stream has not been closed */
  11.301 +    private void ensureOpen() throws IOException {
  11.302 +        if (out == null)
  11.303 +            throw new IOException("Stream closed");
  11.304 +    }
  11.305 +
  11.306 +    /**
  11.307 +     * Flushes the stream.
  11.308 +     * @see #checkError()
  11.309 +     */
  11.310 +    public void flush() {
  11.311 +        try {
  11.312 +            synchronized (lock) {
  11.313 +                ensureOpen();
  11.314 +                out.flush();
  11.315 +            }
  11.316 +        }
  11.317 +        catch (IOException x) {
  11.318 +            trouble = true;
  11.319 +        }
  11.320 +    }
  11.321 +
  11.322 +    /**
  11.323 +     * Closes the stream and releases any system resources associated
  11.324 +     * with it. Closing a previously closed stream has no effect.
  11.325 +     *
  11.326 +     * @see #checkError()
  11.327 +     */
  11.328 +    public void close() {
  11.329 +        try {
  11.330 +            synchronized (lock) {
  11.331 +                if (out == null)
  11.332 +                    return;
  11.333 +                out.close();
  11.334 +                out = null;
  11.335 +            }
  11.336 +        }
  11.337 +        catch (IOException x) {
  11.338 +            trouble = true;
  11.339 +        }
  11.340 +    }
  11.341 +
  11.342 +    /**
  11.343 +     * Flushes the stream if it's not closed and checks its error state.
  11.344 +     *
  11.345 +     * @return <code>true</code> if the print stream has encountered an error,
  11.346 +     *          either on the underlying output stream or during a format
  11.347 +     *          conversion.
  11.348 +     */
  11.349 +    public boolean checkError() {
  11.350 +        if (out != null) {
  11.351 +            flush();
  11.352 +        }
  11.353 +        if (out instanceof java.io.PrintWriter) {
  11.354 +            PrintWriter pw = (PrintWriter) out;
  11.355 +            return pw.checkError();
  11.356 +        } else 
  11.357 +//        if (psOut != null) {
  11.358 +//            return psOut.checkError();
  11.359 +//        }
  11.360 +        return trouble;
  11.361 +    }
  11.362 +
  11.363 +    /**
  11.364 +     * Indicates that an error has occurred.
  11.365 +     *
  11.366 +     * <p> This method will cause subsequent invocations of {@link
  11.367 +     * #checkError()} to return <tt>true</tt> until {@link
  11.368 +     * #clearError()} is invoked.
  11.369 +     */
  11.370 +    protected void setError() {
  11.371 +        trouble = true;
  11.372 +    }
  11.373 +
  11.374 +    /**
  11.375 +     * Clears the error state of this stream.
  11.376 +     *
  11.377 +     * <p> This method will cause subsequent invocations of {@link
  11.378 +     * #checkError()} to return <tt>false</tt> until another write
  11.379 +     * operation fails and invokes {@link #setError()}.
  11.380 +     *
  11.381 +     * @since 1.6
  11.382 +     */
  11.383 +    protected void clearError() {
  11.384 +        trouble = false;
  11.385 +    }
  11.386 +
  11.387 +    /*
  11.388 +     * Exception-catching, synchronized output operations,
  11.389 +     * which also implement the write() methods of Writer
  11.390 +     */
  11.391 +
  11.392 +    /**
  11.393 +     * Writes a single character.
  11.394 +     * @param c int specifying a character to be written.
  11.395 +     */
  11.396 +    public void write(int c) {
  11.397 +        try {
  11.398 +            synchronized (lock) {
  11.399 +                ensureOpen();
  11.400 +                out.write(c);
  11.401 +            }
  11.402 +        }
  11.403 +        catch (InterruptedIOException x) {
  11.404 +            Thread.currentThread().interrupt();
  11.405 +        }
  11.406 +        catch (IOException x) {
  11.407 +            trouble = true;
  11.408 +        }
  11.409 +    }
  11.410 +
  11.411 +    /**
  11.412 +     * Writes A Portion of an array of characters.
  11.413 +     * @param buf Array of characters
  11.414 +     * @param off Offset from which to start writing characters
  11.415 +     * @param len Number of characters to write
  11.416 +     */
  11.417 +    public void write(char buf[], int off, int len) {
  11.418 +        try {
  11.419 +            synchronized (lock) {
  11.420 +                ensureOpen();
  11.421 +                out.write(buf, off, len);
  11.422 +            }
  11.423 +        }
  11.424 +        catch (InterruptedIOException x) {
  11.425 +            Thread.currentThread().interrupt();
  11.426 +        }
  11.427 +        catch (IOException x) {
  11.428 +            trouble = true;
  11.429 +        }
  11.430 +    }
  11.431 +
  11.432 +    /**
  11.433 +     * Writes an array of characters.  This method cannot be inherited from the
  11.434 +     * Writer class because it must suppress I/O exceptions.
  11.435 +     * @param buf Array of characters to be written
  11.436 +     */
  11.437 +    public void write(char buf[]) {
  11.438 +        write(buf, 0, buf.length);
  11.439 +    }
  11.440 +
  11.441 +    /**
  11.442 +     * Writes a portion of a string.
  11.443 +     * @param s A String
  11.444 +     * @param off Offset from which to start writing characters
  11.445 +     * @param len Number of characters to write
  11.446 +     */
  11.447 +    public void write(String s, int off, int len) {
  11.448 +        try {
  11.449 +            synchronized (lock) {
  11.450 +                ensureOpen();
  11.451 +                out.write(s, off, len);
  11.452 +            }
  11.453 +        }
  11.454 +        catch (InterruptedIOException x) {
  11.455 +            Thread.currentThread().interrupt();
  11.456 +        }
  11.457 +        catch (IOException x) {
  11.458 +            trouble = true;
  11.459 +        }
  11.460 +    }
  11.461 +
  11.462 +    /**
  11.463 +     * Writes a string.  This method cannot be inherited from the Writer class
  11.464 +     * because it must suppress I/O exceptions.
  11.465 +     * @param s String to be written
  11.466 +     */
  11.467 +    public void write(String s) {
  11.468 +        write(s, 0, s.length());
  11.469 +    }
  11.470 +
  11.471 +    private void newLine() {
  11.472 +        try {
  11.473 +            synchronized (lock) {
  11.474 +                ensureOpen();
  11.475 +                out.write(lineSeparator);
  11.476 +                if (autoFlush)
  11.477 +                    out.flush();
  11.478 +            }
  11.479 +        }
  11.480 +        catch (InterruptedIOException x) {
  11.481 +            Thread.currentThread().interrupt();
  11.482 +        }
  11.483 +        catch (IOException x) {
  11.484 +            trouble = true;
  11.485 +        }
  11.486 +    }
  11.487 +
  11.488 +    /* Methods that do not terminate lines */
  11.489 +
  11.490 +    /**
  11.491 +     * Prints a boolean value.  The string produced by <code>{@link
  11.492 +     * java.lang.String#valueOf(boolean)}</code> is translated into bytes
  11.493 +     * according to the platform's default character encoding, and these bytes
  11.494 +     * are written in exactly the manner of the <code>{@link
  11.495 +     * #write(int)}</code> method.
  11.496 +     *
  11.497 +     * @param      b   The <code>boolean</code> to be printed
  11.498 +     */
  11.499 +    public void print(boolean b) {
  11.500 +        write(b ? "true" : "false");
  11.501 +    }
  11.502 +
  11.503 +    /**
  11.504 +     * Prints a character.  The character is translated into one or more bytes
  11.505 +     * according to the platform's default character encoding, and these bytes
  11.506 +     * are written in exactly the manner of the <code>{@link
  11.507 +     * #write(int)}</code> method.
  11.508 +     *
  11.509 +     * @param      c   The <code>char</code> to be printed
  11.510 +     */
  11.511 +    public void print(char c) {
  11.512 +        write(c);
  11.513 +    }
  11.514 +
  11.515 +    /**
  11.516 +     * Prints an integer.  The string produced by <code>{@link
  11.517 +     * java.lang.String#valueOf(int)}</code> is translated into bytes according
  11.518 +     * to the platform's default character encoding, and these bytes are
  11.519 +     * written in exactly the manner of the <code>{@link #write(int)}</code>
  11.520 +     * method.
  11.521 +     *
  11.522 +     * @param      i   The <code>int</code> to be printed
  11.523 +     * @see        java.lang.Integer#toString(int)
  11.524 +     */
  11.525 +    public void print(int i) {
  11.526 +        write(String.valueOf(i));
  11.527 +    }
  11.528 +
  11.529 +    /**
  11.530 +     * Prints a long integer.  The string produced by <code>{@link
  11.531 +     * java.lang.String#valueOf(long)}</code> is translated into bytes
  11.532 +     * according to the platform's default character encoding, and these bytes
  11.533 +     * are written in exactly the manner of the <code>{@link #write(int)}</code>
  11.534 +     * method.
  11.535 +     *
  11.536 +     * @param      l   The <code>long</code> to be printed
  11.537 +     * @see        java.lang.Long#toString(long)
  11.538 +     */
  11.539 +    public void print(long l) {
  11.540 +        write(String.valueOf(l));
  11.541 +    }
  11.542 +
  11.543 +    /**
  11.544 +     * Prints a floating-point number.  The string produced by <code>{@link
  11.545 +     * java.lang.String#valueOf(float)}</code> is translated into bytes
  11.546 +     * according to the platform's default character encoding, and these bytes
  11.547 +     * are written in exactly the manner of the <code>{@link #write(int)}</code>
  11.548 +     * method.
  11.549 +     *
  11.550 +     * @param      f   The <code>float</code> to be printed
  11.551 +     * @see        java.lang.Float#toString(float)
  11.552 +     */
  11.553 +    public void print(float f) {
  11.554 +        write(String.valueOf(f));
  11.555 +    }
  11.556 +
  11.557 +    /**
  11.558 +     * Prints a double-precision floating-point number.  The string produced by
  11.559 +     * <code>{@link java.lang.String#valueOf(double)}</code> is translated into
  11.560 +     * bytes according to the platform's default character encoding, and these
  11.561 +     * bytes are written in exactly the manner of the <code>{@link
  11.562 +     * #write(int)}</code> method.
  11.563 +     *
  11.564 +     * @param      d   The <code>double</code> to be printed
  11.565 +     * @see        java.lang.Double#toString(double)
  11.566 +     */
  11.567 +    public void print(double d) {
  11.568 +        write(String.valueOf(d));
  11.569 +    }
  11.570 +
  11.571 +    /**
  11.572 +     * Prints an array of characters.  The characters are converted into bytes
  11.573 +     * according to the platform's default character encoding, and these bytes
  11.574 +     * are written in exactly the manner of the <code>{@link #write(int)}</code>
  11.575 +     * method.
  11.576 +     *
  11.577 +     * @param      s   The array of chars to be printed
  11.578 +     *
  11.579 +     * @throws  NullPointerException  If <code>s</code> is <code>null</code>
  11.580 +     */
  11.581 +    public void print(char s[]) {
  11.582 +        write(s);
  11.583 +    }
  11.584 +
  11.585 +    /**
  11.586 +     * Prints a string.  If the argument is <code>null</code> then the string
  11.587 +     * <code>"null"</code> is printed.  Otherwise, the string's characters are
  11.588 +     * converted into bytes according to the platform's default character
  11.589 +     * encoding, and these bytes are written in exactly the manner of the
  11.590 +     * <code>{@link #write(int)}</code> method.
  11.591 +     *
  11.592 +     * @param      s   The <code>String</code> to be printed
  11.593 +     */
  11.594 +    public void print(String s) {
  11.595 +        if (s == null) {
  11.596 +            s = "null";
  11.597 +        }
  11.598 +        write(s);
  11.599 +    }
  11.600 +
  11.601 +    /**
  11.602 +     * Prints an object.  The string produced by the <code>{@link
  11.603 +     * java.lang.String#valueOf(Object)}</code> method is translated into bytes
  11.604 +     * according to the platform's default character encoding, and these bytes
  11.605 +     * are written in exactly the manner of the <code>{@link #write(int)}</code>
  11.606 +     * method.
  11.607 +     *
  11.608 +     * @param      obj   The <code>Object</code> to be printed
  11.609 +     * @see        java.lang.Object#toString()
  11.610 +     */
  11.611 +    public void print(Object obj) {
  11.612 +        write(String.valueOf(obj));
  11.613 +    }
  11.614 +
  11.615 +    /* Methods that do terminate lines */
  11.616 +
  11.617 +    /**
  11.618 +     * Terminates the current line by writing the line separator string.  The
  11.619 +     * line separator string is defined by the system property
  11.620 +     * <code>line.separator</code>, and is not necessarily a single newline
  11.621 +     * character (<code>'\n'</code>).
  11.622 +     */
  11.623 +    public void println() {
  11.624 +        newLine();
  11.625 +    }
  11.626 +
  11.627 +    /**
  11.628 +     * Prints a boolean value and then terminates the line.  This method behaves
  11.629 +     * as though it invokes <code>{@link #print(boolean)}</code> and then
  11.630 +     * <code>{@link #println()}</code>.
  11.631 +     *
  11.632 +     * @param x the <code>boolean</code> value to be printed
  11.633 +     */
  11.634 +    public void println(boolean x) {
  11.635 +        synchronized (lock) {
  11.636 +            print(x);
  11.637 +            println();
  11.638 +        }
  11.639 +    }
  11.640 +
  11.641 +    /**
  11.642 +     * Prints a character and then terminates the line.  This method behaves as
  11.643 +     * though it invokes <code>{@link #print(char)}</code> and then <code>{@link
  11.644 +     * #println()}</code>.
  11.645 +     *
  11.646 +     * @param x the <code>char</code> value to be printed
  11.647 +     */
  11.648 +    public void println(char x) {
  11.649 +        synchronized (lock) {
  11.650 +            print(x);
  11.651 +            println();
  11.652 +        }
  11.653 +    }
  11.654 +
  11.655 +    /**
  11.656 +     * Prints an integer and then terminates the line.  This method behaves as
  11.657 +     * though it invokes <code>{@link #print(int)}</code> and then <code>{@link
  11.658 +     * #println()}</code>.
  11.659 +     *
  11.660 +     * @param x the <code>int</code> value to be printed
  11.661 +     */
  11.662 +    public void println(int x) {
  11.663 +        synchronized (lock) {
  11.664 +            print(x);
  11.665 +            println();
  11.666 +        }
  11.667 +    }
  11.668 +
  11.669 +    /**
  11.670 +     * Prints a long integer and then terminates the line.  This method behaves
  11.671 +     * as though it invokes <code>{@link #print(long)}</code> and then
  11.672 +     * <code>{@link #println()}</code>.
  11.673 +     *
  11.674 +     * @param x the <code>long</code> value to be printed
  11.675 +     */
  11.676 +    public void println(long x) {
  11.677 +        synchronized (lock) {
  11.678 +            print(x);
  11.679 +            println();
  11.680 +        }
  11.681 +    }
  11.682 +
  11.683 +    /**
  11.684 +     * Prints a floating-point number and then terminates the line.  This method
  11.685 +     * behaves as though it invokes <code>{@link #print(float)}</code> and then
  11.686 +     * <code>{@link #println()}</code>.
  11.687 +     *
  11.688 +     * @param x the <code>float</code> value to be printed
  11.689 +     */
  11.690 +    public void println(float x) {
  11.691 +        synchronized (lock) {
  11.692 +            print(x);
  11.693 +            println();
  11.694 +        }
  11.695 +    }
  11.696 +
  11.697 +    /**
  11.698 +     * Prints a double-precision floating-point number and then terminates the
  11.699 +     * line.  This method behaves as though it invokes <code>{@link
  11.700 +     * #print(double)}</code> and then <code>{@link #println()}</code>.
  11.701 +     *
  11.702 +     * @param x the <code>double</code> value to be printed
  11.703 +     */
  11.704 +    public void println(double x) {
  11.705 +        synchronized (lock) {
  11.706 +            print(x);
  11.707 +            println();
  11.708 +        }
  11.709 +    }
  11.710 +
  11.711 +    /**
  11.712 +     * Prints an array of characters and then terminates the line.  This method
  11.713 +     * behaves as though it invokes <code>{@link #print(char[])}</code> and then
  11.714 +     * <code>{@link #println()}</code>.
  11.715 +     *
  11.716 +     * @param x the array of <code>char</code> values to be printed
  11.717 +     */
  11.718 +    public void println(char x[]) {
  11.719 +        synchronized (lock) {
  11.720 +            print(x);
  11.721 +            println();
  11.722 +        }
  11.723 +    }
  11.724 +
  11.725 +    /**
  11.726 +     * Prints a String and then terminates the line.  This method behaves as
  11.727 +     * though it invokes <code>{@link #print(String)}</code> and then
  11.728 +     * <code>{@link #println()}</code>.
  11.729 +     *
  11.730 +     * @param x the <code>String</code> value to be printed
  11.731 +     */
  11.732 +    public void println(String x) {
  11.733 +        synchronized (lock) {
  11.734 +            print(x);
  11.735 +            println();
  11.736 +        }
  11.737 +    }
  11.738 +
  11.739 +    /**
  11.740 +     * Prints an Object and then terminates the line.  This method calls
  11.741 +     * at first String.valueOf(x) to get the printed object's string value,
  11.742 +     * then behaves as
  11.743 +     * though it invokes <code>{@link #print(String)}</code> and then
  11.744 +     * <code>{@link #println()}</code>.
  11.745 +     *
  11.746 +     * @param x  The <code>Object</code> to be printed.
  11.747 +     */
  11.748 +    public void println(Object x) {
  11.749 +        String s = String.valueOf(x);
  11.750 +        synchronized (lock) {
  11.751 +            print(s);
  11.752 +            println();
  11.753 +        }
  11.754 +    }
  11.755 +
  11.756 +    /**
  11.757 +     * A convenience method to write a formatted string to this writer using
  11.758 +     * the specified format string and arguments.  If automatic flushing is
  11.759 +     * enabled, calls to this method will flush the output buffer.
  11.760 +     *
  11.761 +     * <p> An invocation of this method of the form <tt>out.printf(format,
  11.762 +     * args)</tt> behaves in exactly the same way as the invocation
  11.763 +     *
  11.764 +     * <pre>
  11.765 +     *     out.format(format, args) </pre>
  11.766 +     *
  11.767 +     * @param  format
  11.768 +     *         A format string as described in <a
  11.769 +     *         href="../util/Formatter.html#syntax">Format string syntax</a>.
  11.770 +     *
  11.771 +     * @param  args
  11.772 +     *         Arguments referenced by the format specifiers in the format
  11.773 +     *         string.  If there are more arguments than format specifiers, the
  11.774 +     *         extra arguments are ignored.  The number of arguments is
  11.775 +     *         variable and may be zero.  The maximum number of arguments is
  11.776 +     *         limited by the maximum dimension of a Java array as defined by
  11.777 +     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
  11.778 +     *         The behaviour on a
  11.779 +     *         <tt>null</tt> argument depends on the <a
  11.780 +     *         href="../util/Formatter.html#syntax">conversion</a>.
  11.781 +     *
  11.782 +     * @throws  IllegalFormatException
  11.783 +     *          If a format string contains an illegal syntax, a format
  11.784 +     *          specifier that is incompatible with the given arguments,
  11.785 +     *          insufficient arguments given the format string, or other
  11.786 +     *          illegal conditions.  For specification of all possible
  11.787 +     *          formatting errors, see the <a
  11.788 +     *          href="../util/Formatter.html#detail">Details</a> section of the
  11.789 +     *          formatter class specification.
  11.790 +     *
  11.791 +     * @throws  NullPointerException
  11.792 +     *          If the <tt>format</tt> is <tt>null</tt>
  11.793 +     *
  11.794 +     * @return  This writer
  11.795 +     *
  11.796 +     * @since  1.5
  11.797 +     */
  11.798 +    public PrintWriter printf(String format, Object ... args) {
  11.799 +        return format(format, args);
  11.800 +    }
  11.801 +
  11.802 +    /**
  11.803 +     * A convenience method to write a formatted string to this writer using
  11.804 +     * the specified format string and arguments.  If automatic flushing is
  11.805 +     * enabled, calls to this method will flush the output buffer.
  11.806 +     *
  11.807 +     * <p> An invocation of this method of the form <tt>out.printf(l, format,
  11.808 +     * args)</tt> behaves in exactly the same way as the invocation
  11.809 +     *
  11.810 +     * <pre>
  11.811 +     *     out.format(l, format, args) </pre>
  11.812 +     *
  11.813 +     * @param  l
  11.814 +     *         The {@linkplain java.util.Locale locale} to apply during
  11.815 +     *         formatting.  If <tt>l</tt> is <tt>null</tt> then no localization
  11.816 +     *         is applied.
  11.817 +     *
  11.818 +     * @param  format
  11.819 +     *         A format string as described in <a
  11.820 +     *         href="../util/Formatter.html#syntax">Format string syntax</a>.
  11.821 +     *
  11.822 +     * @param  args
  11.823 +     *         Arguments referenced by the format specifiers in the format
  11.824 +     *         string.  If there are more arguments than format specifiers, the
  11.825 +     *         extra arguments are ignored.  The number of arguments is
  11.826 +     *         variable and may be zero.  The maximum number of arguments is
  11.827 +     *         limited by the maximum dimension of a Java array as defined by
  11.828 +     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
  11.829 +     *         The behaviour on a
  11.830 +     *         <tt>null</tt> argument depends on the <a
  11.831 +     *         href="../util/Formatter.html#syntax">conversion</a>.
  11.832 +     *
  11.833 +     * @throws  IllegalFormatException
  11.834 +     *          If a format string contains an illegal syntax, a format
  11.835 +     *          specifier that is incompatible with the given arguments,
  11.836 +     *          insufficient arguments given the format string, or other
  11.837 +     *          illegal conditions.  For specification of all possible
  11.838 +     *          formatting errors, see the <a
  11.839 +     *          href="../util/Formatter.html#detail">Details</a> section of the
  11.840 +     *          formatter class specification.
  11.841 +     *
  11.842 +     * @throws  NullPointerException
  11.843 +     *          If the <tt>format</tt> is <tt>null</tt>
  11.844 +     *
  11.845 +     * @return  This writer
  11.846 +     *
  11.847 +     * @since  1.5
  11.848 +     */
  11.849 +//    public PrintWriter printf(Locale l, String format, Object ... args) {
  11.850 +//        return format(l, format, args);
  11.851 +//    }
  11.852 +
  11.853 +    /**
  11.854 +     * Writes a formatted string to this writer using the specified format
  11.855 +     * string and arguments.  If automatic flushing is enabled, calls to this
  11.856 +     * method will flush the output buffer.
  11.857 +     *
  11.858 +     * <p> The locale always used is the one returned by {@link
  11.859 +     * java.util.Locale#getDefault() Locale.getDefault()}, regardless of any
  11.860 +     * previous invocations of other formatting methods on this object.
  11.861 +     *
  11.862 +     * @param  format
  11.863 +     *         A format string as described in <a
  11.864 +     *         href="../util/Formatter.html#syntax">Format string syntax</a>.
  11.865 +     *
  11.866 +     * @param  args
  11.867 +     *         Arguments referenced by the format specifiers in the format
  11.868 +     *         string.  If there are more arguments than format specifiers, the
  11.869 +     *         extra arguments are ignored.  The number of arguments is
  11.870 +     *         variable and may be zero.  The maximum number of arguments is
  11.871 +     *         limited by the maximum dimension of a Java array as defined by
  11.872 +     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
  11.873 +     *         The behaviour on a
  11.874 +     *         <tt>null</tt> argument depends on the <a
  11.875 +     *         href="../util/Formatter.html#syntax">conversion</a>.
  11.876 +     *
  11.877 +     * @throws  IllegalFormatException
  11.878 +     *          If a format string contains an illegal syntax, a format
  11.879 +     *          specifier that is incompatible with the given arguments,
  11.880 +     *          insufficient arguments given the format string, or other
  11.881 +     *          illegal conditions.  For specification of all possible
  11.882 +     *          formatting errors, see the <a
  11.883 +     *          href="../util/Formatter.html#detail">Details</a> section of the
  11.884 +     *          Formatter class specification.
  11.885 +     *
  11.886 +     * @throws  NullPointerException
  11.887 +     *          If the <tt>format</tt> is <tt>null</tt>
  11.888 +     *
  11.889 +     * @return  This writer
  11.890 +     *
  11.891 +     * @since  1.5
  11.892 +     */
  11.893 +    public PrintWriter format(String format, Object ... args) {
  11.894 +        append(format).append(Arrays.toString(args));
  11.895 +        return this;
  11.896 +    }
  11.897 +
  11.898 +    /**
  11.899 +     * Writes a formatted string to this writer using the specified format
  11.900 +     * string and arguments.  If automatic flushing is enabled, calls to this
  11.901 +     * method will flush the output buffer.
  11.902 +     *
  11.903 +     * @param  l
  11.904 +     *         The {@linkplain java.util.Locale locale} to apply during
  11.905 +     *         formatting.  If <tt>l</tt> is <tt>null</tt> then no localization
  11.906 +     *         is applied.
  11.907 +     *
  11.908 +     * @param  format
  11.909 +     *         A format string as described in <a
  11.910 +     *         href="../util/Formatter.html#syntax">Format string syntax</a>.
  11.911 +     *
  11.912 +     * @param  args
  11.913 +     *         Arguments referenced by the format specifiers in the format
  11.914 +     *         string.  If there are more arguments than format specifiers, the
  11.915 +     *         extra arguments are ignored.  The number of arguments is
  11.916 +     *         variable and may be zero.  The maximum number of arguments is
  11.917 +     *         limited by the maximum dimension of a Java array as defined by
  11.918 +     *         <cite>The Java&trade; Virtual Machine Specification</cite>.
  11.919 +     *         The behaviour on a
  11.920 +     *         <tt>null</tt> argument depends on the <a
  11.921 +     *         href="../util/Formatter.html#syntax">conversion</a>.
  11.922 +     *
  11.923 +     * @throws  IllegalFormatException
  11.924 +     *          If a format string contains an illegal syntax, a format
  11.925 +     *          specifier that is incompatible with the given arguments,
  11.926 +     *          insufficient arguments given the format string, or other
  11.927 +     *          illegal conditions.  For specification of all possible
  11.928 +     *          formatting errors, see the <a
  11.929 +     *          href="../util/Formatter.html#detail">Details</a> section of the
  11.930 +     *          formatter class specification.
  11.931 +     *
  11.932 +     * @throws  NullPointerException
  11.933 +     *          If the <tt>format</tt> is <tt>null</tt>
  11.934 +     *
  11.935 +     * @return  This writer
  11.936 +     *
  11.937 +     * @since  1.5
  11.938 +     */
  11.939 +//    public PrintWriter format(Locale l, String format, Object ... args) {
  11.940 +//        return format(format, args);
  11.941 +//    }
  11.942 +
  11.943 +    /**
  11.944 +     * Appends the specified character sequence to this writer.
  11.945 +     *
  11.946 +     * <p> An invocation of this method of the form <tt>out.append(csq)</tt>
  11.947 +     * behaves in exactly the same way as the invocation
  11.948 +     *
  11.949 +     * <pre>
  11.950 +     *     out.write(csq.toString()) </pre>
  11.951 +     *
  11.952 +     * <p> Depending on the specification of <tt>toString</tt> for the
  11.953 +     * character sequence <tt>csq</tt>, the entire sequence may not be
  11.954 +     * appended. For instance, invoking the <tt>toString</tt> method of a
  11.955 +     * character buffer will return a subsequence whose content depends upon
  11.956 +     * the buffer's position and limit.
  11.957 +     *
  11.958 +     * @param  csq
  11.959 +     *         The character sequence to append.  If <tt>csq</tt> is
  11.960 +     *         <tt>null</tt>, then the four characters <tt>"null"</tt> are
  11.961 +     *         appended to this writer.
  11.962 +     *
  11.963 +     * @return  This writer
  11.964 +     *
  11.965 +     * @since  1.5
  11.966 +     */
  11.967 +    public PrintWriter append(CharSequence csq) {
  11.968 +        if (csq == null)
  11.969 +            write("null");
  11.970 +        else
  11.971 +            write(csq.toString());
  11.972 +        return this;
  11.973 +    }
  11.974 +
  11.975 +    /**
  11.976 +     * Appends a subsequence of the specified character sequence to this writer.
  11.977 +     *
  11.978 +     * <p> An invocation of this method of the form <tt>out.append(csq, start,
  11.979 +     * end)</tt> when <tt>csq</tt> is not <tt>null</tt>, behaves in
  11.980 +     * exactly the same way as the invocation
  11.981 +     *
  11.982 +     * <pre>
  11.983 +     *     out.write(csq.subSequence(start, end).toString()) </pre>
  11.984 +     *
  11.985 +     * @param  csq
  11.986 +     *         The character sequence from which a subsequence will be
  11.987 +     *         appended.  If <tt>csq</tt> is <tt>null</tt>, then characters
  11.988 +     *         will be appended as if <tt>csq</tt> contained the four
  11.989 +     *         characters <tt>"null"</tt>.
  11.990 +     *
  11.991 +     * @param  start
  11.992 +     *         The index of the first character in the subsequence
  11.993 +     *
  11.994 +     * @param  end
  11.995 +     *         The index of the character following the last character in the
  11.996 +     *         subsequence
  11.997 +     *
  11.998 +     * @return  This writer
  11.999 +     *
 11.1000 +     * @throws  IndexOutOfBoundsException
 11.1001 +     *          If <tt>start</tt> or <tt>end</tt> are negative, <tt>start</tt>
 11.1002 +     *          is greater than <tt>end</tt>, or <tt>end</tt> is greater than
 11.1003 +     *          <tt>csq.length()</tt>
 11.1004 +     *
 11.1005 +     * @since  1.5
 11.1006 +     */
 11.1007 +    public PrintWriter append(CharSequence csq, int start, int end) {
 11.1008 +        CharSequence cs = (csq == null ? "null" : csq);
 11.1009 +        write(cs.subSequence(start, end).toString());
 11.1010 +        return this;
 11.1011 +    }
 11.1012 +
 11.1013 +    /**
 11.1014 +     * Appends the specified character to this writer.
 11.1015 +     *
 11.1016 +     * <p> An invocation of this method of the form <tt>out.append(c)</tt>
 11.1017 +     * behaves in exactly the same way as the invocation
 11.1018 +     *
 11.1019 +     * <pre>
 11.1020 +     *     out.write(c) </pre>
 11.1021 +     *
 11.1022 +     * @param  c
 11.1023 +     *         The 16-bit character to append
 11.1024 +     *
 11.1025 +     * @return  This writer
 11.1026 +     *
 11.1027 +     * @since 1.5
 11.1028 +     */
 11.1029 +    public PrintWriter append(char c) {
 11.1030 +        write(c);
 11.1031 +        return this;
 11.1032 +    }
 11.1033 +}
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/rt/emul/compact/src/main/java/java/io/Writer.java	Sun Sep 08 11:22:51 2013 +0200
    12.3 @@ -0,0 +1,325 @@
    12.4 +/*
    12.5 + * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved.
    12.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    12.7 + *
    12.8 + * This code is free software; you can redistribute it and/or modify it
    12.9 + * under the terms of the GNU General Public License version 2 only, as
   12.10 + * published by the Free Software Foundation.  Oracle designates this
   12.11 + * particular file as subject to the "Classpath" exception as provided
   12.12 + * by Oracle in the LICENSE file that accompanied this code.
   12.13 + *
   12.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   12.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   12.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   12.17 + * version 2 for more details (a copy is included in the LICENSE file that
   12.18 + * accompanied this code).
   12.19 + *
   12.20 + * You should have received a copy of the GNU General Public License version
   12.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   12.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   12.23 + *
   12.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   12.25 + * or visit www.oracle.com if you need additional information or have any
   12.26 + * questions.
   12.27 + */
   12.28 +
   12.29 +package java.io;
   12.30 +
   12.31 +
   12.32 +/**
   12.33 + * Abstract class for writing to character streams.  The only methods that a
   12.34 + * subclass must implement are write(char[], int, int), flush(), and close().
   12.35 + * Most subclasses, however, will override some of the methods defined here in
   12.36 + * order to provide higher efficiency, additional functionality, or both.
   12.37 + *
   12.38 + * @see Writer
   12.39 + * @see   BufferedWriter
   12.40 + * @see   CharArrayWriter
   12.41 + * @see   FilterWriter
   12.42 + * @see   OutputStreamWriter
   12.43 + * @see     FileWriter
   12.44 + * @see   PipedWriter
   12.45 + * @see   PrintWriter
   12.46 + * @see   StringWriter
   12.47 + * @see Reader
   12.48 + *
   12.49 + * @author      Mark Reinhold
   12.50 + * @since       JDK1.1
   12.51 + */
   12.52 +
   12.53 +public abstract class Writer implements Appendable, Closeable, Flushable {
   12.54 +
   12.55 +    /**
   12.56 +     * Temporary buffer used to hold writes of strings and single characters
   12.57 +     */
   12.58 +    private char[] writeBuffer;
   12.59 +
   12.60 +    /**
   12.61 +     * Size of writeBuffer, must be >= 1
   12.62 +     */
   12.63 +    private final int writeBufferSize = 1024;
   12.64 +
   12.65 +    /**
   12.66 +     * The object used to synchronize operations on this stream.  For
   12.67 +     * efficiency, a character-stream object may use an object other than
   12.68 +     * itself to protect critical sections.  A subclass should therefore use
   12.69 +     * the object in this field rather than <tt>this</tt> or a synchronized
   12.70 +     * method.
   12.71 +     */
   12.72 +    protected Object lock;
   12.73 +
   12.74 +    /**
   12.75 +     * Creates a new character-stream writer whose critical sections will
   12.76 +     * synchronize on the writer itself.
   12.77 +     */
   12.78 +    protected Writer() {
   12.79 +        this.lock = this;
   12.80 +    }
   12.81 +
   12.82 +    /**
   12.83 +     * Creates a new character-stream writer whose critical sections will
   12.84 +     * synchronize on the given object.
   12.85 +     *
   12.86 +     * @param  lock
   12.87 +     *         Object to synchronize on
   12.88 +     */
   12.89 +    protected Writer(Object lock) {
   12.90 +        if (lock == null) {
   12.91 +            throw new NullPointerException();
   12.92 +        }
   12.93 +        this.lock = lock;
   12.94 +    }
   12.95 +
   12.96 +    /**
   12.97 +     * Writes a single character.  The character to be written is contained in
   12.98 +     * the 16 low-order bits of the given integer value; the 16 high-order bits
   12.99 +     * are ignored.
  12.100 +     *
  12.101 +     * <p> Subclasses that intend to support efficient single-character output
  12.102 +     * should override this method.
  12.103 +     *
  12.104 +     * @param  c
  12.105 +     *         int specifying a character to be written
  12.106 +     *
  12.107 +     * @throws  IOException
  12.108 +     *          If an I/O error occurs
  12.109 +     */
  12.110 +    public void write(int c) throws IOException {
  12.111 +        synchronized (lock) {
  12.112 +            if (writeBuffer == null){
  12.113 +                writeBuffer = new char[writeBufferSize];
  12.114 +            }
  12.115 +            writeBuffer[0] = (char) c;
  12.116 +            write(writeBuffer, 0, 1);
  12.117 +        }
  12.118 +    }
  12.119 +
  12.120 +    /**
  12.121 +     * Writes an array of characters.
  12.122 +     *
  12.123 +     * @param  cbuf
  12.124 +     *         Array of characters to be written
  12.125 +     *
  12.126 +     * @throws  IOException
  12.127 +     *          If an I/O error occurs
  12.128 +     */
  12.129 +    public void write(char cbuf[]) throws IOException {
  12.130 +        write(cbuf, 0, cbuf.length);
  12.131 +    }
  12.132 +
  12.133 +    /**
  12.134 +     * Writes a portion of an array of characters.
  12.135 +     *
  12.136 +     * @param  cbuf
  12.137 +     *         Array of characters
  12.138 +     *
  12.139 +     * @param  off
  12.140 +     *         Offset from which to start writing characters
  12.141 +     *
  12.142 +     * @param  len
  12.143 +     *         Number of characters to write
  12.144 +     *
  12.145 +     * @throws  IOException
  12.146 +     *          If an I/O error occurs
  12.147 +     */
  12.148 +    abstract public void write(char cbuf[], int off, int len) throws IOException;
  12.149 +
  12.150 +    /**
  12.151 +     * Writes a string.
  12.152 +     *
  12.153 +     * @param  str
  12.154 +     *         String to be written
  12.155 +     *
  12.156 +     * @throws  IOException
  12.157 +     *          If an I/O error occurs
  12.158 +     */
  12.159 +    public void write(String str) throws IOException {
  12.160 +        write(str, 0, str.length());
  12.161 +    }
  12.162 +
  12.163 +    /**
  12.164 +     * Writes a portion of a string.
  12.165 +     *
  12.166 +     * @param  str
  12.167 +     *         A String
  12.168 +     *
  12.169 +     * @param  off
  12.170 +     *         Offset from which to start writing characters
  12.171 +     *
  12.172 +     * @param  len
  12.173 +     *         Number of characters to write
  12.174 +     *
  12.175 +     * @throws  IndexOutOfBoundsException
  12.176 +     *          If <tt>off</tt> is negative, or <tt>len</tt> is negative,
  12.177 +     *          or <tt>off+len</tt> is negative or greater than the length
  12.178 +     *          of the given string
  12.179 +     *
  12.180 +     * @throws  IOException
  12.181 +     *          If an I/O error occurs
  12.182 +     */
  12.183 +    public void write(String str, int off, int len) throws IOException {
  12.184 +        synchronized (lock) {
  12.185 +            char cbuf[];
  12.186 +            if (len <= writeBufferSize) {
  12.187 +                if (writeBuffer == null) {
  12.188 +                    writeBuffer = new char[writeBufferSize];
  12.189 +                }
  12.190 +                cbuf = writeBuffer;
  12.191 +            } else {    // Don't permanently allocate very large buffers.
  12.192 +                cbuf = new char[len];
  12.193 +            }
  12.194 +            str.getChars(off, (off + len), cbuf, 0);
  12.195 +            write(cbuf, 0, len);
  12.196 +        }
  12.197 +    }
  12.198 +
  12.199 +    /**
  12.200 +     * Appends the specified character sequence to this writer.
  12.201 +     *
  12.202 +     * <p> An invocation of this method of the form <tt>out.append(csq)</tt>
  12.203 +     * behaves in exactly the same way as the invocation
  12.204 +     *
  12.205 +     * <pre>
  12.206 +     *     out.write(csq.toString()) </pre>
  12.207 +     *
  12.208 +     * <p> Depending on the specification of <tt>toString</tt> for the
  12.209 +     * character sequence <tt>csq</tt>, the entire sequence may not be
  12.210 +     * appended. For instance, invoking the <tt>toString</tt> method of a
  12.211 +     * character buffer will return a subsequence whose content depends upon
  12.212 +     * the buffer's position and limit.
  12.213 +     *
  12.214 +     * @param  csq
  12.215 +     *         The character sequence to append.  If <tt>csq</tt> is
  12.216 +     *         <tt>null</tt>, then the four characters <tt>"null"</tt> are
  12.217 +     *         appended to this writer.
  12.218 +     *
  12.219 +     * @return  This writer
  12.220 +     *
  12.221 +     * @throws  IOException
  12.222 +     *          If an I/O error occurs
  12.223 +     *
  12.224 +     * @since  1.5
  12.225 +     */
  12.226 +    public Writer append(CharSequence csq) throws IOException {
  12.227 +        if (csq == null)
  12.228 +            write("null");
  12.229 +        else
  12.230 +            write(csq.toString());
  12.231 +        return this;
  12.232 +    }
  12.233 +
  12.234 +    /**
  12.235 +     * Appends a subsequence of the specified character sequence to this writer.
  12.236 +     * <tt>Appendable</tt>.
  12.237 +     *
  12.238 +     * <p> An invocation of this method of the form <tt>out.append(csq, start,
  12.239 +     * end)</tt> when <tt>csq</tt> is not <tt>null</tt> behaves in exactly the
  12.240 +     * same way as the invocation
  12.241 +     *
  12.242 +     * <pre>
  12.243 +     *     out.write(csq.subSequence(start, end).toString()) </pre>
  12.244 +     *
  12.245 +     * @param  csq
  12.246 +     *         The character sequence from which a subsequence will be
  12.247 +     *         appended.  If <tt>csq</tt> is <tt>null</tt>, then characters
  12.248 +     *         will be appended as if <tt>csq</tt> contained the four
  12.249 +     *         characters <tt>"null"</tt>.
  12.250 +     *
  12.251 +     * @param  start
  12.252 +     *         The index of the first character in the subsequence
  12.253 +     *
  12.254 +     * @param  end
  12.255 +     *         The index of the character following the last character in the
  12.256 +     *         subsequence
  12.257 +     *
  12.258 +     * @return  This writer
  12.259 +     *
  12.260 +     * @throws  IndexOutOfBoundsException
  12.261 +     *          If <tt>start</tt> or <tt>end</tt> are negative, <tt>start</tt>
  12.262 +     *          is greater than <tt>end</tt>, or <tt>end</tt> is greater than
  12.263 +     *          <tt>csq.length()</tt>
  12.264 +     *
  12.265 +     * @throws  IOException
  12.266 +     *          If an I/O error occurs
  12.267 +     *
  12.268 +     * @since  1.5
  12.269 +     */
  12.270 +    public Writer append(CharSequence csq, int start, int end) throws IOException {
  12.271 +        CharSequence cs = (csq == null ? "null" : csq);
  12.272 +        write(cs.subSequence(start, end).toString());
  12.273 +        return this;
  12.274 +    }
  12.275 +
  12.276 +    /**
  12.277 +     * Appends the specified character to this writer.
  12.278 +     *
  12.279 +     * <p> An invocation of this method of the form <tt>out.append(c)</tt>
  12.280 +     * behaves in exactly the same way as the invocation
  12.281 +     *
  12.282 +     * <pre>
  12.283 +     *     out.write(c) </pre>
  12.284 +     *
  12.285 +     * @param  c
  12.286 +     *         The 16-bit character to append
  12.287 +     *
  12.288 +     * @return  This writer
  12.289 +     *
  12.290 +     * @throws  IOException
  12.291 +     *          If an I/O error occurs
  12.292 +     *
  12.293 +     * @since 1.5
  12.294 +     */
  12.295 +    public Writer append(char c) throws IOException {
  12.296 +        write(c);
  12.297 +        return this;
  12.298 +    }
  12.299 +
  12.300 +    /**
  12.301 +     * Flushes the stream.  If the stream has saved any characters from the
  12.302 +     * various write() methods in a buffer, write them immediately to their
  12.303 +     * intended destination.  Then, if that destination is another character or
  12.304 +     * byte stream, flush it.  Thus one flush() invocation will flush all the
  12.305 +     * buffers in a chain of Writers and OutputStreams.
  12.306 +     *
  12.307 +     * <p> If the intended destination of this stream is an abstraction provided
  12.308 +     * by the underlying operating system, for example a file, then flushing the
  12.309 +     * stream guarantees only that bytes previously written to the stream are
  12.310 +     * passed to the operating system for writing; it does not guarantee that
  12.311 +     * they are actually written to a physical device such as a disk drive.
  12.312 +     *
  12.313 +     * @throws  IOException
  12.314 +     *          If an I/O error occurs
  12.315 +     */
  12.316 +    abstract public void flush() throws IOException;
  12.317 +
  12.318 +    /**
  12.319 +     * Closes the stream, flushing it first. Once the stream has been closed,
  12.320 +     * further write() or flush() invocations will cause an IOException to be
  12.321 +     * thrown. Closing a previously closed stream has no effect.
  12.322 +     *
  12.323 +     * @throws  IOException
  12.324 +     *          If an I/O error occurs
  12.325 +     */
  12.326 +    abstract public void close() throws IOException;
  12.327 +
  12.328 +}
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/rt/emul/compact/src/main/java/java/lang/StackOverflowError.java	Sun Sep 08 11:22:51 2013 +0200
    13.3 @@ -0,0 +1,55 @@
    13.4 +/*
    13.5 + * Copyright (c) 1994, 2008, Oracle and/or its affiliates. All rights reserved.
    13.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    13.7 + *
    13.8 + * This code is free software; you can redistribute it and/or modify it
    13.9 + * under the terms of the GNU General Public License version 2 only, as
   13.10 + * published by the Free Software Foundation.  Oracle designates this
   13.11 + * particular file as subject to the "Classpath" exception as provided
   13.12 + * by Oracle in the LICENSE file that accompanied this code.
   13.13 + *
   13.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   13.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   13.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   13.17 + * version 2 for more details (a copy is included in the LICENSE file that
   13.18 + * accompanied this code).
   13.19 + *
   13.20 + * You should have received a copy of the GNU General Public License version
   13.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   13.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   13.23 + *
   13.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   13.25 + * or visit www.oracle.com if you need additional information or have any
   13.26 + * questions.
   13.27 + */
   13.28 +
   13.29 +package java.lang;
   13.30 +
   13.31 +/**
   13.32 + * Thrown when a stack overflow occurs because an application
   13.33 + * recurses too deeply.
   13.34 + *
   13.35 + * @author unascribed
   13.36 + * @since   JDK1.0
   13.37 + */
   13.38 +public
   13.39 +class StackOverflowError extends VirtualMachineError {
   13.40 +    private static final long serialVersionUID = 8609175038441759607L;
   13.41 +
   13.42 +    /**
   13.43 +     * Constructs a <code>StackOverflowError</code> with no detail message.
   13.44 +     */
   13.45 +    public StackOverflowError() {
   13.46 +        super();
   13.47 +    }
   13.48 +
   13.49 +    /**
   13.50 +     * Constructs a <code>StackOverflowError</code> with the specified
   13.51 +     * detail message.
   13.52 +     *
   13.53 +     * @param   s   the detail message.
   13.54 +     */
   13.55 +    public StackOverflowError(String s) {
   13.56 +        super(s);
   13.57 +    }
   13.58 +}
    14.1 --- a/rt/emul/compact/src/main/java/java/lang/System.java	Sun Sep 08 10:58:10 2013 +0200
    14.2 +++ b/rt/emul/compact/src/main/java/java/lang/System.java	Sun Sep 08 11:22:51 2013 +0200
    14.3 @@ -33,8 +33,27 @@
    14.4          return org.apidesign.bck2brwsr.emul.lang.System.currentTimeMillis();
    14.5      }
    14.6      
    14.7 -    public static long nanoTime() {
    14.8 -        return org.apidesign.bck2brwsr.emul.lang.System.nanoTime();
    14.9 +    public static int identityHashCode(Object obj) {
   14.10 +        return obj.defaultHashCode();
   14.11 +    }
   14.12 +
   14.13 +    public static String getProperty(String name) {
   14.14 +        return null;
   14.15      }
   14.16      
   14.17 +    public static String getProperty(String key, String def) {
   14.18 +        return def;
   14.19 +    }
   14.20 +    
   14.21 +    /**
   14.22 +     * Returns the system-dependent line separator string.  It always
   14.23 +     * returns the same value - the initial value of the {@linkplain
   14.24 +     * #getProperty(String) system property} {@code line.separator}.
   14.25 +     *
   14.26 +     * <p>On UNIX systems, it returns {@code "\n"}; on Microsoft
   14.27 +     * Windows systems it returns {@code "\r\n"}.
   14.28 +     */
   14.29 +    public static String lineSeparator() {
   14.30 +        return "\n";
   14.31 +    }
   14.32  }
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/rt/emul/compact/src/main/java/java/lang/Thread.java	Sun Sep 08 11:22:51 2013 +0200
    15.3 @@ -0,0 +1,1544 @@
    15.4 +/*
    15.5 + * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved.
    15.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    15.7 + *
    15.8 + * This code is free software; you can redistribute it and/or modify it
    15.9 + * under the terms of the GNU General Public License version 2 only, as
   15.10 + * published by the Free Software Foundation.  Oracle designates this
   15.11 + * particular file as subject to the "Classpath" exception as provided
   15.12 + * by Oracle in the LICENSE file that accompanied this code.
   15.13 + *
   15.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   15.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   15.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   15.17 + * version 2 for more details (a copy is included in the LICENSE file that
   15.18 + * accompanied this code).
   15.19 + *
   15.20 + * You should have received a copy of the GNU General Public License version
   15.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   15.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   15.23 + *
   15.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   15.25 + * or visit www.oracle.com if you need additional information or have any
   15.26 + * questions.
   15.27 + */
   15.28 +
   15.29 +package java.lang;
   15.30 +
   15.31 +import java.util.Map;
   15.32 +
   15.33 +
   15.34 +/**
   15.35 + * A <i>thread</i> is a thread of execution in a program. The Java
   15.36 + * Virtual Machine allows an application to have multiple threads of
   15.37 + * execution running concurrently.
   15.38 + * <p>
   15.39 + * Every thread has a priority. Threads with higher priority are
   15.40 + * executed in preference to threads with lower priority. Each thread
   15.41 + * may or may not also be marked as a daemon. When code running in
   15.42 + * some thread creates a new <code>Thread</code> object, the new
   15.43 + * thread has its priority initially set equal to the priority of the
   15.44 + * creating thread, and is a daemon thread if and only if the
   15.45 + * creating thread is a daemon.
   15.46 + * <p>
   15.47 + * When a Java Virtual Machine starts up, there is usually a single
   15.48 + * non-daemon thread (which typically calls the method named
   15.49 + * <code>main</code> of some designated class). The Java Virtual
   15.50 + * Machine continues to execute threads until either of the following
   15.51 + * occurs:
   15.52 + * <ul>
   15.53 + * <li>The <code>exit</code> method of class <code>Runtime</code> has been
   15.54 + *     called and the security manager has permitted the exit operation
   15.55 + *     to take place.
   15.56 + * <li>All threads that are not daemon threads have died, either by
   15.57 + *     returning from the call to the <code>run</code> method or by
   15.58 + *     throwing an exception that propagates beyond the <code>run</code>
   15.59 + *     method.
   15.60 + * </ul>
   15.61 + * <p>
   15.62 + * There are two ways to create a new thread of execution. One is to
   15.63 + * declare a class to be a subclass of <code>Thread</code>. This
   15.64 + * subclass should override the <code>run</code> method of class
   15.65 + * <code>Thread</code>. An instance of the subclass can then be
   15.66 + * allocated and started. For example, a thread that computes primes
   15.67 + * larger than a stated value could be written as follows:
   15.68 + * <p><hr><blockquote><pre>
   15.69 + *     class PrimeThread extends Thread {
   15.70 + *         long minPrime;
   15.71 + *         PrimeThread(long minPrime) {
   15.72 + *             this.minPrime = minPrime;
   15.73 + *         }
   15.74 + *
   15.75 + *         public void run() {
   15.76 + *             // compute primes larger than minPrime
   15.77 + *             &nbsp;.&nbsp;.&nbsp;.
   15.78 + *         }
   15.79 + *     }
   15.80 + * </pre></blockquote><hr>
   15.81 + * <p>
   15.82 + * The following code would then create a thread and start it running:
   15.83 + * <p><blockquote><pre>
   15.84 + *     PrimeThread p = new PrimeThread(143);
   15.85 + *     p.start();
   15.86 + * </pre></blockquote>
   15.87 + * <p>
   15.88 + * The other way to create a thread is to declare a class that
   15.89 + * implements the <code>Runnable</code> interface. That class then
   15.90 + * implements the <code>run</code> method. An instance of the class can
   15.91 + * then be allocated, passed as an argument when creating
   15.92 + * <code>Thread</code>, and started. The same example in this other
   15.93 + * style looks like the following:
   15.94 + * <p><hr><blockquote><pre>
   15.95 + *     class PrimeRun implements Runnable {
   15.96 + *         long minPrime;
   15.97 + *         PrimeRun(long minPrime) {
   15.98 + *             this.minPrime = minPrime;
   15.99 + *         }
  15.100 + *
  15.101 + *         public void run() {
  15.102 + *             // compute primes larger than minPrime
  15.103 + *             &nbsp;.&nbsp;.&nbsp;.
  15.104 + *         }
  15.105 + *     }
  15.106 + * </pre></blockquote><hr>
  15.107 + * <p>
  15.108 + * The following code would then create a thread and start it running:
  15.109 + * <p><blockquote><pre>
  15.110 + *     PrimeRun p = new PrimeRun(143);
  15.111 + *     new Thread(p).start();
  15.112 + * </pre></blockquote>
  15.113 + * <p>
  15.114 + * Every thread has a name for identification purposes. More than
  15.115 + * one thread may have the same name. If a name is not specified when
  15.116 + * a thread is created, a new name is generated for it.
  15.117 + * <p>
  15.118 + * Unless otherwise noted, passing a {@code null} argument to a constructor
  15.119 + * or method in this class will cause a {@link NullPointerException} to be
  15.120 + * thrown.
  15.121 + *
  15.122 + * @author  unascribed
  15.123 + * @see     Runnable
  15.124 + * @see     Runtime#exit(int)
  15.125 + * @see     #run()
  15.126 + * @see     #stop()
  15.127 + * @since   JDK1.0
  15.128 + */
  15.129 +public
  15.130 +class Thread implements Runnable {
  15.131 +
  15.132 +    /**
  15.133 +     * The minimum priority that a thread can have.
  15.134 +     */
  15.135 +    public final static int MIN_PRIORITY = 1;
  15.136 +
  15.137 +   /**
  15.138 +     * The default priority that is assigned to a thread.
  15.139 +     */
  15.140 +    public final static int NORM_PRIORITY = 5;
  15.141 +
  15.142 +    /**
  15.143 +     * The maximum priority that a thread can have.
  15.144 +     */
  15.145 +    public final static int MAX_PRIORITY = 10;
  15.146 +
  15.147 +    private static final Thread ONE = new Thread("main");
  15.148 +    /**
  15.149 +     * Returns a reference to the currently executing thread object.
  15.150 +     *
  15.151 +     * @return  the currently executing thread.
  15.152 +     */
  15.153 +    public static Thread currentThread() {
  15.154 +        return ONE;
  15.155 +    }
  15.156 +
  15.157 +    /**
  15.158 +     * A hint to the scheduler that the current thread is willing to yield
  15.159 +     * its current use of a processor. The scheduler is free to ignore this
  15.160 +     * hint.
  15.161 +     *
  15.162 +     * <p> Yield is a heuristic attempt to improve relative progression
  15.163 +     * between threads that would otherwise over-utilise a CPU. Its use
  15.164 +     * should be combined with detailed profiling and benchmarking to
  15.165 +     * ensure that it actually has the desired effect.
  15.166 +     *
  15.167 +     * <p> It is rarely appropriate to use this method. It may be useful
  15.168 +     * for debugging or testing purposes, where it may help to reproduce
  15.169 +     * bugs due to race conditions. It may also be useful when designing
  15.170 +     * concurrency control constructs such as the ones in the
  15.171 +     * {@link java.util.concurrent.locks} package.
  15.172 +     */
  15.173 +    public static void yield() {
  15.174 +    }
  15.175 +
  15.176 +    /**
  15.177 +     * Causes the currently executing thread to sleep (temporarily cease
  15.178 +     * execution) for the specified number of milliseconds, subject to
  15.179 +     * the precision and accuracy of system timers and schedulers. The thread
  15.180 +     * does not lose ownership of any monitors.
  15.181 +     *
  15.182 +     * @param  millis
  15.183 +     *         the length of time to sleep in milliseconds
  15.184 +     *
  15.185 +     * @throws  IllegalArgumentException
  15.186 +     *          if the value of {@code millis} is negative
  15.187 +     *
  15.188 +     * @throws  InterruptedException
  15.189 +     *          if any thread has interrupted the current thread. The
  15.190 +     *          <i>interrupted status</i> of the current thread is
  15.191 +     *          cleared when this exception is thrown.
  15.192 +     */
  15.193 +    public static native void sleep(long millis) throws InterruptedException;
  15.194 +
  15.195 +    /**
  15.196 +     * Causes the currently executing thread to sleep (temporarily cease
  15.197 +     * execution) for the specified number of milliseconds plus the specified
  15.198 +     * number of nanoseconds, subject to the precision and accuracy of system
  15.199 +     * timers and schedulers. The thread does not lose ownership of any
  15.200 +     * monitors.
  15.201 +     *
  15.202 +     * @param  millis
  15.203 +     *         the length of time to sleep in milliseconds
  15.204 +     *
  15.205 +     * @param  nanos
  15.206 +     *         {@code 0-999999} additional nanoseconds to sleep
  15.207 +     *
  15.208 +     * @throws  IllegalArgumentException
  15.209 +     *          if the value of {@code millis} is negative, or the value of
  15.210 +     *          {@code nanos} is not in the range {@code 0-999999}
  15.211 +     *
  15.212 +     * @throws  InterruptedException
  15.213 +     *          if any thread has interrupted the current thread. The
  15.214 +     *          <i>interrupted status</i> of the current thread is
  15.215 +     *          cleared when this exception is thrown.
  15.216 +     */
  15.217 +    public static void sleep(long millis, int nanos)
  15.218 +    throws InterruptedException {
  15.219 +        if (millis < 0) {
  15.220 +            throw new IllegalArgumentException("timeout value is negative");
  15.221 +        }
  15.222 +
  15.223 +        if (nanos < 0 || nanos > 999999) {
  15.224 +            throw new IllegalArgumentException(
  15.225 +                                "nanosecond timeout value out of range");
  15.226 +        }
  15.227 +
  15.228 +        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
  15.229 +            millis++;
  15.230 +        }
  15.231 +
  15.232 +        sleep(millis);
  15.233 +    }
  15.234 +    private Runnable target;
  15.235 +    private String name;
  15.236 +
  15.237 +    /**
  15.238 +     * Throws CloneNotSupportedException as a Thread can not be meaningfully
  15.239 +     * cloned. Construct a new Thread instead.
  15.240 +     *
  15.241 +     * @throws  CloneNotSupportedException
  15.242 +     *          always
  15.243 +     */
  15.244 +    @Override
  15.245 +    protected Object clone() throws CloneNotSupportedException {
  15.246 +        throw new CloneNotSupportedException();
  15.247 +    }
  15.248 +
  15.249 +    /**
  15.250 +     * Allocates a new {@code Thread} object. This constructor has the same
  15.251 +     * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread}
  15.252 +     * {@code (null, null, gname)}, where {@code gname} is a newly generated
  15.253 +     * name. Automatically generated names are of the form
  15.254 +     * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer.
  15.255 +     */
  15.256 +    public Thread() {
  15.257 +        init(null, null, "Thread-" + nextThreadNum(), 0);
  15.258 +    }
  15.259 +    
  15.260 +    private static int nextThreadNum() {
  15.261 +        return -1;
  15.262 +    }
  15.263 +
  15.264 +    /**
  15.265 +     * Allocates a new {@code Thread} object. This constructor has the same
  15.266 +     * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread}
  15.267 +     * {@code (null, target, gname)}, where {@code gname} is a newly generated
  15.268 +     * name. Automatically generated names are of the form
  15.269 +     * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer.
  15.270 +     *
  15.271 +     * @param  target
  15.272 +     *         the object whose {@code run} method is invoked when this thread
  15.273 +     *         is started. If {@code null}, this classes {@code run} method does
  15.274 +     *         nothing.
  15.275 +     */
  15.276 +    public Thread(Runnable target) {
  15.277 +        init(null, target, "Thread-" + nextThreadNum(), 0);
  15.278 +    }
  15.279 +
  15.280 +    /**
  15.281 +     * Allocates a new {@code Thread} object. This constructor has the same
  15.282 +     * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread}
  15.283 +     * {@code (group, target, gname)} ,where {@code gname} is a newly generated
  15.284 +     * name. Automatically generated names are of the form
  15.285 +     * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer.
  15.286 +     *
  15.287 +     * @param  group
  15.288 +     *         the thread group. If {@code null} and there is a security
  15.289 +     *         manager, the group is determined by {@linkplain
  15.290 +     *         SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}.
  15.291 +     *         If there is not a security manager or {@code
  15.292 +     *         SecurityManager.getThreadGroup()} returns {@code null}, the group
  15.293 +     *         is set to the current thread's thread group.
  15.294 +     *
  15.295 +     * @param  target
  15.296 +     *         the object whose {@code run} method is invoked when this thread
  15.297 +     *         is started. If {@code null}, this thread's run method is invoked.
  15.298 +     *
  15.299 +     * @throws  SecurityException
  15.300 +     *          if the current thread cannot create a thread in the specified
  15.301 +     *          thread group
  15.302 +     */
  15.303 +//    public Thread(ThreadGroup group, Runnable target) {
  15.304 +//        init(group, target, "Thread-" + nextThreadNum(), 0);
  15.305 +//    }
  15.306 +
  15.307 +    /**
  15.308 +     * Allocates a new {@code Thread} object. This constructor has the same
  15.309 +     * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread}
  15.310 +     * {@code (null, null, name)}.
  15.311 +     *
  15.312 +     * @param   name
  15.313 +     *          the name of the new thread
  15.314 +     */
  15.315 +    public Thread(String name) {
  15.316 +        init(null, null, name, 0);
  15.317 +    }
  15.318 +    
  15.319 +    private void init(Object o1, Runnable trgt, String nm, int i4) {
  15.320 +        this.target = trgt;
  15.321 +        this.name = nm;
  15.322 +    }
  15.323 +
  15.324 +    /**
  15.325 +     * Allocates a new {@code Thread} object. This constructor has the same
  15.326 +     * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread}
  15.327 +     * {@code (group, null, name)}.
  15.328 +     *
  15.329 +     * @param  group
  15.330 +     *         the thread group. If {@code null} and there is a security
  15.331 +     *         manager, the group is determined by {@linkplain
  15.332 +     *         SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}.
  15.333 +     *         If there is not a security manager or {@code
  15.334 +     *         SecurityManager.getThreadGroup()} returns {@code null}, the group
  15.335 +     *         is set to the current thread's thread group.
  15.336 +     *
  15.337 +     * @param  name
  15.338 +     *         the name of the new thread
  15.339 +     *
  15.340 +     * @throws  SecurityException
  15.341 +     *          if the current thread cannot create a thread in the specified
  15.342 +     *          thread group
  15.343 +     */
  15.344 +//    public Thread(ThreadGroup group, String name) {
  15.345 +//        init(group, null, name, 0);
  15.346 +//    }
  15.347 +
  15.348 +    /**
  15.349 +     * Allocates a new {@code Thread} object. This constructor has the same
  15.350 +     * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread}
  15.351 +     * {@code (null, target, name)}.
  15.352 +     *
  15.353 +     * @param  target
  15.354 +     *         the object whose {@code run} method is invoked when this thread
  15.355 +     *         is started. If {@code null}, this thread's run method is invoked.
  15.356 +     *
  15.357 +     * @param  name
  15.358 +     *         the name of the new thread
  15.359 +     */
  15.360 +    public Thread(Runnable target, String name) {
  15.361 +        init(null, target, name, 0);
  15.362 +    }
  15.363 +
  15.364 +    /**
  15.365 +     * Allocates a new {@code Thread} object so that it has {@code target}
  15.366 +     * as its run object, has the specified {@code name} as its name,
  15.367 +     * and belongs to the thread group referred to by {@code group}.
  15.368 +     *
  15.369 +     * <p>If there is a security manager, its
  15.370 +     * {@link SecurityManager#checkAccess(ThreadGroup) checkAccess}
  15.371 +     * method is invoked with the ThreadGroup as its argument.
  15.372 +     *
  15.373 +     * <p>In addition, its {@code checkPermission} method is invoked with
  15.374 +     * the {@code RuntimePermission("enableContextClassLoaderOverride")}
  15.375 +     * permission when invoked directly or indirectly by the constructor
  15.376 +     * of a subclass which overrides the {@code getContextClassLoader}
  15.377 +     * or {@code setContextClassLoader} methods.
  15.378 +     *
  15.379 +     * <p>The priority of the newly created thread is set equal to the
  15.380 +     * priority of the thread creating it, that is, the currently running
  15.381 +     * thread. The method {@linkplain #setPriority setPriority} may be
  15.382 +     * used to change the priority to a new value.
  15.383 +     *
  15.384 +     * <p>The newly created thread is initially marked as being a daemon
  15.385 +     * thread if and only if the thread creating it is currently marked
  15.386 +     * as a daemon thread. The method {@linkplain #setDaemon setDaemon}
  15.387 +     * may be used to change whether or not a thread is a daemon.
  15.388 +     *
  15.389 +     * @param  group
  15.390 +     *         the thread group. If {@code null} and there is a security
  15.391 +     *         manager, the group is determined by {@linkplain
  15.392 +     *         SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}.
  15.393 +     *         If there is not a security manager or {@code
  15.394 +     *         SecurityManager.getThreadGroup()} returns {@code null}, the group
  15.395 +     *         is set to the current thread's thread group.
  15.396 +     *
  15.397 +     * @param  target
  15.398 +     *         the object whose {@code run} method is invoked when this thread
  15.399 +     *         is started. If {@code null}, this thread's run method is invoked.
  15.400 +     *
  15.401 +     * @param  name
  15.402 +     *         the name of the new thread
  15.403 +     *
  15.404 +     * @throws  SecurityException
  15.405 +     *          if the current thread cannot create a thread in the specified
  15.406 +     *          thread group or cannot override the context class loader methods.
  15.407 +     */
  15.408 +//    public Thread(ThreadGroup group, Runnable target, String name) {
  15.409 +//        init(group, target, name, 0);
  15.410 +//    }
  15.411 +
  15.412 +    /**
  15.413 +     * Allocates a new {@code Thread} object so that it has {@code target}
  15.414 +     * as its run object, has the specified {@code name} as its name,
  15.415 +     * and belongs to the thread group referred to by {@code group}, and has
  15.416 +     * the specified <i>stack size</i>.
  15.417 +     *
  15.418 +     * <p>This constructor is identical to {@link
  15.419 +     * #Thread(ThreadGroup,Runnable,String)} with the exception of the fact
  15.420 +     * that it allows the thread stack size to be specified.  The stack size
  15.421 +     * is the approximate number of bytes of address space that the virtual
  15.422 +     * machine is to allocate for this thread's stack.  <b>The effect of the
  15.423 +     * {@code stackSize} parameter, if any, is highly platform dependent.</b>
  15.424 +     *
  15.425 +     * <p>On some platforms, specifying a higher value for the
  15.426 +     * {@code stackSize} parameter may allow a thread to achieve greater
  15.427 +     * recursion depth before throwing a {@link StackOverflowError}.
  15.428 +     * Similarly, specifying a lower value may allow a greater number of
  15.429 +     * threads to exist concurrently without throwing an {@link
  15.430 +     * OutOfMemoryError} (or other internal error).  The details of
  15.431 +     * the relationship between the value of the <tt>stackSize</tt> parameter
  15.432 +     * and the maximum recursion depth and concurrency level are
  15.433 +     * platform-dependent.  <b>On some platforms, the value of the
  15.434 +     * {@code stackSize} parameter may have no effect whatsoever.</b>
  15.435 +     *
  15.436 +     * <p>The virtual machine is free to treat the {@code stackSize}
  15.437 +     * parameter as a suggestion.  If the specified value is unreasonably low
  15.438 +     * for the platform, the virtual machine may instead use some
  15.439 +     * platform-specific minimum value; if the specified value is unreasonably
  15.440 +     * high, the virtual machine may instead use some platform-specific
  15.441 +     * maximum.  Likewise, the virtual machine is free to round the specified
  15.442 +     * value up or down as it sees fit (or to ignore it completely).
  15.443 +     *
  15.444 +     * <p>Specifying a value of zero for the {@code stackSize} parameter will
  15.445 +     * cause this constructor to behave exactly like the
  15.446 +     * {@code Thread(ThreadGroup, Runnable, String)} constructor.
  15.447 +     *
  15.448 +     * <p><i>Due to the platform-dependent nature of the behavior of this
  15.449 +     * constructor, extreme care should be exercised in its use.
  15.450 +     * The thread stack size necessary to perform a given computation will
  15.451 +     * likely vary from one JRE implementation to another.  In light of this
  15.452 +     * variation, careful tuning of the stack size parameter may be required,
  15.453 +     * and the tuning may need to be repeated for each JRE implementation on
  15.454 +     * which an application is to run.</i>
  15.455 +     *
  15.456 +     * <p>Implementation note: Java platform implementers are encouraged to
  15.457 +     * document their implementation's behavior with respect to the
  15.458 +     * {@code stackSize} parameter.
  15.459 +     *
  15.460 +     *
  15.461 +     * @param  group
  15.462 +     *         the thread group. If {@code null} and there is a security
  15.463 +     *         manager, the group is determined by {@linkplain
  15.464 +     *         SecurityManager#getThreadGroup SecurityManager.getThreadGroup()}.
  15.465 +     *         If there is not a security manager or {@code
  15.466 +     *         SecurityManager.getThreadGroup()} returns {@code null}, the group
  15.467 +     *         is set to the current thread's thread group.
  15.468 +     *
  15.469 +     * @param  target
  15.470 +     *         the object whose {@code run} method is invoked when this thread
  15.471 +     *         is started. If {@code null}, this thread's run method is invoked.
  15.472 +     *
  15.473 +     * @param  name
  15.474 +     *         the name of the new thread
  15.475 +     *
  15.476 +     * @param  stackSize
  15.477 +     *         the desired stack size for the new thread, or zero to indicate
  15.478 +     *         that this parameter is to be ignored.
  15.479 +     *
  15.480 +     * @throws  SecurityException
  15.481 +     *          if the current thread cannot create a thread in the specified
  15.482 +     *          thread group
  15.483 +     *
  15.484 +     * @since 1.4
  15.485 +     */
  15.486 +//    public Thread(ThreadGroup group, Runnable target, String name,
  15.487 +//                  long stackSize) {
  15.488 +//        init(group, target, name, stackSize);
  15.489 +//    }
  15.490 +
  15.491 +    /**
  15.492 +     * Causes this thread to begin execution; the Java Virtual Machine
  15.493 +     * calls the <code>run</code> method of this thread.
  15.494 +     * <p>
  15.495 +     * The result is that two threads are running concurrently: the
  15.496 +     * current thread (which returns from the call to the
  15.497 +     * <code>start</code> method) and the other thread (which executes its
  15.498 +     * <code>run</code> method).
  15.499 +     * <p>
  15.500 +     * It is never legal to start a thread more than once.
  15.501 +     * In particular, a thread may not be restarted once it has completed
  15.502 +     * execution.
  15.503 +     *
  15.504 +     * @exception  IllegalThreadStateException  if the thread was already
  15.505 +     *               started.
  15.506 +     * @see        #run()
  15.507 +     * @see        #stop()
  15.508 +     */
  15.509 +    public void start() {
  15.510 +        throw new SecurityException();
  15.511 +    }
  15.512 +
  15.513 +    /**
  15.514 +     * If this thread was constructed using a separate
  15.515 +     * <code>Runnable</code> run object, then that
  15.516 +     * <code>Runnable</code> object's <code>run</code> method is called;
  15.517 +     * otherwise, this method does nothing and returns.
  15.518 +     * <p>
  15.519 +     * Subclasses of <code>Thread</code> should override this method.
  15.520 +     *
  15.521 +     * @see     #start()
  15.522 +     * @see     #stop()
  15.523 +     * @see     #Thread(ThreadGroup, Runnable, String)
  15.524 +     */
  15.525 +    @Override
  15.526 +    public void run() {
  15.527 +        if (target != null) {
  15.528 +            target.run();
  15.529 +        }
  15.530 +    }
  15.531 +
  15.532 +    /**
  15.533 +     * Forces the thread to stop executing.
  15.534 +     * <p>
  15.535 +     * If there is a security manager installed, its <code>checkAccess</code>
  15.536 +     * method is called with <code>this</code>
  15.537 +     * as its argument. This may result in a
  15.538 +     * <code>SecurityException</code> being raised (in the current thread).
  15.539 +     * <p>
  15.540 +     * If this thread is different from the current thread (that is, the current
  15.541 +     * thread is trying to stop a thread other than itself), the
  15.542 +     * security manager's <code>checkPermission</code> method (with a
  15.543 +     * <code>RuntimePermission("stopThread")</code> argument) is called in
  15.544 +     * addition.
  15.545 +     * Again, this may result in throwing a
  15.546 +     * <code>SecurityException</code> (in the current thread).
  15.547 +     * <p>
  15.548 +     * The thread represented by this thread is forced to stop whatever
  15.549 +     * it is doing abnormally and to throw a newly created
  15.550 +     * <code>ThreadDeath</code> object as an exception.
  15.551 +     * <p>
  15.552 +     * It is permitted to stop a thread that has not yet been started.
  15.553 +     * If the thread is eventually started, it immediately terminates.
  15.554 +     * <p>
  15.555 +     * An application should not normally try to catch
  15.556 +     * <code>ThreadDeath</code> unless it must do some extraordinary
  15.557 +     * cleanup operation (note that the throwing of
  15.558 +     * <code>ThreadDeath</code> causes <code>finally</code> clauses of
  15.559 +     * <code>try</code> statements to be executed before the thread
  15.560 +     * officially dies).  If a <code>catch</code> clause catches a
  15.561 +     * <code>ThreadDeath</code> object, it is important to rethrow the
  15.562 +     * object so that the thread actually dies.
  15.563 +     * <p>
  15.564 +     * The top-level error handler that reacts to otherwise uncaught
  15.565 +     * exceptions does not print out a message or otherwise notify the
  15.566 +     * application if the uncaught exception is an instance of
  15.567 +     * <code>ThreadDeath</code>.
  15.568 +     *
  15.569 +     * @exception  SecurityException  if the current thread cannot
  15.570 +     *               modify this thread.
  15.571 +     * @see        #interrupt()
  15.572 +     * @see        #checkAccess()
  15.573 +     * @see        #run()
  15.574 +     * @see        #start()
  15.575 +     * @see        ThreadDeath
  15.576 +     * @see        ThreadGroup#uncaughtException(Thread,Throwable)
  15.577 +     * @see        SecurityManager#checkAccess(Thread)
  15.578 +     * @see        SecurityManager#checkPermission
  15.579 +     * @deprecated This method is inherently unsafe.  Stopping a thread with
  15.580 +     *       Thread.stop causes it to unlock all of the monitors that it
  15.581 +     *       has locked (as a natural consequence of the unchecked
  15.582 +     *       <code>ThreadDeath</code> exception propagating up the stack).  If
  15.583 +     *       any of the objects previously protected by these monitors were in
  15.584 +     *       an inconsistent state, the damaged objects become visible to
  15.585 +     *       other threads, potentially resulting in arbitrary behavior.  Many
  15.586 +     *       uses of <code>stop</code> should be replaced by code that simply
  15.587 +     *       modifies some variable to indicate that the target thread should
  15.588 +     *       stop running.  The target thread should check this variable
  15.589 +     *       regularly, and return from its run method in an orderly fashion
  15.590 +     *       if the variable indicates that it is to stop running.  If the
  15.591 +     *       target thread waits for long periods (on a condition variable,
  15.592 +     *       for example), the <code>interrupt</code> method should be used to
  15.593 +     *       interrupt the wait.
  15.594 +     *       For more information, see
  15.595 +     *       <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
  15.596 +     *       are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
  15.597 +     */
  15.598 +    @Deprecated
  15.599 +    public final void stop() {
  15.600 +        stop(null);
  15.601 +    }
  15.602 +
  15.603 +    /**
  15.604 +     * Forces the thread to stop executing.
  15.605 +     * <p>
  15.606 +     * If there is a security manager installed, the <code>checkAccess</code>
  15.607 +     * method of this thread is called, which may result in a
  15.608 +     * <code>SecurityException</code> being raised (in the current thread).
  15.609 +     * <p>
  15.610 +     * If this thread is different from the current thread (that is, the current
  15.611 +     * thread is trying to stop a thread other than itself) or
  15.612 +     * <code>obj</code> is not an instance of <code>ThreadDeath</code>, the
  15.613 +     * security manager's <code>checkPermission</code> method (with the
  15.614 +     * <code>RuntimePermission("stopThread")</code> argument) is called in
  15.615 +     * addition.
  15.616 +     * Again, this may result in throwing a
  15.617 +     * <code>SecurityException</code> (in the current thread).
  15.618 +     * <p>
  15.619 +     * If the argument <code>obj</code> is null, a
  15.620 +     * <code>NullPointerException</code> is thrown (in the current thread).
  15.621 +     * <p>
  15.622 +     * The thread represented by this thread is forced to stop
  15.623 +     * whatever it is doing abnormally and to throw the
  15.624 +     * <code>Throwable</code> object <code>obj</code> as an exception. This
  15.625 +     * is an unusual action to take; normally, the <code>stop</code> method
  15.626 +     * that takes no arguments should be used.
  15.627 +     * <p>
  15.628 +     * It is permitted to stop a thread that has not yet been started.
  15.629 +     * If the thread is eventually started, it immediately terminates.
  15.630 +     *
  15.631 +     * @param      obj   the Throwable object to be thrown.
  15.632 +     * @exception  SecurityException  if the current thread cannot modify
  15.633 +     *               this thread.
  15.634 +     * @throws     NullPointerException if obj is <tt>null</tt>.
  15.635 +     * @see        #interrupt()
  15.636 +     * @see        #checkAccess()
  15.637 +     * @see        #run()
  15.638 +     * @see        #start()
  15.639 +     * @see        #stop()
  15.640 +     * @see        SecurityManager#checkAccess(Thread)
  15.641 +     * @see        SecurityManager#checkPermission
  15.642 +     * @deprecated This method is inherently unsafe.  See {@link #stop()}
  15.643 +     *        for details.  An additional danger of this
  15.644 +     *        method is that it may be used to generate exceptions that the
  15.645 +     *        target thread is unprepared to handle (including checked
  15.646 +     *        exceptions that the thread could not possibly throw, were it
  15.647 +     *        not for this method).
  15.648 +     *        For more information, see
  15.649 +     *        <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
  15.650 +     *        are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
  15.651 +     */
  15.652 +    @Deprecated
  15.653 +    public final synchronized void stop(Throwable obj) {
  15.654 +        throw new SecurityException();
  15.655 +    }
  15.656 +
  15.657 +    /**
  15.658 +     * Interrupts this thread.
  15.659 +     *
  15.660 +     * <p> Unless the current thread is interrupting itself, which is
  15.661 +     * always permitted, the {@link #checkAccess() checkAccess} method
  15.662 +     * of this thread is invoked, which may cause a {@link
  15.663 +     * SecurityException} to be thrown.
  15.664 +     *
  15.665 +     * <p> If this thread is blocked in an invocation of the {@link
  15.666 +     * Object#wait() wait()}, {@link Object#wait(long) wait(long)}, or {@link
  15.667 +     * Object#wait(long, int) wait(long, int)} methods of the {@link Object}
  15.668 +     * class, or of the {@link #join()}, {@link #join(long)}, {@link
  15.669 +     * #join(long, int)}, {@link #sleep(long)}, or {@link #sleep(long, int)},
  15.670 +     * methods of this class, then its interrupt status will be cleared and it
  15.671 +     * will receive an {@link InterruptedException}.
  15.672 +     *
  15.673 +     * <p> If this thread is blocked in an I/O operation upon an {@link
  15.674 +     * java.nio.channels.InterruptibleChannel </code>interruptible
  15.675 +     * channel<code>} then the channel will be closed, the thread's interrupt
  15.676 +     * status will be set, and the thread will receive a {@link
  15.677 +     * java.nio.channels.ClosedByInterruptException}.
  15.678 +     *
  15.679 +     * <p> If this thread is blocked in a {@link java.nio.channels.Selector}
  15.680 +     * then the thread's interrupt status will be set and it will return
  15.681 +     * immediately from the selection operation, possibly with a non-zero
  15.682 +     * value, just as if the selector's {@link
  15.683 +     * java.nio.channels.Selector#wakeup wakeup} method were invoked.
  15.684 +     *
  15.685 +     * <p> If none of the previous conditions hold then this thread's interrupt
  15.686 +     * status will be set. </p>
  15.687 +     *
  15.688 +     * <p> Interrupting a thread that is not alive need not have any effect.
  15.689 +     *
  15.690 +     * @throws  SecurityException
  15.691 +     *          if the current thread cannot modify this thread
  15.692 +     *
  15.693 +     * @revised 6.0
  15.694 +     * @spec JSR-51
  15.695 +     */
  15.696 +    public void interrupt() {
  15.697 +        throw new SecurityException();
  15.698 +    }
  15.699 +
  15.700 +    /**
  15.701 +     * Tests whether the current thread has been interrupted.  The
  15.702 +     * <i>interrupted status</i> of the thread is cleared by this method.  In
  15.703 +     * other words, if this method were to be called twice in succession, the
  15.704 +     * second call would return false (unless the current thread were
  15.705 +     * interrupted again, after the first call had cleared its interrupted
  15.706 +     * status and before the second call had examined it).
  15.707 +     *
  15.708 +     * <p>A thread interruption ignored because a thread was not alive
  15.709 +     * at the time of the interrupt will be reflected by this method
  15.710 +     * returning false.
  15.711 +     *
  15.712 +     * @return  <code>true</code> if the current thread has been interrupted;
  15.713 +     *          <code>false</code> otherwise.
  15.714 +     * @see #isInterrupted()
  15.715 +     * @revised 6.0
  15.716 +     */
  15.717 +    public static boolean interrupted() {
  15.718 +        return currentThread().isInterrupted();
  15.719 +    }
  15.720 +
  15.721 +    /**
  15.722 +     * Tests whether this thread has been interrupted.  The <i>interrupted
  15.723 +     * status</i> of the thread is unaffected by this method.
  15.724 +     *
  15.725 +     * <p>A thread interruption ignored because a thread was not alive
  15.726 +     * at the time of the interrupt will be reflected by this method
  15.727 +     * returning false.
  15.728 +     *
  15.729 +     * @return  <code>true</code> if this thread has been interrupted;
  15.730 +     *          <code>false</code> otherwise.
  15.731 +     * @see     #interrupted()
  15.732 +     * @revised 6.0
  15.733 +     */
  15.734 +    public boolean isInterrupted() {
  15.735 +        return false;
  15.736 +    }
  15.737 +
  15.738 +    /**
  15.739 +     * Throws {@link NoSuchMethodError}.
  15.740 +     *
  15.741 +     * @deprecated This method was originally designed to destroy this
  15.742 +     *     thread without any cleanup. Any monitors it held would have
  15.743 +     *     remained locked. However, the method was never implemented.
  15.744 +     *     If if were to be implemented, it would be deadlock-prone in
  15.745 +     *     much the manner of {@link #suspend}. If the target thread held
  15.746 +     *     a lock protecting a critical system resource when it was
  15.747 +     *     destroyed, no thread could ever access this resource again.
  15.748 +     *     If another thread ever attempted to lock this resource, deadlock
  15.749 +     *     would result. Such deadlocks typically manifest themselves as
  15.750 +     *     "frozen" processes. For more information, see
  15.751 +     *     <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">
  15.752 +     *     Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
  15.753 +     * @throws NoSuchMethodError always
  15.754 +     */
  15.755 +    @Deprecated
  15.756 +    public void destroy() {
  15.757 +        throw new SecurityException();
  15.758 +    }
  15.759 +
  15.760 +    /**
  15.761 +     * Tests if this thread is alive. A thread is alive if it has
  15.762 +     * been started and has not yet died.
  15.763 +     *
  15.764 +     * @return  <code>true</code> if this thread is alive;
  15.765 +     *          <code>false</code> otherwise.
  15.766 +     */
  15.767 +    public final boolean isAlive() {
  15.768 +        return true;
  15.769 +    }
  15.770 +
  15.771 +    /**
  15.772 +     * Suspends this thread.
  15.773 +     * <p>
  15.774 +     * First, the <code>checkAccess</code> method of this thread is called
  15.775 +     * with no arguments. This may result in throwing a
  15.776 +     * <code>SecurityException </code>(in the current thread).
  15.777 +     * <p>
  15.778 +     * If the thread is alive, it is suspended and makes no further
  15.779 +     * progress unless and until it is resumed.
  15.780 +     *
  15.781 +     * @exception  SecurityException  if the current thread cannot modify
  15.782 +     *               this thread.
  15.783 +     * @see #checkAccess
  15.784 +     * @deprecated   This method has been deprecated, as it is
  15.785 +     *   inherently deadlock-prone.  If the target thread holds a lock on the
  15.786 +     *   monitor protecting a critical system resource when it is suspended, no
  15.787 +     *   thread can access this resource until the target thread is resumed. If
  15.788 +     *   the thread that would resume the target thread attempts to lock this
  15.789 +     *   monitor prior to calling <code>resume</code>, deadlock results.  Such
  15.790 +     *   deadlocks typically manifest themselves as "frozen" processes.
  15.791 +     *   For more information, see
  15.792 +     *   <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
  15.793 +     *   are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
  15.794 +     */
  15.795 +    @Deprecated
  15.796 +    public final void suspend() {
  15.797 +        checkAccess();
  15.798 +    }
  15.799 +
  15.800 +    /**
  15.801 +     * Resumes a suspended thread.
  15.802 +     * <p>
  15.803 +     * First, the <code>checkAccess</code> method of this thread is called
  15.804 +     * with no arguments. This may result in throwing a
  15.805 +     * <code>SecurityException</code> (in the current thread).
  15.806 +     * <p>
  15.807 +     * If the thread is alive but suspended, it is resumed and is
  15.808 +     * permitted to make progress in its execution.
  15.809 +     *
  15.810 +     * @exception  SecurityException  if the current thread cannot modify this
  15.811 +     *               thread.
  15.812 +     * @see        #checkAccess
  15.813 +     * @see        #suspend()
  15.814 +     * @deprecated This method exists solely for use with {@link #suspend},
  15.815 +     *     which has been deprecated because it is deadlock-prone.
  15.816 +     *     For more information, see
  15.817 +     *     <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
  15.818 +     *     are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
  15.819 +     */
  15.820 +    @Deprecated
  15.821 +    public final void resume() {
  15.822 +        checkAccess();
  15.823 +    }
  15.824 +
  15.825 +    /**
  15.826 +     * Changes the priority of this thread.
  15.827 +     * <p>
  15.828 +     * First the <code>checkAccess</code> method of this thread is called
  15.829 +     * with no arguments. This may result in throwing a
  15.830 +     * <code>SecurityException</code>.
  15.831 +     * <p>
  15.832 +     * Otherwise, the priority of this thread is set to the smaller of
  15.833 +     * the specified <code>newPriority</code> and the maximum permitted
  15.834 +     * priority of the thread's thread group.
  15.835 +     *
  15.836 +     * @param newPriority priority to set this thread to
  15.837 +     * @exception  IllegalArgumentException  If the priority is not in the
  15.838 +     *               range <code>MIN_PRIORITY</code> to
  15.839 +     *               <code>MAX_PRIORITY</code>.
  15.840 +     * @exception  SecurityException  if the current thread cannot modify
  15.841 +     *               this thread.
  15.842 +     * @see        #getPriority
  15.843 +     * @see        #checkAccess()
  15.844 +     * @see        #getThreadGroup()
  15.845 +     * @see        #MAX_PRIORITY
  15.846 +     * @see        #MIN_PRIORITY
  15.847 +     * @see        ThreadGroup#getMaxPriority()
  15.848 +     */
  15.849 +    public final void setPriority(int newPriority) {
  15.850 +        throw new SecurityException();
  15.851 +    }
  15.852 +
  15.853 +    /**
  15.854 +     * Returns this thread's priority.
  15.855 +     *
  15.856 +     * @return  this thread's priority.
  15.857 +     * @see     #setPriority
  15.858 +     */
  15.859 +    public final int getPriority() {
  15.860 +        return Thread.NORM_PRIORITY;
  15.861 +    }
  15.862 +
  15.863 +    /**
  15.864 +     * Changes the name of this thread to be equal to the argument
  15.865 +     * <code>name</code>.
  15.866 +     * <p>
  15.867 +     * First the <code>checkAccess</code> method of this thread is called
  15.868 +     * with no arguments. This may result in throwing a
  15.869 +     * <code>SecurityException</code>.
  15.870 +     *
  15.871 +     * @param      name   the new name for this thread.
  15.872 +     * @exception  SecurityException  if the current thread cannot modify this
  15.873 +     *               thread.
  15.874 +     * @see        #getName
  15.875 +     * @see        #checkAccess()
  15.876 +     */
  15.877 +    public final void setName(String name) {
  15.878 +        throw new SecurityException();
  15.879 +    }
  15.880 +
  15.881 +    /**
  15.882 +     * Returns this thread's name.
  15.883 +     *
  15.884 +     * @return  this thread's name.
  15.885 +     * @see     #setName(String)
  15.886 +     */
  15.887 +    public final String getName() {
  15.888 +        return String.valueOf(name);
  15.889 +    }
  15.890 +
  15.891 +    /**
  15.892 +     * Returns the thread group to which this thread belongs.
  15.893 +     * This method returns null if this thread has died
  15.894 +     * (been stopped).
  15.895 +     *
  15.896 +     * @return  this thread's thread group.
  15.897 +     */
  15.898 +//    public final ThreadGroup getThreadGroup() {
  15.899 +//        return group;
  15.900 +//    }
  15.901 +
  15.902 +    /**
  15.903 +     * Returns an estimate of the number of active threads in the current
  15.904 +     * thread's {@linkplain java.lang.ThreadGroup thread group} and its
  15.905 +     * subgroups. Recursively iterates over all subgroups in the current
  15.906 +     * thread's thread group.
  15.907 +     *
  15.908 +     * <p> The value returned is only an estimate because the number of
  15.909 +     * threads may change dynamically while this method traverses internal
  15.910 +     * data structures, and might be affected by the presence of certain
  15.911 +     * system threads. This method is intended primarily for debugging
  15.912 +     * and monitoring purposes.
  15.913 +     *
  15.914 +     * @return  an estimate of the number of active threads in the current
  15.915 +     *          thread's thread group and in any other thread group that
  15.916 +     *          has the current thread's thread group as an ancestor
  15.917 +     */
  15.918 +    public static int activeCount() {
  15.919 +        return 1;
  15.920 +    }
  15.921 +
  15.922 +    /**
  15.923 +     * Copies into the specified array every active thread in the current
  15.924 +     * thread's thread group and its subgroups. This method simply
  15.925 +     * invokes the {@link java.lang.ThreadGroup#enumerate(Thread[])}
  15.926 +     * method of the current thread's thread group.
  15.927 +     *
  15.928 +     * <p> An application might use the {@linkplain #activeCount activeCount}
  15.929 +     * method to get an estimate of how big the array should be, however
  15.930 +     * <i>if the array is too short to hold all the threads, the extra threads
  15.931 +     * are silently ignored.</i>  If it is critical to obtain every active
  15.932 +     * thread in the current thread's thread group and its subgroups, the
  15.933 +     * invoker should verify that the returned int value is strictly less
  15.934 +     * than the length of {@code tarray}.
  15.935 +     *
  15.936 +     * <p> Due to the inherent race condition in this method, it is recommended
  15.937 +     * that the method only be used for debugging and monitoring purposes.
  15.938 +     *
  15.939 +     * @param  tarray
  15.940 +     *         an array into which to put the list of threads
  15.941 +     *
  15.942 +     * @return  the number of threads put into the array
  15.943 +     *
  15.944 +     * @throws  SecurityException
  15.945 +     *          if {@link java.lang.ThreadGroup#checkAccess} determines that
  15.946 +     *          the current thread cannot access its thread group
  15.947 +     */
  15.948 +    public static int enumerate(Thread tarray[]) {
  15.949 +        throw new SecurityException();
  15.950 +    }
  15.951 +
  15.952 +    /**
  15.953 +     * Counts the number of stack frames in this thread. The thread must
  15.954 +     * be suspended.
  15.955 +     *
  15.956 +     * @return     the number of stack frames in this thread.
  15.957 +     * @exception  IllegalThreadStateException  if this thread is not
  15.958 +     *             suspended.
  15.959 +     * @deprecated The definition of this call depends on {@link #suspend},
  15.960 +     *             which is deprecated.  Further, the results of this call
  15.961 +     *             were never well-defined.
  15.962 +     */
  15.963 +    @Deprecated
  15.964 +    public native int countStackFrames();
  15.965 +
  15.966 +    /**
  15.967 +     * Waits at most {@code millis} milliseconds for this thread to
  15.968 +     * die. A timeout of {@code 0} means to wait forever.
  15.969 +     *
  15.970 +     * <p> This implementation uses a loop of {@code this.wait} calls
  15.971 +     * conditioned on {@code this.isAlive}. As a thread terminates the
  15.972 +     * {@code this.notifyAll} method is invoked. It is recommended that
  15.973 +     * applications not use {@code wait}, {@code notify}, or
  15.974 +     * {@code notifyAll} on {@code Thread} instances.
  15.975 +     *
  15.976 +     * @param  millis
  15.977 +     *         the time to wait in milliseconds
  15.978 +     *
  15.979 +     * @throws  IllegalArgumentException
  15.980 +     *          if the value of {@code millis} is negative
  15.981 +     *
  15.982 +     * @throws  InterruptedException
  15.983 +     *          if any thread has interrupted the current thread. The
  15.984 +     *          <i>interrupted status</i> of the current thread is
  15.985 +     *          cleared when this exception is thrown.
  15.986 +     */
  15.987 +    public final synchronized void join(long millis)
  15.988 +    throws InterruptedException {
  15.989 +        long base = System.currentTimeMillis();
  15.990 +        long now = 0;
  15.991 +
  15.992 +        if (millis < 0) {
  15.993 +            throw new IllegalArgumentException("timeout value is negative");
  15.994 +        }
  15.995 +
  15.996 +        if (millis == 0) {
  15.997 +            while (isAlive()) {
  15.998 +                wait(0);
  15.999 +            }
 15.1000 +        } else {
 15.1001 +            while (isAlive()) {
 15.1002 +                long delay = millis - now;
 15.1003 +                if (delay <= 0) {
 15.1004 +                    break;
 15.1005 +                }
 15.1006 +                wait(delay);
 15.1007 +                now = System.currentTimeMillis() - base;
 15.1008 +            }
 15.1009 +        }
 15.1010 +    }
 15.1011 +
 15.1012 +    /**
 15.1013 +     * Waits at most {@code millis} milliseconds plus
 15.1014 +     * {@code nanos} nanoseconds for this thread to die.
 15.1015 +     *
 15.1016 +     * <p> This implementation uses a loop of {@code this.wait} calls
 15.1017 +     * conditioned on {@code this.isAlive}. As a thread terminates the
 15.1018 +     * {@code this.notifyAll} method is invoked. It is recommended that
 15.1019 +     * applications not use {@code wait}, {@code notify}, or
 15.1020 +     * {@code notifyAll} on {@code Thread} instances.
 15.1021 +     *
 15.1022 +     * @param  millis
 15.1023 +     *         the time to wait in milliseconds
 15.1024 +     *
 15.1025 +     * @param  nanos
 15.1026 +     *         {@code 0-999999} additional nanoseconds to wait
 15.1027 +     *
 15.1028 +     * @throws  IllegalArgumentException
 15.1029 +     *          if the value of {@code millis} is negative, or the value
 15.1030 +     *          of {@code nanos} is not in the range {@code 0-999999}
 15.1031 +     *
 15.1032 +     * @throws  InterruptedException
 15.1033 +     *          if any thread has interrupted the current thread. The
 15.1034 +     *          <i>interrupted status</i> of the current thread is
 15.1035 +     *          cleared when this exception is thrown.
 15.1036 +     */
 15.1037 +    public final synchronized void join(long millis, int nanos)
 15.1038 +    throws InterruptedException {
 15.1039 +
 15.1040 +        if (millis < 0) {
 15.1041 +            throw new IllegalArgumentException("timeout value is negative");
 15.1042 +        }
 15.1043 +
 15.1044 +        if (nanos < 0 || nanos > 999999) {
 15.1045 +            throw new IllegalArgumentException(
 15.1046 +                                "nanosecond timeout value out of range");
 15.1047 +        }
 15.1048 +
 15.1049 +        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
 15.1050 +            millis++;
 15.1051 +        }
 15.1052 +
 15.1053 +        join(millis);
 15.1054 +    }
 15.1055 +
 15.1056 +    /**
 15.1057 +     * Waits for this thread to die.
 15.1058 +     *
 15.1059 +     * <p> An invocation of this method behaves in exactly the same
 15.1060 +     * way as the invocation
 15.1061 +     *
 15.1062 +     * <blockquote>
 15.1063 +     * {@linkplain #join(long) join}{@code (0)}
 15.1064 +     * </blockquote>
 15.1065 +     *
 15.1066 +     * @throws  InterruptedException
 15.1067 +     *          if any thread has interrupted the current thread. The
 15.1068 +     *          <i>interrupted status</i> of the current thread is
 15.1069 +     *          cleared when this exception is thrown.
 15.1070 +     */
 15.1071 +    public final void join() throws InterruptedException {
 15.1072 +        join(0);
 15.1073 +    }
 15.1074 +
 15.1075 +    /**
 15.1076 +     * Prints a stack trace of the current thread to the standard error stream.
 15.1077 +     * This method is used only for debugging.
 15.1078 +     *
 15.1079 +     * @see     Throwable#printStackTrace()
 15.1080 +     */
 15.1081 +    public static void dumpStack() {
 15.1082 +        new Exception("Stack trace").printStackTrace();
 15.1083 +    }
 15.1084 +
 15.1085 +    /**
 15.1086 +     * Marks this thread as either a {@linkplain #isDaemon daemon} thread
 15.1087 +     * or a user thread. The Java Virtual Machine exits when the only
 15.1088 +     * threads running are all daemon threads.
 15.1089 +     *
 15.1090 +     * <p> This method must be invoked before the thread is started.
 15.1091 +     *
 15.1092 +     * @param  on
 15.1093 +     *         if {@code true}, marks this thread as a daemon thread
 15.1094 +     *
 15.1095 +     * @throws  IllegalThreadStateException
 15.1096 +     *          if this thread is {@linkplain #isAlive alive}
 15.1097 +     *
 15.1098 +     * @throws  SecurityException
 15.1099 +     *          if {@link #checkAccess} determines that the current
 15.1100 +     *          thread cannot modify this thread
 15.1101 +     */
 15.1102 +    public final void setDaemon(boolean on) {
 15.1103 +        throw new SecurityException();
 15.1104 +    }
 15.1105 +
 15.1106 +    /**
 15.1107 +     * Tests if this thread is a daemon thread.
 15.1108 +     *
 15.1109 +     * @return  <code>true</code> if this thread is a daemon thread;
 15.1110 +     *          <code>false</code> otherwise.
 15.1111 +     * @see     #setDaemon(boolean)
 15.1112 +     */
 15.1113 +    public final boolean isDaemon() {
 15.1114 +        return false;
 15.1115 +    }
 15.1116 +
 15.1117 +    /**
 15.1118 +     * Determines if the currently running thread has permission to
 15.1119 +     * modify this thread.
 15.1120 +     * <p>
 15.1121 +     * If there is a security manager, its <code>checkAccess</code> method
 15.1122 +     * is called with this thread as its argument. This may result in
 15.1123 +     * throwing a <code>SecurityException</code>.
 15.1124 +     *
 15.1125 +     * @exception  SecurityException  if the current thread is not allowed to
 15.1126 +     *               access this thread.
 15.1127 +     * @see        SecurityManager#checkAccess(Thread)
 15.1128 +     */
 15.1129 +    public final void checkAccess() {
 15.1130 +        throw new SecurityException();
 15.1131 +    }
 15.1132 +
 15.1133 +    /**
 15.1134 +     * Returns a string representation of this thread, including the
 15.1135 +     * thread's name, priority, and thread group.
 15.1136 +     *
 15.1137 +     * @return  a string representation of this thread.
 15.1138 +     */
 15.1139 +    public String toString() {
 15.1140 +        return "Thread[" + getName() + "," + getPriority() + "," +
 15.1141 +                        "" + "]";
 15.1142 +    }
 15.1143 +
 15.1144 +    /**
 15.1145 +     * Returns the context ClassLoader for this Thread. The context
 15.1146 +     * ClassLoader is provided by the creator of the thread for use
 15.1147 +     * by code running in this thread when loading classes and resources.
 15.1148 +     * If not {@linkplain #setContextClassLoader set}, the default is the
 15.1149 +     * ClassLoader context of the parent Thread. The context ClassLoader of the
 15.1150 +     * primordial thread is typically set to the class loader used to load the
 15.1151 +     * application.
 15.1152 +     *
 15.1153 +     * <p>If a security manager is present, and the invoker's class loader is not
 15.1154 +     * {@code null} and is not the same as or an ancestor of the context class
 15.1155 +     * loader, then this method invokes the security manager's {@link
 15.1156 +     * SecurityManager#checkPermission(java.security.Permission) checkPermission}
 15.1157 +     * method with a {@link RuntimePermission RuntimePermission}{@code
 15.1158 +     * ("getClassLoader")} permission to verify that retrieval of the context
 15.1159 +     * class loader is permitted.
 15.1160 +     *
 15.1161 +     * @return  the context ClassLoader for this Thread, or {@code null}
 15.1162 +     *          indicating the system class loader (or, failing that, the
 15.1163 +     *          bootstrap class loader)
 15.1164 +     *
 15.1165 +     * @throws  SecurityException
 15.1166 +     *          if the current thread cannot get the context ClassLoader
 15.1167 +     *
 15.1168 +     * @since 1.2
 15.1169 +     */
 15.1170 +    public ClassLoader getContextClassLoader() {
 15.1171 +        return null;
 15.1172 +    }
 15.1173 +
 15.1174 +    /**
 15.1175 +     * Sets the context ClassLoader for this Thread. The context
 15.1176 +     * ClassLoader can be set when a thread is created, and allows
 15.1177 +     * the creator of the thread to provide the appropriate class loader,
 15.1178 +     * through {@code getContextClassLoader}, to code running in the thread
 15.1179 +     * when loading classes and resources.
 15.1180 +     *
 15.1181 +     * <p>If a security manager is present, its {@link
 15.1182 +     * SecurityManager#checkPermission(java.security.Permission) checkPermission}
 15.1183 +     * method is invoked with a {@link RuntimePermission RuntimePermission}{@code
 15.1184 +     * ("setContextClassLoader")} permission to see if setting the context
 15.1185 +     * ClassLoader is permitted.
 15.1186 +     *
 15.1187 +     * @param  cl
 15.1188 +     *         the context ClassLoader for this Thread, or null  indicating the
 15.1189 +     *         system class loader (or, failing that, the bootstrap class loader)
 15.1190 +     *
 15.1191 +     * @throws  SecurityException
 15.1192 +     *          if the current thread cannot set the context ClassLoader
 15.1193 +     *
 15.1194 +     * @since 1.2
 15.1195 +     */
 15.1196 +    public void setContextClassLoader(ClassLoader cl) {
 15.1197 +        throw new SecurityException();
 15.1198 +    }
 15.1199 +
 15.1200 +    /**
 15.1201 +     * Returns <tt>true</tt> if and only if the current thread holds the
 15.1202 +     * monitor lock on the specified object.
 15.1203 +     *
 15.1204 +     * <p>This method is designed to allow a program to assert that
 15.1205 +     * the current thread already holds a specified lock:
 15.1206 +     * <pre>
 15.1207 +     *     assert Thread.holdsLock(obj);
 15.1208 +     * </pre>
 15.1209 +     *
 15.1210 +     * @param  obj the object on which to test lock ownership
 15.1211 +     * @throws NullPointerException if obj is <tt>null</tt>
 15.1212 +     * @return <tt>true</tt> if the current thread holds the monitor lock on
 15.1213 +     *         the specified object.
 15.1214 +     * @since 1.4
 15.1215 +     */
 15.1216 +    public static boolean holdsLock(Object obj) {
 15.1217 +        return true;
 15.1218 +    }
 15.1219 +
 15.1220 +    /**
 15.1221 +     * Returns an array of stack trace elements representing the stack dump
 15.1222 +     * of this thread.  This method will return a zero-length array if
 15.1223 +     * this thread has not started, has started but has not yet been
 15.1224 +     * scheduled to run by the system, or has terminated.
 15.1225 +     * If the returned array is of non-zero length then the first element of
 15.1226 +     * the array represents the top of the stack, which is the most recent
 15.1227 +     * method invocation in the sequence.  The last element of the array
 15.1228 +     * represents the bottom of the stack, which is the least recent method
 15.1229 +     * invocation in the sequence.
 15.1230 +     *
 15.1231 +     * <p>If there is a security manager, and this thread is not
 15.1232 +     * the current thread, then the security manager's
 15.1233 +     * <tt>checkPermission</tt> method is called with a
 15.1234 +     * <tt>RuntimePermission("getStackTrace")</tt> permission
 15.1235 +     * to see if it's ok to get the stack trace.
 15.1236 +     *
 15.1237 +     * <p>Some virtual machines may, under some circumstances, omit one
 15.1238 +     * or more stack frames from the stack trace.  In the extreme case,
 15.1239 +     * a virtual machine that has no stack trace information concerning
 15.1240 +     * this thread is permitted to return a zero-length array from this
 15.1241 +     * method.
 15.1242 +     *
 15.1243 +     * @return an array of <tt>StackTraceElement</tt>,
 15.1244 +     * each represents one stack frame.
 15.1245 +     *
 15.1246 +     * @throws SecurityException
 15.1247 +     *        if a security manager exists and its
 15.1248 +     *        <tt>checkPermission</tt> method doesn't allow
 15.1249 +     *        getting the stack trace of thread.
 15.1250 +     * @see SecurityManager#checkPermission
 15.1251 +     * @see RuntimePermission
 15.1252 +     * @see Throwable#getStackTrace
 15.1253 +     *
 15.1254 +     * @since 1.5
 15.1255 +     */
 15.1256 +    public StackTraceElement[] getStackTrace() {
 15.1257 +        throw new SecurityException();
 15.1258 +    }
 15.1259 +
 15.1260 +    /**
 15.1261 +     * Returns a map of stack traces for all live threads.
 15.1262 +     * The map keys are threads and each map value is an array of
 15.1263 +     * <tt>StackTraceElement</tt> that represents the stack dump
 15.1264 +     * of the corresponding <tt>Thread</tt>.
 15.1265 +     * The returned stack traces are in the format specified for
 15.1266 +     * the {@link #getStackTrace getStackTrace} method.
 15.1267 +     *
 15.1268 +     * <p>The threads may be executing while this method is called.
 15.1269 +     * The stack trace of each thread only represents a snapshot and
 15.1270 +     * each stack trace may be obtained at different time.  A zero-length
 15.1271 +     * array will be returned in the map value if the virtual machine has
 15.1272 +     * no stack trace information about a thread.
 15.1273 +     *
 15.1274 +     * <p>If there is a security manager, then the security manager's
 15.1275 +     * <tt>checkPermission</tt> method is called with a
 15.1276 +     * <tt>RuntimePermission("getStackTrace")</tt> permission as well as
 15.1277 +     * <tt>RuntimePermission("modifyThreadGroup")</tt> permission
 15.1278 +     * to see if it is ok to get the stack trace of all threads.
 15.1279 +     *
 15.1280 +     * @return a <tt>Map</tt> from <tt>Thread</tt> to an array of
 15.1281 +     * <tt>StackTraceElement</tt> that represents the stack trace of
 15.1282 +     * the corresponding thread.
 15.1283 +     *
 15.1284 +     * @throws SecurityException
 15.1285 +     *        if a security manager exists and its
 15.1286 +     *        <tt>checkPermission</tt> method doesn't allow
 15.1287 +     *        getting the stack trace of thread.
 15.1288 +     * @see #getStackTrace
 15.1289 +     * @see SecurityManager#checkPermission
 15.1290 +     * @see RuntimePermission
 15.1291 +     * @see Throwable#getStackTrace
 15.1292 +     *
 15.1293 +     * @since 1.5
 15.1294 +     */
 15.1295 +    public static Map<Thread, StackTraceElement[]> getAllStackTraces() {
 15.1296 +        throw new SecurityException();
 15.1297 +    }
 15.1298 +
 15.1299 +    /**
 15.1300 +     * Returns the identifier of this Thread.  The thread ID is a positive
 15.1301 +     * <tt>long</tt> number generated when this thread was created.
 15.1302 +     * The thread ID is unique and remains unchanged during its lifetime.
 15.1303 +     * When a thread is terminated, this thread ID may be reused.
 15.1304 +     *
 15.1305 +     * @return this thread's ID.
 15.1306 +     * @since 1.5
 15.1307 +     */
 15.1308 +    public long getId() {
 15.1309 +        return 0;
 15.1310 +    }
 15.1311 +
 15.1312 +    /**
 15.1313 +     * A thread state.  A thread can be in one of the following states:
 15.1314 +     * <ul>
 15.1315 +     * <li>{@link #NEW}<br>
 15.1316 +     *     A thread that has not yet started is in this state.
 15.1317 +     *     </li>
 15.1318 +     * <li>{@link #RUNNABLE}<br>
 15.1319 +     *     A thread executing in the Java virtual machine is in this state.
 15.1320 +     *     </li>
 15.1321 +     * <li>{@link #BLOCKED}<br>
 15.1322 +     *     A thread that is blocked waiting for a monitor lock
 15.1323 +     *     is in this state.
 15.1324 +     *     </li>
 15.1325 +     * <li>{@link #WAITING}<br>
 15.1326 +     *     A thread that is waiting indefinitely for another thread to
 15.1327 +     *     perform a particular action is in this state.
 15.1328 +     *     </li>
 15.1329 +     * <li>{@link #TIMED_WAITING}<br>
 15.1330 +     *     A thread that is waiting for another thread to perform an action
 15.1331 +     *     for up to a specified waiting time is in this state.
 15.1332 +     *     </li>
 15.1333 +     * <li>{@link #TERMINATED}<br>
 15.1334 +     *     A thread that has exited is in this state.
 15.1335 +     *     </li>
 15.1336 +     * </ul>
 15.1337 +     *
 15.1338 +     * <p>
 15.1339 +     * A thread can be in only one state at a given point in time.
 15.1340 +     * These states are virtual machine states which do not reflect
 15.1341 +     * any operating system thread states.
 15.1342 +     *
 15.1343 +     * @since   1.5
 15.1344 +     * @see #getState
 15.1345 +     */
 15.1346 +    public enum State {
 15.1347 +        /**
 15.1348 +         * Thread state for a thread which has not yet started.
 15.1349 +         */
 15.1350 +        NEW,
 15.1351 +
 15.1352 +        /**
 15.1353 +         * Thread state for a runnable thread.  A thread in the runnable
 15.1354 +         * state is executing in the Java virtual machine but it may
 15.1355 +         * be waiting for other resources from the operating system
 15.1356 +         * such as processor.
 15.1357 +         */
 15.1358 +        RUNNABLE,
 15.1359 +
 15.1360 +        /**
 15.1361 +         * Thread state for a thread blocked waiting for a monitor lock.
 15.1362 +         * A thread in the blocked state is waiting for a monitor lock
 15.1363 +         * to enter a synchronized block/method or
 15.1364 +         * reenter a synchronized block/method after calling
 15.1365 +         * {@link Object#wait() Object.wait}.
 15.1366 +         */
 15.1367 +        BLOCKED,
 15.1368 +
 15.1369 +        /**
 15.1370 +         * Thread state for a waiting thread.
 15.1371 +         * A thread is in the waiting state due to calling one of the
 15.1372 +         * following methods:
 15.1373 +         * <ul>
 15.1374 +         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
 15.1375 +         *   <li>{@link #join() Thread.join} with no timeout</li>
 15.1376 +         *   <li>{@link LockSupport#park() LockSupport.park}</li>
 15.1377 +         * </ul>
 15.1378 +         *
 15.1379 +         * <p>A thread in the waiting state is waiting for another thread to
 15.1380 +         * perform a particular action.
 15.1381 +         *
 15.1382 +         * For example, a thread that has called <tt>Object.wait()</tt>
 15.1383 +         * on an object is waiting for another thread to call
 15.1384 +         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
 15.1385 +         * that object. A thread that has called <tt>Thread.join()</tt>
 15.1386 +         * is waiting for a specified thread to terminate.
 15.1387 +         */
 15.1388 +        WAITING,
 15.1389 +
 15.1390 +        /**
 15.1391 +         * Thread state for a waiting thread with a specified waiting time.
 15.1392 +         * A thread is in the timed waiting state due to calling one of
 15.1393 +         * the following methods with a specified positive waiting time:
 15.1394 +         * <ul>
 15.1395 +         *   <li>{@link #sleep Thread.sleep}</li>
 15.1396 +         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
 15.1397 +         *   <li>{@link #join(long) Thread.join} with timeout</li>
 15.1398 +         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
 15.1399 +         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
 15.1400 +         * </ul>
 15.1401 +         */
 15.1402 +        TIMED_WAITING,
 15.1403 +
 15.1404 +        /**
 15.1405 +         * Thread state for a terminated thread.
 15.1406 +         * The thread has completed execution.
 15.1407 +         */
 15.1408 +        TERMINATED;
 15.1409 +    }
 15.1410 +
 15.1411 +    /**
 15.1412 +     * Returns the state of this thread.
 15.1413 +     * This method is designed for use in monitoring of the system state,
 15.1414 +     * not for synchronization control.
 15.1415 +     *
 15.1416 +     * @return this thread's state.
 15.1417 +     * @since 1.5
 15.1418 +     */
 15.1419 +    public State getState() {
 15.1420 +        // get current thread state
 15.1421 +        return State.RUNNABLE;
 15.1422 +    }
 15.1423 +
 15.1424 +    // Added in JSR-166
 15.1425 +
 15.1426 +    /**
 15.1427 +     * Interface for handlers invoked when a <tt>Thread</tt> abruptly
 15.1428 +     * terminates due to an uncaught exception.
 15.1429 +     * <p>When a thread is about to terminate due to an uncaught exception
 15.1430 +     * the Java Virtual Machine will query the thread for its
 15.1431 +     * <tt>UncaughtExceptionHandler</tt> using
 15.1432 +     * {@link #getUncaughtExceptionHandler} and will invoke the handler's
 15.1433 +     * <tt>uncaughtException</tt> method, passing the thread and the
 15.1434 +     * exception as arguments.
 15.1435 +     * If a thread has not had its <tt>UncaughtExceptionHandler</tt>
 15.1436 +     * explicitly set, then its <tt>ThreadGroup</tt> object acts as its
 15.1437 +     * <tt>UncaughtExceptionHandler</tt>. If the <tt>ThreadGroup</tt> object
 15.1438 +     * has no
 15.1439 +     * special requirements for dealing with the exception, it can forward
 15.1440 +     * the invocation to the {@linkplain #getDefaultUncaughtExceptionHandler
 15.1441 +     * default uncaught exception handler}.
 15.1442 +     *
 15.1443 +     * @see #setDefaultUncaughtExceptionHandler
 15.1444 +     * @see #setUncaughtExceptionHandler
 15.1445 +     * @see ThreadGroup#uncaughtException
 15.1446 +     * @since 1.5
 15.1447 +     */
 15.1448 +    public interface UncaughtExceptionHandler {
 15.1449 +        /**
 15.1450 +         * Method invoked when the given thread terminates due to the
 15.1451 +         * given uncaught exception.
 15.1452 +         * <p>Any exception thrown by this method will be ignored by the
 15.1453 +         * Java Virtual Machine.
 15.1454 +         * @param t the thread
 15.1455 +         * @param e the exception
 15.1456 +         */
 15.1457 +        void uncaughtException(Thread t, Throwable e);
 15.1458 +    }
 15.1459 +
 15.1460 +    // null unless explicitly set
 15.1461 +    private volatile UncaughtExceptionHandler uncaughtExceptionHandler;
 15.1462 +
 15.1463 +    // null unless explicitly set
 15.1464 +    private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler;
 15.1465 +
 15.1466 +    /**
 15.1467 +     * Set the default handler invoked when a thread abruptly terminates
 15.1468 +     * due to an uncaught exception, and no other handler has been defined
 15.1469 +     * for that thread.
 15.1470 +     *
 15.1471 +     * <p>Uncaught exception handling is controlled first by the thread, then
 15.1472 +     * by the thread's {@link ThreadGroup} object and finally by the default
 15.1473 +     * uncaught exception handler. If the thread does not have an explicit
 15.1474 +     * uncaught exception handler set, and the thread's thread group
 15.1475 +     * (including parent thread groups)  does not specialize its
 15.1476 +     * <tt>uncaughtException</tt> method, then the default handler's
 15.1477 +     * <tt>uncaughtException</tt> method will be invoked.
 15.1478 +     * <p>By setting the default uncaught exception handler, an application
 15.1479 +     * can change the way in which uncaught exceptions are handled (such as
 15.1480 +     * logging to a specific device, or file) for those threads that would
 15.1481 +     * already accept whatever &quot;default&quot; behavior the system
 15.1482 +     * provided.
 15.1483 +     *
 15.1484 +     * <p>Note that the default uncaught exception handler should not usually
 15.1485 +     * defer to the thread's <tt>ThreadGroup</tt> object, as that could cause
 15.1486 +     * infinite recursion.
 15.1487 +     *
 15.1488 +     * @param eh the object to use as the default uncaught exception handler.
 15.1489 +     * If <tt>null</tt> then there is no default handler.
 15.1490 +     *
 15.1491 +     * @throws SecurityException if a security manager is present and it
 15.1492 +     *         denies <tt>{@link RuntimePermission}
 15.1493 +     *         (&quot;setDefaultUncaughtExceptionHandler&quot;)</tt>
 15.1494 +     *
 15.1495 +     * @see #setUncaughtExceptionHandler
 15.1496 +     * @see #getUncaughtExceptionHandler
 15.1497 +     * @see ThreadGroup#uncaughtException
 15.1498 +     * @since 1.5
 15.1499 +     */
 15.1500 +    public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
 15.1501 +        throw new SecurityException();
 15.1502 +    }
 15.1503 +
 15.1504 +    /**
 15.1505 +     * Returns the default handler invoked when a thread abruptly terminates
 15.1506 +     * due to an uncaught exception. If the returned value is <tt>null</tt>,
 15.1507 +     * there is no default.
 15.1508 +     * @since 1.5
 15.1509 +     * @see #setDefaultUncaughtExceptionHandler
 15.1510 +     */
 15.1511 +    public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler(){
 15.1512 +        return defaultUncaughtExceptionHandler;
 15.1513 +    }
 15.1514 +
 15.1515 +    /**
 15.1516 +     * Returns the handler invoked when this thread abruptly terminates
 15.1517 +     * due to an uncaught exception. If this thread has not had an
 15.1518 +     * uncaught exception handler explicitly set then this thread's
 15.1519 +     * <tt>ThreadGroup</tt> object is returned, unless this thread
 15.1520 +     * has terminated, in which case <tt>null</tt> is returned.
 15.1521 +     * @since 1.5
 15.1522 +     */
 15.1523 +    public UncaughtExceptionHandler getUncaughtExceptionHandler() {
 15.1524 +        return uncaughtExceptionHandler != null ?
 15.1525 +            uncaughtExceptionHandler : null;
 15.1526 +    }
 15.1527 +
 15.1528 +    /**
 15.1529 +     * Set the handler invoked when this thread abruptly terminates
 15.1530 +     * due to an uncaught exception.
 15.1531 +     * <p>A thread can take full control of how it responds to uncaught
 15.1532 +     * exceptions by having its uncaught exception handler explicitly set.
 15.1533 +     * If no such handler is set then the thread's <tt>ThreadGroup</tt>
 15.1534 +     * object acts as its handler.
 15.1535 +     * @param eh the object to use as this thread's uncaught exception
 15.1536 +     * handler. If <tt>null</tt> then this thread has no explicit handler.
 15.1537 +     * @throws  SecurityException  if the current thread is not allowed to
 15.1538 +     *          modify this thread.
 15.1539 +     * @see #setDefaultUncaughtExceptionHandler
 15.1540 +     * @see ThreadGroup#uncaughtException
 15.1541 +     * @since 1.5
 15.1542 +     */
 15.1543 +    public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
 15.1544 +        checkAccess();
 15.1545 +        uncaughtExceptionHandler = eh;
 15.1546 +    }
 15.1547 +}
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/rt/emul/compact/src/main/java/java/math/BigDecimal.java	Sun Sep 08 11:22:51 2013 +0200
    16.3 @@ -0,0 +1,3842 @@
    16.4 +/*
    16.5 + * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
    16.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    16.7 + *
    16.8 + * This code is free software; you can redistribute it and/or modify it
    16.9 + * under the terms of the GNU General Public License version 2 only, as
   16.10 + * published by the Free Software Foundation.  Oracle designates this
   16.11 + * particular file as subject to the "Classpath" exception as provided
   16.12 + * by Oracle in the LICENSE file that accompanied this code.
   16.13 + *
   16.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
   16.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   16.16 + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   16.17 + * version 2 for more details (a copy is included in the LICENSE file that
   16.18 + * accompanied this code).
   16.19 + *
   16.20 + * You should have received a copy of the GNU General Public License version
   16.21 + * 2 along with this work; if not, write to the Free Software Foundation,
   16.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   16.23 + *
   16.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   16.25 + * or visit www.oracle.com if you need additional information or have any
   16.26 + * questions.
   16.27 + */
   16.28 +
   16.29 +/*
   16.30 + * Portions Copyright IBM Corporation, 2001. All Rights Reserved.
   16.31 + */
   16.32 +
   16.33 +package java.math;
   16.34 +
   16.35 +import java.util.Arrays;
   16.36 +import static java.math.BigInteger.LONG_MASK;
   16.37 +
   16.38 +/**
   16.39 + * Immutable, arbitrary-precision signed decimal numbers.  A
   16.40 + * {@code BigDecimal} consists of an arbitrary precision integer
   16.41 + * <i>unscaled value</i> and a 32-bit integer <i>scale</i>.  If zero
   16.42 + * or positive, the scale is the number of digits to the right of the
   16.43 + * decimal point.  If negative, the unscaled value of the number is
   16.44 + * multiplied by ten to the power of the negation of the scale.  The
   16.45 + * value of the number represented by the {@code BigDecimal} is
   16.46 + * therefore <tt>(unscaledValue &times; 10<sup>-scale</sup>)</tt>.
   16.47 + *
   16.48 + * <p>The {@code BigDecimal} class provides operations for
   16.49 + * arithmetic, scale manipulation, rounding, comparison, hashing, and
   16.50 + * format conversion.  The {@link #toString} method provides a
   16.51 + * canonical representation of a {@code BigDecimal}.
   16.52 + *
   16.53 + * <p>The {@code BigDecimal} class gives its user complete control
   16.54 + * over rounding behavior.  If no rounding mode is specified and the
   16.55 + * exact result cannot be represented, an exception is thrown;
   16.56 + * otherwise, calculations can be carried out to a chosen precision
   16.57 + * and rounding mode by supplying an appropriate {@link MathContext}
   16.58 + * object to the operation.  In either case, eight <em>rounding
   16.59 + * modes</em> are provided for the control of rounding.  Using the
   16.60 + * integer fields in this class (such as {@link #ROUND_HALF_UP}) to
   16.61 + * represent rounding mode is largely obsolete; the enumeration values
   16.62 + * of the {@code RoundingMode} {@code enum}, (such as {@link
   16.63 + * RoundingMode#HALF_UP}) should be used instead.
   16.64 + *
   16.65 + * <p>When a {@code MathContext} object is supplied with a precision
   16.66 + * setting of 0 (for example, {@link MathContext#UNLIMITED}),
   16.67 + * arithmetic operations are exact, as are the arithmetic methods
   16.68 + * which take no {@code MathContext} object.  (This is the only
   16.69 + * behavior that was supported in releases prior to 5.)  As a
   16.70 + * corollary of computing the exact result, the rounding mode setting
   16.71 + * of a {@code MathContext} object with a precision setting of 0 is
   16.72 + * not used and thus irrelevant.  In the case of divide, the exact
   16.73 + * quotient could have an infinitely long decimal expansion; for
   16.74 + * example, 1 divided by 3.  If the quotient has a nonterminating
   16.75 + * decimal expansion and the operation is specified to return an exact
   16.76 + * result, an {@code ArithmeticException} is thrown.  Otherwise, the
   16.77 + * exact result of the division is returned, as done for other
   16.78 + * operations.
   16.79 + *
   16.80 + * <p>When the precision setting is not 0, the rules of
   16.81 + * {@code BigDecimal} arithmetic are broadly compatible with selected
   16.82 + * modes of operation of the arithmetic defined in ANSI X3.274-1996
   16.83 + * and ANSI X3.274-1996/AM 1-2000 (section 7.4).  Unlike those
   16.84 + * standards, {@code BigDecimal} includes many rounding modes, which
   16.85 + * were mandatory for division in {@code BigDecimal} releases prior
   16.86 + * to 5.  Any conflicts between these ANSI standards and the
   16.87 + * {@code BigDecimal} specification are resolved in favor of
   16.88 + * {@code BigDecimal}.
   16.89 + *
   16.90 + * <p>Since the same numerical value can have different
   16.91 + * representations (with different scales), the rules of arithmetic
   16.92 + * and rounding must specify both the numerical result and the scale
   16.93 + * used in the result's representation.
   16.94 + *
   16.95 + *
   16.96 + * <p>In general the rounding modes and precision setting determine
   16.97 + * how operations return results with a limited number of digits when
   16.98 + * the exact result has more digits (perhaps infinitely many in the
   16.99 + * case of division) than the number of digits returned.
  16.100 + *
  16.101 + * First, the
  16.102 + * total number of digits to return is specified by the
  16.103 + * {@code MathContext}'s {@code precision} setting; this determines
  16.104 + * the result's <i>precision</i>.  The digit count starts from the
  16.105 + * leftmost nonzero digit of the exact result.  The rounding mode
  16.106 + * determines how any discarded trailing digits affect the returned
  16.107 + * result.
  16.108 + *
  16.109 + * <p>For all arithmetic operators , the operation is carried out as
  16.110 + * though an exact intermediate result were first calculated and then
  16.111 + * rounded to the number of digits specified by the precision setting
  16.112 + * (if necessary), using the selected rounding mode.  If the exact
  16.113 + * result is not returned, some digit positions of the exact result
  16.114 + * are discarded.  When rounding increases the magnitude of the
  16.115 + * returned result, it is possible for a new digit position to be
  16.116 + * created by a carry propagating to a leading {@literal "9"} digit.
  16.117 + * For example, rounding the value 999.9 to three digits rounding up
  16.118 + * would be numerically equal to one thousand, represented as
  16.119 + * 100&times;10<sup>1</sup>.  In such cases, the new {@literal "1"} is
  16.120 + * the leading digit position of the returned result.
  16.121 + *
  16.122 + * <p>Besides a logical exact result, each arithmetic operation has a
  16.123 + * preferred scale for representing a result.  The preferred
  16.124 + * scale for each operation is listed in the table below.
  16.125 + *
  16.126 + * <table border>
  16.127 + * <caption><b>Preferred Scales for Results of Arithmetic Operations
  16.128 + * </b></caption>
  16.129 + * <tr><th>Operation</th><th>Preferred Scale of Result</th></tr>
  16.130 + * <tr><td>Add</td><td>max(addend.scale(), augend.scale())</td>
  16.131 + * <tr><td>Subtract</td><td>max(minuend.scale(), subtrahend.scale())</td>
  16.132 + * <tr><td>Multiply</td><td>multiplier.scale() + multiplicand.scale()</td>
  16.133 + * <tr><td>Divide</td><td>dividend.scale() - divisor.scale()</td>
  16.134 + * </table>
  16.135 + *
  16.136 + * These scales are the ones used by the methods which return exact
  16.137 + * arithmetic results; except that an exact divide may have to use a
  16.138 + * larger scale since the exact result may have more digits.  For
  16.139 + * example, {@code 1/32} is {@code 0.03125}.
  16.140 + *
  16.141 + * <p>Before rounding, the scale of the logical exact intermediate
  16.142 + * result is the preferred scale for that operation.  If the exact
  16.143 + * numerical result cannot be represented in {@code precision}
  16.144 + * digits, rounding selects the set of digits to return and the scale
  16.145 + * of the result is reduced from the scale of the intermediate result
  16.146 + * to the least scale which can represent the {@code precision}
  16.147 + * digits actually returned.  If the exact result can be represented
  16.148 + * with at most {@code precision} digits, the representation
  16.149 + * of the result with the scale closest to the preferred scale is
  16.150 + * returned.  In particular, an exactly representable quotient may be
  16.151 + * represented in fewer than {@code precision} digits by removing
  16.152 + * trailing zeros and decreasing the scale.  For example, rounding to
  16.153 + * three digits using the {@linkplain RoundingMode#FLOOR floor}
  16.154 + * rounding mode, <br>
  16.155 + *
  16.156 + * {@code 19/100 = 0.19   // integer=19,  scale=2} <br>
  16.157 + *
  16.158 + * but<br>
  16.159 + *
  16.160 + * {@code 21/110 = 0.190  // integer=190, scale=3} <br>
  16.161 + *
  16.162 + * <p>Note that for add, subtract, and multiply, the reduction in
  16.163 + * scale will equal the number of digit positions of the exact result
  16.164 + * which are discarded. If the rounding causes a carry propagation to
  16.165 + * create a new high-order digit position, an additional digit of the
  16.166 + * result is discarded than when no new digit position is created.
  16.167 + *
  16.168 + * <p>Other methods may have slightly different rounding semantics.
  16.169 + * For example, the result of the {@code pow} method using the
  16.170 + * {@linkplain #pow(int, MathContext) specified algorithm} can
  16.171 + * occasionally differ from the rounded mathematical result by more
  16.172 + * than one unit in the last place, one <i>{@linkplain #ulp() ulp}</i>.
  16.173 + *
  16.174 + * <p>Two types of operations are provided for manipulating the scale
  16.175 + * of a {@code BigDecimal}: scaling/rounding operations and decimal
  16.176 + * point motion operations.  Scaling/rounding operations ({@link
  16.177 + * #setScale setScale} and {@link #round round}) return a
  16.178 + * {@code BigDecimal} whose value is approximately (or exactly) equal
  16.179 + * to that of the operand, but whose scale or precision is the
  16.180 + * specified value; that is, they increase or decrease the precision
  16.181 + * of the stored number with minimal effect on its value.  Decimal
  16.182 + * point motion operations ({@link #movePointLeft movePointLeft} and
  16.183 + * {@link #movePointRight movePointRight}) return a
  16.184 + * {@code BigDecimal} created from the operand by moving the decimal
  16.185 + * point a specified distance in the specified direction.
  16.186 + *
  16.187 + * <p>For the sake of brevity and clarity, pseudo-code is used
  16.188 + * throughout the descriptions of {@code BigDecimal} methods.  The
  16.189 + * pseudo-code expression {@code (i + j)} is shorthand for "a
  16.190 + * {@code BigDecimal} whose value is that of the {@code BigDecimal}
  16.191 + * {@code i} added to that of the {@code BigDecimal}
  16.192 + * {@code j}." The pseudo-code expression {@code (i == j)} is
  16.193 + * shorthand for "{@code true} if and only if the
  16.194 + * {@code BigDecimal} {@code i} represents the same value as the
  16.195 + * {@code BigDecimal} {@code j}." Other pseudo-code expressions
  16.196 + * are interpreted similarly.  Square brackets are used to represent
  16.197 + * the particular {@code BigInteger} and scale pair defining a
  16.198 + * {@code BigDecimal} value; for example [19, 2] is the
  16.199 + * {@code BigDecimal} numerically equal to 0.19 having a scale of 2.
  16.200 + *
  16.201 + * <p>Note: care should be exercised if {@code BigDecimal} objects
  16.202 + * are used as keys in a {@link java.util.SortedMap SortedMap} or
  16.203 + * elements in a {@link java.util.SortedSet SortedSet} since
  16.204 + * {@code BigDecimal}'s <i>natural ordering</i> is <i>inconsistent
  16.205 + * with equals</i>.  See {@link Comparable}, {@link
  16.206 + * java.util.SortedMap} or {@link java.util.SortedSet} for more
  16.207 + * information.
  16.208 + *
  16.209 + * <p>All methods and constructors for this class throw
  16.210 + * {@code NullPointerException} when passed a {@code null} object
  16.211 + * reference for any input parameter.
  16.212 + *
  16.213 + * @see     BigInteger
  16.214 + * @see     MathContext
  16.215 + * @see     RoundingMode
  16.216 + * @see     java.util.SortedMap
  16.217 + * @see     java.util.SortedSet
  16.218 + * @author  Josh Bloch
  16.219 + * @author  Mike Cowlishaw
  16.220 + * @author  Joseph D. Darcy
  16.221 + */
  16.222 +public class BigDecimal extends Number implements Comparable<BigDecimal> {
  16.223 +    /**
  16.224 +     * The unscaled value of this BigDecimal, as returned by {@link
  16.225 +     * #unscaledValue}.
  16.226 +     *
  16.227 +     * @serial
  16.228 +     * @see #unscaledValue
  16.229 +     */
  16.230 +    private volatile BigInteger intVal;
  16.231 +
  16.232 +    /**
  16.233 +     * The scale of this BigDecimal, as returned by {@link #scale}.
  16.234 +     *
  16.235 +     * @serial
  16.236 +     * @see #scale
  16.237 +     */
  16.238 +    private int scale;  // Note: this may have any value, so
  16.239 +                        // calculations must be done in longs
  16.240 +    /**
  16.241 +     * The number of decimal digits in this BigDecimal, or 0 if the
  16.242 +     * number of digits are not known (lookaside information).  If
  16.243 +     * nonzero, the value is guaranteed correct.  Use the precision()
  16.244 +     * method to obtain and set the value if it might be 0.  This
  16.245 +     * field is mutable until set nonzero.
  16.246 +     *
  16.247 +     * @since  1.5
  16.248 +     */
  16.249 +    private transient int precision;
  16.250 +
  16.251 +    /**
  16.252 +     * Used to store the canonical string representation, if computed.
  16.253 +     */
  16.254 +    private transient String stringCache;
  16.255 +
  16.256 +    /**
  16.257 +     * Sentinel value for {@link #intCompact} indicating the
  16.258 +     * significand information is only available from {@code intVal}.
  16.259 +     */
  16.260 +    static final long INFLATED = Long.MIN_VALUE;
  16.261 +
  16.262 +    /**
  16.263 +     * If the absolute value of the significand of this BigDecimal is
  16.264 +     * less than or equal to {@code Long.MAX_VALUE}, the value can be
  16.265 +     * compactly stored in this field and used in computations.
  16.266 +     */
  16.267 +    private transient long intCompact;
  16.268 +
  16.269 +    // All 18-digit base ten strings fit into a long; not all 19-digit
  16.270 +    // strings will
  16.271 +    private static final int MAX_COMPACT_DIGITS = 18;
  16.272 +
  16.273 +    private static final int MAX_BIGINT_BITS = 62;
  16.274 +
  16.275 +    /* Appease the serialization gods */
  16.276 +    private static final long serialVersionUID = 6108874887143696463L;
  16.277 +
  16.278 +    // Cache of common small BigDecimal values.
  16.279 +    private static final BigDecimal zeroThroughTen[] = {
  16.280 +        new BigDecimal(BigInteger.ZERO,         0,  0, 1),
  16.281 +        new BigDecimal(BigInteger.ONE,          1,  0, 1),
  16.282 +        new BigDecimal(BigInteger.valueOf(2),   2,  0, 1),
  16.283 +        new BigDecimal(BigInteger.valueOf(3),   3,  0, 1),
  16.284 +        new BigDecimal(BigInteger.valueOf(4),   4,  0, 1),
  16.285 +        new BigDecimal(BigInteger.valueOf(5),   5,  0, 1),
  16.286 +        new BigDecimal(BigInteger.valueOf(6),   6,  0, 1),
  16.287 +        new BigDecimal(BigInteger.valueOf(7),   7,  0, 1),
  16.288 +        new BigDecimal(BigInteger.valueOf(8),   8,  0, 1),
  16.289 +        new BigDecimal(BigInteger.valueOf(9),   9,  0, 1),
  16.290 +        new BigDecimal(BigInteger.TEN,          10, 0, 2),
  16.291 +    };
  16.292 +
  16.293 +    // Cache of zero scaled by 0 - 15
  16.294 +    private static final BigDecimal[] ZERO_SCALED_BY = {
  16.295 +        zeroThroughTen[0],
  16.296 +        new BigDecimal(BigInteger.ZERO, 0, 1, 1),
  16.297 +        new BigDecimal(BigInteger.ZERO, 0, 2, 1),
  16.298 +        new BigDecimal(BigInteger.ZERO, 0, 3, 1),
  16.299 +        new BigDecimal(BigInteger.ZERO, 0, 4, 1),
  16.300 +        new BigDecimal(BigInteger.ZERO, 0, 5, 1),
  16.301 +        new BigDecimal(BigInteger.ZERO, 0, 6, 1),
  16.302 +        new BigDecimal(BigInteger.ZERO, 0, 7, 1),
  16.303 +        new BigDecimal(BigInteger.ZERO, 0, 8, 1),
  16.304 +        new BigDecimal(BigInteger.ZERO, 0, 9, 1),
  16.305 +        new BigDecimal(BigInteger.ZERO, 0, 10, 1),
  16.306 +        new BigDecimal(BigInteger.ZERO, 0, 11, 1),
  16.307 +        new BigDecimal(BigInteger.ZERO, 0, 12, 1),
  16.308 +        new BigDecimal(BigInteger.ZERO, 0, 13, 1),
  16.309 +        new BigDecimal(BigInteger.ZERO, 0, 14, 1),
  16.310 +        new BigDecimal(BigInteger.ZERO, 0, 15, 1),
  16.311 +    };
  16.312 +
  16.313 +    // Half of Long.MIN_VALUE & Long.MAX_VALUE.
  16.314 +    private static final long HALF_LONG_MAX_VALUE = Long.MAX_VALUE / 2;
  16.315 +    private static final long HALF_LONG_MIN_VALUE = Long.MIN_VALUE / 2;
  16.316 +
  16.317 +    // Constants
  16.318 +    /**
  16.319 +     * The value 0, with a scale of 0.
  16.320 +     *
  16.321 +     * @since  1.5
  16.322 +     */
  16.323 +    public static final BigDecimal ZERO =
  16.324 +        zeroThroughTen[0];
  16.325 +
  16.326 +    /**
  16.327 +     * The value 1, with a scale of 0.
  16.328 +     *
  16.329 +     * @since  1.5
  16.330 +     */
  16.331 +    public static final BigDecimal ONE =
  16.332 +        zeroThroughTen[1];
  16.333 +
  16.334 +    /**
  16.335 +     * The value 10, with a scale of 0.
  16.336 +     *
  16.337 +     * @since  1.5
  16.338 +     */
  16.339 +    public static final BigDecimal TEN =
  16.340 +        zeroThroughTen[10];
  16.341 +
  16.342 +    // Constructors
  16.343 +
  16.344 +    /**
  16.345 +     * Trusted package private constructor.
  16.346 +     * Trusted simply means if val is INFLATED, intVal could not be null and
  16.347 +     * if intVal is null, val could not be INFLATED.
  16.348 +     */
  16.349 +    BigDecimal(BigInteger intVal, long val, int scale, int prec) {
  16.350 +        this.scale = scale;
  16.351 +        this.precision = prec;
  16.352 +        this.intCompact = val;
  16.353 +        this.intVal = intVal;
  16.354 +    }
  16.355 +
  16.356 +    /**
  16.357 +     * Translates a character array representation of a
  16.358 +     * {@code BigDecimal} into a {@code BigDecimal}, accepting the
  16.359 +     * same sequence of characters as the {@link #BigDecimal(String)}
  16.360 +     * constructor, while allowing a sub-array to be specified.
  16.361 +     *
  16.362 +     * <p>Note that if the sequence of characters is already available
  16.363 +     * within a character array, using this constructor is faster than
  16.364 +     * converting the {@code char} array to string and using the
  16.365 +     * {@code BigDecimal(String)} constructor .
  16.366 +     *
  16.367 +     * @param  in {@code char} array that is the source of characters.
  16.368 +     * @param  offset first character in the array to inspect.
  16.369 +     * @param  len number of characters to consider.
  16.370 +     * @throws NumberFormatException if {@code in} is not a valid
  16.371 +     *         representation of a {@code BigDecimal} or the defined subarray
  16.372 +     *         is not wholly within {@code in}.
  16.373 +     * @since  1.5
  16.374 +     */
  16.375 +    public BigDecimal(char[] in, int offset, int len) {
  16.376 +        // protect against huge length.
  16.377 +        if (offset+len > in.length || offset < 0)
  16.378 +            throw new NumberFormatException();
  16.379 +        // This is the primary string to BigDecimal constructor; all
  16.380 +        // incoming strings end up here; it uses explicit (inline)
  16.381 +        // parsing for speed and generates at most one intermediate
  16.382 +        // (temporary) object (a char[] array) for non-compact case.
  16.383 +
  16.384 +        // Use locals for all fields values until completion
  16.385 +        int prec = 0;                 // record precision value
  16.386 +        int scl = 0;                  // record scale value
  16.387 +        long rs = 0;                  // the compact value in long
  16.388 +        BigInteger rb = null;         // the inflated value in BigInteger
  16.389 +
  16.390 +        // use array bounds checking to handle too-long, len == 0,
  16.391 +        // bad offset, etc.
  16.392 +        try {
  16.393 +            // handle the sign
  16.394 +            boolean isneg = false;          // assume positive
  16.395 +            if (in[offset] == '-') {
  16.396 +                isneg = true;               // leading minus means negative
  16.397 +                offset++;
  16.398 +                len--;
  16.399 +            } else if (in[offset] == '+') { // leading + allowed
  16.400 +                offset++;
  16.401 +                len--;
  16.402 +            }
  16.403 +
  16.404 +            // should now be at numeric part of the significand
  16.405 +            boolean dot = false;             // true when there is a '.'
  16.406 +            int cfirst = offset;             // record start of integer
  16.407 +            long exp = 0;                    // exponent
  16.408 +            char c;                          // current character
  16.409 +
  16.410 +            boolean isCompact = (len <= MAX_COMPACT_DIGITS);
  16.411 +            // integer significand array & idx is the index to it. The array
  16.412 +            // is ONLY used when we can't use a compact representation.
  16.413 +            char coeff[] = isCompact ? null : new char[len];
  16.414 +            int idx = 0;
  16.415 +
  16.416 +            for (; len > 0; offset++, len--) {
  16.417 +                c = in[offset];
  16.418 +                // have digit
  16.419 +                if ((c >= '0' && c <= '9') || Character.isDigit(c)) {
  16.420 +                    // First compact case, we need not to preserve the character
  16.421 +                    // and we can just compute the value in place.
  16.422 +                    if (isCompact) {
  16.423 +                        int digit = Character.digit(c, 10);
  16.424 +                        if (digit == 0) {
  16.425 +                            if (prec == 0)
  16.426 +                                prec = 1;
  16.427 +                            else if (rs != 0) {
  16.428 +                                rs *= 10;
  16.429 +                                ++prec;
  16.430 +                            } // else digit is a redundant leading zero
  16.431 +                        } else {
  16.432 +                            if (prec != 1 || rs != 0)
  16.433 +                                ++prec; // prec unchanged if preceded by 0s
  16.434 +                            rs = rs * 10 + digit;
  16.435 +                        }
  16.436 +                    } else { // the unscaled value is likely a BigInteger object.
  16.437 +                        if (c == '0' || Character.digit(c, 10) == 0) {
  16.438 +                            if (prec == 0) {
  16.439 +                                coeff[idx] = c;
  16.440 +                                prec = 1;
  16.441 +                            } else if (idx != 0) {
  16.442 +                                coeff[idx++] = c;
  16.443 +                                ++prec;
  16.444 +                            } // else c must be a redundant leading zero
  16.445 +                        } else {
  16.446 +                            if (prec != 1 || idx != 0)
  16.447 +                                ++prec; // prec unchanged if preceded by 0s
  16.448 +                            coeff[idx++] = c;
  16.449 +                        }
  16.450 +                    }
  16.451 +                    if (dot)
  16.452 +                        ++scl;
  16.453 +                    continue;
  16.454 +                }
  16.455 +                // have dot
  16.456 +                if (c == '.') {
  16.457 +                    // have dot
  16.458 +                    if (dot)         // two dots
  16.459 +                        throw new NumberFormatException();
  16.460 +                    dot = true;
  16.461 +                    continue;
  16.462 +                }
  16.463 +                // exponent expected
  16.464 +                if ((c != 'e') && (c != 'E'))
  16.465 +                    throw new NumberFormatException();
  16.466 +                offset++;
  16.467 +                c = in[offset];
  16.468 +                len--;
  16.469 +                boolean negexp = (c == '-');
  16.470 +                // optional sign
  16.471 +                if (negexp || c == '+') {
  16.472 +                    offset++;
  16.473 +                    c = in[offset];
  16.474 +                    len--;
  16.475 +                }
  16.476 +                if (len <= 0)    // no exponent digits
  16.477 +                    throw new NumberFormatException();
  16.478 +                // skip leading zeros in the exponent
  16.479 +                while (len > 10 && Character.digit(c, 10) == 0) {
  16.480 +                    offset++;
  16.481 +                    c = in[offset];
  16.482 +                    len--;
  16.483 +                }
  16.484 +                if (len > 10)  // too many nonzero exponent digits
  16.485 +                    throw new NumberFormatException();
  16.486 +                // c now holds first digit of exponent
  16.487 +                for (;; len--) {
  16.488 +                    int v;
  16.489 +                    if (c >= '0' && c <= '9') {
  16.490 +                        v = c - '0';
  16.491 +                    } else {
  16.492 +                        v = Character.digit(c, 10);
  16.493 +                        if (v < 0)            // not a digit
  16.494 +                            throw new NumberFormatException();
  16.495 +                    }
  16.496 +                    exp = exp * 10 + v;
  16.497 +                    if (len == 1)
  16.498 +                        break;               // that was final character
  16.499 +                    offset++;
  16.500 +                    c = in[offset];
  16.501 +                }
  16.502 +                if (negexp)                  // apply sign
  16.503 +                    exp = -exp;
  16.504 +                // Next test is required for backwards compatibility
  16.505 +                if ((int)exp != exp)         // overflow
  16.506 +                    throw new NumberFormatException();
  16.507 +                break;                       // [saves a test]
  16.508 +            }
  16.509 +            // here when no characters left
  16.510 +            if (prec == 0)              // no digits found
  16.511 +                throw new NumberFormatException();
  16.512 +
  16.513 +            // Adjust scale if exp is not zero.
  16.514 +            if (exp != 0) {                  // had significant exponent
  16.515 +                // Can't call checkScale which relies on proper fields value
  16.516 +                long adjustedScale = scl - exp;
  16.517 +                if (adjustedScale > Integer.MAX_VALUE ||
  16.518 +                    adjustedScale < Integer.MIN_VALUE)
  16.519 +                    throw new NumberFormatException("Scale out of range.");
  16.520 +                scl = (int)adjustedScale;
  16.521 +            }
  16.522 +
  16.523 +            // Remove leading zeros from precision (digits count)
  16.524 +            if (isCompact) {
  16.525 +                rs = isneg ? -rs : rs;
  16.526 +            } else {
  16.527 +                char quick[];
  16.528 +                if (!isneg) {
  16.529 +                    quick = (coeff.length != prec) ?
  16.530 +                        Arrays.copyOf(coeff, prec) : coeff;
  16.531 +                } else {
  16.532 +                    quick = new char[prec + 1];
  16.533 +                    quick[0] = '-';
  16.534 +                    System.arraycopy(coeff, 0, quick, 1, prec);
  16.535 +                }
  16.536 +                rb = new BigInteger(quick);
  16.537 +                rs = compactValFor(rb);
  16.538 +            }
  16.539 +        } catch (ArrayIndexOutOfBoundsException e) {
  16.540 +            throw new NumberFormatException();
  16.541 +        } catch (NegativeArraySizeException e) {
  16.542 +            throw new NumberFormatException();
  16.543 +        }
  16.544 +        this.scale = scl;
  16.545 +        this.precision = prec;
  16.546 +        this.intCompact = rs;
  16.547 +        this.intVal = (rs != INFLATED) ? null : rb;
  16.548 +    }
  16.549 +
  16.550 +    /**
  16.551 +     * Translates a character array representation of a
  16.552 +     * {@code BigDecimal} into a {@code BigDecimal}, accepting the
  16.553 +     * same sequence of characters as the {@link #BigDecimal(String)}
  16.554 +     * constructor, while allowing a sub-array to be specified and
  16.555 +     * with rounding according to the context settings.
  16.556 +     *
  16.557 +     * <p>Note that if the sequence of characters is already available
  16.558 +     * within a character array, using this constructor is faster than
  16.559 +     * converting the {@code char} array to string and using the
  16.560 +     * {@code BigDecimal(String)} constructor .
  16.561 +     *
  16.562 +     * @param  in {@code char} array that is the source of characters.
  16.563 +     * @param  offset first character in the array to inspect.
  16.564 +     * @param  len number of characters to consider..
  16.565 +     * @param  mc the context to use.
  16.566 +     * @throws ArithmeticException if the result is inexact but the
  16.567 +     *         rounding mode is {@code UNNECESSARY}.
  16.568 +     * @throws NumberFormatException if {@code in} is not a valid
  16.569 +     *         representation of a {@code BigDecimal} or the defined subarray
  16.570 +     *         is not wholly within {@code in}.
  16.571 +     * @since  1.5
  16.572 +     */
  16.573 +    public BigDecimal(char[] in, int offset, int len, MathContext mc) {
  16.574 +        this(in, offset, len);
  16.575 +        if (mc.precision > 0)
  16.576 +            roundThis(mc);
  16.577 +    }
  16.578 +
  16.579 +    /**
  16.580 +     * Translates a character array representation of a
  16.581 +     * {@code BigDecimal} into a {@code BigDecimal}, accepting the
  16.582 +     * same sequence of characters as the {@link #BigDecimal(String)}
  16.583 +     * constructor.
  16.584 +     *
  16.585 +     * <p>Note that if the sequence of characters is already available
  16.586 +     * as a character array, using this constructor is faster than
  16.587 +     * converting the {@code char} array to string and using the
  16.588 +     * {@code BigDecimal(String)} constructor .
  16.589 +     *
  16.590 +     * @param in {@code char} array that is the source of characters.
  16.591 +     * @throws NumberFormatException if {@code in} is not a valid
  16.592 +     *         representation of a {@code BigDecimal}.
  16.593 +     * @since  1.5
  16.594 +     */
  16.595 +    public BigDecimal(char[] in) {
  16.596 +        this(in, 0, in.length);
  16.597 +    }
  16.598 +
  16.599 +    /**
  16.600 +     * Translates a character array representation of a
  16.601 +     * {@code BigDecimal} into a {@code BigDecimal}, accepting the
  16.602 +     * same sequence of characters as the {@link #BigDecimal(String)}
  16.603 +     * constructor and with rounding according to the context
  16.604 +     * settings.
  16.605 +     *
  16.606 +     * <p>Note that if the sequence of characters is already available
  16.607 +     * as a character array, using this constructor is faster than
  16.608 +     * converting the {@code char} array to string and using the
  16.609 +     * {@code BigDecimal(String)} constructor .
  16.610 +     *
  16.611 +     * @param  in {@code char} array that is the source of characters.
  16.612 +     * @param  mc the context to use.
  16.613 +     * @throws ArithmeticException if the result is inexact but the
  16.614 +     *         rounding mode is {@code UNNECESSARY}.
  16.615 +     * @throws NumberFormatException if {@code in} is not a valid
  16.616 +     *         representation of a {@code BigDecimal}.
  16.617 +     * @since  1.5
  16.618 +     */
  16.619 +    public BigDecimal(char[] in, MathContext mc) {
  16.620 +        this(in, 0, in.length, mc);
  16.621 +    }
  16.622 +
  16.623 +    /**
  16.624 +     * Translates the string representation of a {@code BigDecimal}
  16.625 +     * into a {@code BigDecimal}.  The string representation consists
  16.626 +     * of an optional sign, {@code '+'} (<tt> '&#92;u002B'</tt>) or
  16.627 +     * {@code '-'} (<tt>'&#92;u002D'</tt>), followed by a sequence of
  16.628 +     * zero or more decimal digits ("the integer"), optionally
  16.629 +     * followed by a fraction, optionally followed by an exponent.
  16.630 +     *
  16.631 +     * <p>The fraction consists of a decimal point followed by zero
  16.632 +     * or more decimal digits.  The string must contain at least one
  16.633 +     * digit in either the integer or the fraction.  The number formed
  16.634 +     * by the sign, the integer and the fraction is referred to as the
  16.635 +     * <i>significand</i>.
  16.636 +     *
  16.637 +     * <p>The exponent consists of the character {@code 'e'}
  16.638 +     * (<tt>'&#92;u0065'</tt>) or {@code 'E'} (<tt>'&#92;u0045'</tt>)
  16.639 +     * followed by one or more decimal digits.  The value of the
  16.640 +     * exponent must lie between -{@link Integer#MAX_VALUE} ({@link
  16.641 +     * Integer#MIN_VALUE}+1) and {@link Integer#MAX_VALUE}, inclusive.
  16.642 +     *
  16.643 +     * <p>More formally, the strings this constructor accepts are
  16.644 +     * described by the following grammar:
  16.645 +     * <blockquote>
  16.646 +     * <dl>
  16.647 +     * <dt><i>BigDecimalString:</i>
  16.648 +     * <dd><i>Sign<sub>opt</sub> Significand Exponent<sub>opt</sub></i>
  16.649 +     * <p>
  16.650 +     * <dt><i>Sign:</i>
  16.651 +     * <dd>{@code +}
  16.652 +     * <dd>{@code -}
  16.653 +     * <p>
  16.654 +     * <dt><i>Significand:</i>
  16.655 +     * <dd><i>IntegerPart</i> {@code .} <i>FractionPart<sub>opt</sub></i>
  16.656 +     * <dd>{@code .} <i>FractionPart</i>
  16.657 +     * <dd><i>IntegerPart</i>
  16.658 +     * <p>
  16.659 +     * <dt><i>IntegerPart:</i>
  16.660 +     * <dd><i>Digits</i>
  16.661 +     * <p>
  16.662 +     * <dt><i>FractionPart:</i>
  16.663 +     * <dd><i>Digits</i>
  16.664 +     * <p>
  16.665 +     * <dt><i>Exponent:</i>
  16.666 +     * <dd><i>ExponentIndicator SignedInteger</i>
  16.667 +     * <p>
  16.668 +     * <dt><i>ExponentIndicator:</i>
  16.669 +     * <dd>{@code e}
  16.670 +     * <dd>{@code E}
  16.671 +     * <p>
  16.672 +     * <dt><i>SignedInteger:</i>
  16.673 +     * <dd><i>Sign<sub>opt</sub> Digits</i>
  16.674 +     * <p>
  16.675 +     * <dt><i>Digits:</i>
  16.676 +     * <dd><i>Digit</i>
  16.677 +     * <dd><i>Digits Digit</i>
  16.678 +     * <p>
  16.679 +     * <dt><i>Digit:</i>
  16.680 +     * <dd>any character for which {@link Character#isDigit}
  16.681 +     * returns {@code true}, including 0, 1, 2 ...
  16.682 +     * </dl>
  16.683 +     * </blockquote>
  16.684 +     *
  16.685 +     * <p>The scale of the returned {@code BigDecimal} will be the
  16.686 +     * number of digits in the fraction, or zero if the string
  16.687 +     * contains no decimal point, subject to adjustment for any
  16.688 +     * exponent; if the string contains an exponent, the exponent is
  16.689 +     * subtracted from the scale.  The value of the resulting scale
  16.690 +     * must lie between {@code Integer.MIN_VALUE} and
  16.691 +     * {@code Integer.MAX_VALUE}, inclusive.
  16.692 +     *
  16.693 +     * <p>The character-to-digit mapping is provided by {@link
  16.694 +     * java.lang.Character#digit} set to convert to radix 10.  The
  16.695 +     * String may not contain any extraneous characters (whitespace,
  16.696 +     * for example).
  16.697 +     *
  16.698 +     * <p><b>Examples:</b><br>
  16.699 +     * The value of the returned {@code BigDecimal} is equal to
  16.700 +     * <i>significand</i> &times; 10<sup>&nbsp;<i>exponent</i></sup>.
  16.701 +     * For each string on the left, the resulting representation
  16.702 +     * [{@code BigInteger}, {@code scale}] is shown on the right.
  16.703 +     * <pre>
  16.704 +     * "0"            [0,0]
  16.705 +     * "0.00"         [0,2]
  16.706 +     * "123"          [123,0]
  16.707 +     * "-123"         [-123,0]
  16.708 +     * "1.23E3"       [123,-1]
  16.709 +     * "1.23E+3"      [123,-1]
  16.710 +     * "12.3E+7"      [123,-6]
  16.711 +     * "12.0"         [120,1]
  16.712 +     * "12.3"         [123,1]
  16.713 +     * "0.00123"      [123,5]
  16.714 +     * "-1.23E-12"    [-123,14]
  16.715 +     * "1234.5E-4"    [12345,5]
  16.716 +     * "0E+7"         [0,-7]