changeset 4308:5b05f8d1c0e5

4884238: Adds java.nio.charset.StandardCharset to provide static final constants for the standard charsets. Reviewed-by: alanb, sherman, darcy
author mduigou
date Tue, 26 Apr 2011 14:25:42 -0700
parents 147da2c8b749
children bf2a12c1ffe3
files src/share/classes/java/nio/charset/Charset.java src/share/classes/java/nio/charset/StandardCharset.java src/share/classes/java/nio/file/Path.java src/share/classes/java/util/zip/ZipCoder.java src/share/classes/java/util/zip/ZipFile.java src/share/classes/java/util/zip/ZipInputStream.java src/share/classes/java/util/zip/ZipOutputStream.java src/share/classes/sun/awt/FontDescriptor.java test/java/nio/charset/StandardCharset/Standard.java
diffstat 9 files changed, 175 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/nio/charset/Charset.java	Tue Apr 26 10:35:06 2011 -0700
+++ b/src/share/classes/java/nio/charset/Charset.java	Tue Apr 26 14:25:42 2011 -0700
@@ -143,6 +143,8 @@
  *
  * <h4>Standard charsets</h4>
  *
+ * <a name="standard">
+ *
  * <p> Every implementation of the Java platform is required to support the
  * following standard charsets.  Consult the release documentation for your
  * implementation to see if any other charsets are supported.  The behavior
@@ -213,6 +215,8 @@
  * determined during virtual-machine startup and typically depends upon the
  * locale and charset being used by the underlying operating system. </p>
  *
+ * <p>The {@link StandardCharset} class defines constants for each of the
+ * standard charsets.
  *
  * <h4>Terminology</h4>
  *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/java/nio/charset/StandardCharset.java	Tue Apr 26 14:25:42 2011 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package java.nio.charset;
+
+/**
+ * Constant definitions for the standard {@link Charset Charsets}. These
+ * charsets are guaranteed to be available on every implementation of the Java
+ * platform.
+ *
+ * @see <a href="Charset#standard">Standard Charsets</a>
+ * @since 1.7
+ */
+public final class StandardCharset {
+
+    private StandardCharset() {
+        throw new AssertionError("No java.nio.charset.StandardCharset instances for you!");
+    }
+    /**
+     * Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the
+     * Unicode character set
+     */
+    public static final Charset US_ASCII = Charset.forName("US-ASCII");
+    /**
+     * ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
+     */
+    public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
+    /**
+     * Eight-bit UCS Transformation Format
+     */
+    public static final Charset UTF_8 = Charset.forName("UTF-8");
+    /**
+     * Sixteen-bit UCS Transformation Format, big-endian byte order
+     */
+    public static final Charset UTF_16BE = Charset.forName("UTF-16BE");
+    /**
+     * Sixteen-bit UCS Transformation Format, little-endian byte order
+     */
+    public static final Charset UTF_16LE = Charset.forName("UTF-16LE");
+    /**
+     * Sixteen-bit UCS Transformation Format, byte order identified by an
+     * optional byte-order mark
+     */
+    public static final Charset UTF_16 = Charset.forName("UTF-16");
+}
--- a/src/share/classes/java/nio/file/Path.java	Tue Apr 26 10:35:06 2011 -0700
+++ b/src/share/classes/java/nio/file/Path.java	Tue Apr 26 14:25:42 2011 -0700
@@ -72,7 +72,7 @@
  * directory and is UTF-8 encoded.
  * <pre>
  *     Path path = FileSystems.getDefault().getPath("logs", "access.log");
- *     BufferReader reader = Files.newBufferedReader(path, Charset.forName("UTF-8"));
+ *     BufferReader reader = Files.newBufferedReader(path, StandardCharset.UTF_8);
  * </pre>
  *
  * <a name="interop"><h4>Interoperability</h4></a>
--- a/src/share/classes/java/util/zip/ZipCoder.java	Tue Apr 26 10:35:06 2011 -0700
+++ b/src/share/classes/java/util/zip/ZipCoder.java	Tue Apr 26 14:25:42 2011 -0700
@@ -28,6 +28,7 @@
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharset;
 import java.nio.charset.CharsetDecoder;
 import java.nio.charset.CharsetEncoder;
 import java.nio.charset.CoderResult;
@@ -87,7 +88,7 @@
         if (isutf8)
             return getBytes(s);
         if (utf8 == null)
-            utf8 = new ZipCoder(Charset.forName("UTF-8"));
+            utf8 = new ZipCoder(StandardCharset.UTF_8);
         return utf8.getBytes(s);
     }
 
@@ -96,7 +97,7 @@
         if (isutf8)
             return toString(ba, len);
         if (utf8 == null)
-            utf8 = new ZipCoder(Charset.forName("UTF-8"));
+            utf8 = new ZipCoder(StandardCharset.UTF_8);
         return utf8.toString(ba, len);
     }
 
@@ -112,7 +113,7 @@
 
     private ZipCoder(Charset cs) {
         this.cs = cs;
-        this.isutf8 = cs.name().equals("UTF-8");
+        this.isutf8 = cs.name().equals(StandardCharset.UTF_8.name());
     }
 
     static ZipCoder get(Charset charset) {
--- a/src/share/classes/java/util/zip/ZipFile.java	Tue Apr 26 10:35:06 2011 -0700
+++ b/src/share/classes/java/util/zip/ZipFile.java	Tue Apr 26 14:25:42 2011 -0700
@@ -31,6 +31,7 @@
 import java.io.EOFException;
 import java.io.File;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharset;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.Enumeration;
@@ -140,7 +141,7 @@
      * @since 1.3
      */
     public ZipFile(File file, int mode) throws IOException {
-        this(file, mode, Charset.forName("UTF-8"));
+        this(file, mode, StandardCharset.UTF_8);
     }
 
     /**
--- a/src/share/classes/java/util/zip/ZipInputStream.java	Tue Apr 26 10:35:06 2011 -0700
+++ b/src/share/classes/java/util/zip/ZipInputStream.java	Tue Apr 26 14:25:42 2011 -0700
@@ -30,6 +30,7 @@
 import java.io.EOFException;
 import java.io.PushbackInputStream;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharset;
 import static java.util.zip.ZipConstants64.*;
 
 /**
@@ -75,7 +76,7 @@
      * @param in the actual input stream
      */
     public ZipInputStream(InputStream in) {
-        this(in, Charset.forName("UTF-8"));
+        this(in, StandardCharset.UTF_8);
     }
 
     /**
--- a/src/share/classes/java/util/zip/ZipOutputStream.java	Tue Apr 26 10:35:06 2011 -0700
+++ b/src/share/classes/java/util/zip/ZipOutputStream.java	Tue Apr 26 14:25:42 2011 -0700
@@ -28,6 +28,7 @@
 import java.io.OutputStream;
 import java.io.IOException;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharset;
 import java.util.Vector;
 import java.util.HashSet;
 import static java.util.zip.ZipConstants64.*;
@@ -100,7 +101,7 @@
      * @param out the actual output stream
      */
     public ZipOutputStream(OutputStream out) {
-        this(out, Charset.forName("UTF-8"));
+        this(out, StandardCharset.UTF_8);
     }
 
     /**
--- a/src/share/classes/sun/awt/FontDescriptor.java	Tue Apr 26 10:35:06 2011 -0700
+++ b/src/share/classes/sun/awt/FontDescriptor.java	Tue Apr 26 14:25:42 2011 -0700
@@ -26,6 +26,7 @@
 
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetEncoder;
+import java.nio.charset.StandardCharset;
 import sun.nio.cs.HistoricallyNamedCharset;
 
 public class FontDescriptor implements Cloneable {
@@ -104,8 +105,8 @@
         if (useUnicode && unicodeEncoder == null) {
             try {
                 this.unicodeEncoder = isLE?
-                    Charset.forName("UTF_16LE").newEncoder():
-                    Charset.forName("UTF_16BE").newEncoder();
+                    StandardCharset.UTF_16LE.newEncoder():
+                    StandardCharset.UTF_16BE.newEncoder();
             } catch (IllegalArgumentException x) {}
         }
         return useUnicode;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/nio/charset/StandardCharset/Standard.java	Tue Apr 26 14:25:42 2011 -0700
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 4884238
+ * @summary Test standard charset name constants.
+ * @author Mike Duigou
+ * @run main Standard
+ */
+
+import java.nio.charset.*;
+
+public class Standard {
+
+    public static void realMain(String[] args) {
+        check(StandardCharset.US_ASCII instanceof Charset);
+        check(StandardCharset.ISO_8859_1 instanceof Charset);
+        check(StandardCharset.UTF_8 instanceof Charset);
+        check(StandardCharset.UTF_16BE instanceof Charset);
+        check(StandardCharset.UTF_16LE instanceof Charset);
+        check(StandardCharset.UTF_16 instanceof Charset);
+
+        check("US-ASCII".equals(StandardCharset.US_ASCII.name());
+        check("ISO-8859-1".equals(StandardCharset.ISO_8859_1.name());
+        check("UTF-8".equals(StandardCharset.UTF_8.name());
+        check("UTF-16BE".equals(StandardCharset.UTF_16BE.name());
+        check("UTF-16LE".equals(StandardCharset.UTF_16LE.name());
+        check("UTF-16".equals(StandardCharset.UTF_16.name());
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() { passed++; }
+    static void fail() { failed++; Thread.dumpStack(); }
+    static void fail(String msg) { System.out.println(msg); fail(); }
+    static void unexpected(Throwable t) { failed++; t.printStackTrace(); }
+    static void check(boolean cond) { if (cond) pass(); else fail(); }
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else {System.out.println(x + " not equal to " + y); fail();}}
+    static void equal2(Object x, Object y) {equal(x, y); equal(y, x);}
+    public static void main(String[] args) throws Throwable {
+        try { realMain(args); } catch (Throwable t) { unexpected(t); }
+
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new Exception("Some tests failed");
+    }
+    private static abstract class Fun {abstract void f() throws Throwable;}
+    private static void THROWS(Class<? extends Throwable> k, Fun... fs) {
+          for (Fun f : fs)
+              try { f.f(); fail("Expected " + k.getName() + " not thrown"); }
+              catch (Throwable t) {
+                  if (k.isAssignableFrom(t.getClass())) pass();
+                  else unexpected(t);}}
+    static byte[] serializedForm(Object obj) {
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            new ObjectOutputStream(baos).writeObject(obj);
+            return baos.toByteArray();
+        } catch (IOException e) { throw new Error(e); }}
+    static Object readObject(byte[] bytes)
+        throws IOException, ClassNotFoundException {
+        InputStream is = new ByteArrayInputStream(bytes);
+        return new ObjectInputStream(is).readObject();}
+    @SuppressWarnings("unchecked")
+    static <T> T serialClone(T obj) {
+        try { return (T) readObject(serializedForm(obj)); }
+        catch (Exception e) { throw new Error(e); }}
+
+}